2010-04-29 24 views
4

J'utilise le pilote ACE OLEDB pour lire à partir d'une feuille de calcul Excel 2007, et je constate que tout '.' le caractère dans les noms de colonne est converti en caractère '#'. Par exemple, si je suit dans une feuille de calcul:Comment éviter que OLEDB convertisse "." S en "#" dans les noms de colonnes?

Name  Amt. Due  Due Date 
Andrew  12.50   4/1/2010 
Brian  20.00   4/12/2010 
Charlie  1000.00   6/30/2010 

le nom de la deuxième colonne lirait comme suit: « Amt # En raison » lorsqu'il est lu avec le code suivant:

OleDbConnection connection = new OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=MyFile.xlsx; " + 
    "Extended Properties=\"Excel 12.0 Xml;HDR=YES;FMT=Delimited;IMEX=1\""); 
OldDbCommand command = new OleDbCommand("SELECT * FROM MyTable", connection); 
OleDbReader dataReader = command.ExecuteReader(); 
System.Console.WriteLine(dataReader.GetName(1)); 

Je J'ai lu toute la documentation que je peux trouver et je n'ai rien trouvé qui mentionne même que cela arrivera. Quelqu'un at-il déjà rencontré cela? Existe-t-il un moyen de résoudre ce problème?

+0

Cela semble être une autre variante de http://stackoverflow.com/questions/1088394/why-is-the-column-name-from -a-csv-fichier-different-than-its-datatable –

Répondre

1

Voir ceci OleDBAdapter Excel QA J'ai posté via le débordement de la pile.

J'ai créé un classeur .xlsx en Excel avec vos données, puis j'ai changé le OleDbConnection et il a bien lu vos données.

string sql = "SELECT F1, F2, F3 FROM [sheet1$] WHERE F1 IS NOT NULL"; 

OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + PrmPathExcelFile + @";Extended Properties=""Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text"""); 

écriture de données sur la console:

Name Amt. Due Due Date 
Andrew 12.50 4/1/2010 
Brian 20.00 4/12/2010 
4

La période est en cours de modification à # car . n'est pas autorisé dans un nom de colonne. Si le nom de la colonne est uniquement utilisé en interne, cela n'a pas d'importance du tout, mais puisque vous posez la question, je suppose que le nom de la colonne apparaît dans un rapport ou une grille quelque part avec le #.

Si vous ne savez pas à l'avance quelles colonnes vont contenir ., puis partout le nom de colonne est affiché, vous pouvez faire label1.Text = colname.Replace("#", ".") et nous espérons qu'aucun des autres noms de colonnes contient #. Il peut y avoir un moyen d'obtenir OleDb pour remplacer . avec un caractère plus obscur et moins fréquent (comme | ou ~) qui vous laisserait Replace avec moins de peur de copier un autre nom de colonne.