Question

J'ai un fichier Excel sous cette forme:

Column 1    Column 2    Column 3  
 data1        data2    
 data1        data2  
 data1        data2  
 data1        data2  
 data1        data2       data3  

C'est, toute la colonne 3 est vide, sauf pour la dernière ligne. J'accède au fichier Excel via OleDbDataAdapter, renvoyant un DataTable: voici le code.

query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;

Le point est, dans ce scénario mon code renvoie un DataTable avec juste la colonne 1 et colonne 2.
Je suppose que le moteur JET essaie de type colonne déduisent par le type de la première cellule dans chaque colonne; étant la première valeur null, toute la colonne est ignorée.
J'ai essayé de remplir des zéros et ce code est en fait retournais les trois colonnes; ceci est évidemment la solution la moins préférable parce que je dois traiter un grand nombre de petits fichiers.
Inversion de la plage de sélection (à partir de, à savoir « A1: C5 » à « C5: A1 ») ne fonctionne pas non plus. Je cherche quelque chose de plus élégant.
Je l'ai déjà trouvé quelques messages discuter incompatibilité de type (cellules varchar dans les colonnes int et vice versa), mais en réalité ne l'ai pas trouvé quoi que ce soit lié à celui-ci.
Merci d'avoir lu!

modifier

Comportement étrange de nouveau. Je dois travailler sur la plupart des fichiers .xls Excel 2003, mais étant donné que cette question a été répondu que je pensais que je pouvais tester mon code contre les fichiers Excel 2007 .xslx. La chaîne de connexion est la suivante:

string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";

je reçois la « table externe n'est pas dans le format attendu » que je pense d'exception est l'exception standard quand il y a une incompatibilité de version entre ACE / JET et le fichier en cours d'ouverture.

La chaîne

Provider=Microsoft.ACE.OLEDB.12.0 

signifie que je suis la version la plus utiliserai récente de OLEDB, je pris un coup d'oeil rapide autour et cette version est utilisée partout où il est nécessaire de se connecter à .xlsx.
Je l'ai essayé avec juste un fournisseur de vanille (juste Excel 12.0, sans IMEX ni HDR) mais je reçois la même exception.
Je suis sur le Service Pack 2 .NET 2.0.50727, peut-être le temps de mise à niveau?

Était-ce utile?

La solution

Je recréée votre situation et à la suite retourné correctement les 3 colonnes. Autrement dit, les deux premières colonnes entièrement remplis avec les données et le troisième contenant nul jusqu'à ce que la dernière rangée, qui avait données.

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";
DataTable dt = new DataTable();
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);

adapter.Fill(dt);

Remarque je le fournisseur de Access Database Engine(ACE), qui a succédé à l'ancien fournisseur de Joint Engine Technology(JET), et mes résultats peuvent représenter une différence de comportement entre les deux. Bien sûr, si vous n'êtes pas déjà utilisé, je suggère d'utiliser le fournisseur de ACE comme je crois que Microsoft serait aussi. Notez également la Extended Properties de la connexion:

  

"HDR = Oui;" indique que le premier   ligne contient columnNames, pas de données.   "HDR = No;" indique le contraire.

     

"IMEX = 1;" dit au conducteur de toujours   lire "entremêlées" (chiffres, dates,   chaînes, etc.) des colonnes de données sous forme de texte.   Notez que cette option pourrait affecter   feuille Excel écriture négative d'accès.

Laissez-moi savoir si cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top