Bizarre SÉLECTIONNEZ à partir d'un fichier Excel via OleDbDataAdapter méthode (C#)
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
Qui est, l'ensemble de la Colonne 3 est vide à l'exception de la dernière ligne.
Je suis accéder au fichier Excel via OleDbDataAdapter, de retour d'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 une DataTable avec juste la Colonne 1 et la Colonne 2.
Ma conjecture est que le moteur JET essaie d'en déduire le type de colonne par le type de la première cellule de chaque colonne; le fait d'être la première valeur null, la colonne entière est ignoré.
J'ai essayé de le remplir de zéros et ce code est en fait le retour de tous les trois colonnes; c'est évidemment la moins bonne solution parce que j'ai à traiter un grand nombre de petits fichiers.
Inverser la sélection de la gamme (à partir de la, c'est à dire "A1:C5" à "C5:A1" ) ne fonctionne pas non plus.
Je suis à la recherche de quelque chose de plus élégant.
J'ai déjà trouvé un couple de billets à propos d'incompatibilité de type (varchar cellules dans les colonnes int et vice-versa), mais en réalité n'ai pas trouvé quoi que ce soit lié à celui-ci.
Merci pour la lecture!
modifier
Le comportement bizarre de nouveau. Je travail principalement sur Excel 2003 .les fichiers xls, mais depuis que cette question a été répondu, j'ai pensé que je pourrais tester mon code par rapport à Excel 2007 .xslx fichiers.
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 obtenir la "table Externe n'est pas dans le format attendu" l'exception qui je pense est la norme exception lorsqu'il y a une incompatibilité de version entre ACE/JET et le fichier ouvert.
La chaîne
Provider=Microsoft.ACE.OLEDB.12.0
signifie que je suis en utilisant la version la plus récente de OLEDB, j'ai pris un coup d'oeil rapide autour de et cette version est utilisé partout où il est nécessaire de se connecter à .fichiers xlsx.
J'ai essayé avec juste un fournisseur de vanille ( Excel 12.0, sans IMEX ni HDR ) mais j'obtiens la même exception.
Je suis sur .NET 2.0.50727 SP2, peut-être temps de mettre à niveau?
- Donc, il n'y a pas les en-Têtes de colonnes dans Excel? Et avez-vous essayé la société IMEX commutateur sur la connexion?
- Il y a des titres, mais je suis la sélection sur la partie de la table qui ne contient que les données en évitant horizontale et verticale des en-têtes.
Vous devez vous connecter pour publier un commentaire.
J'ai recréé votre situation et à la suite retourné les 3 colonnes correctement. Qui est, les deux premières colonnes entièrement rempli avec des données et la troisième contenant la valeur null jusqu'à la dernière ligne, qui avait données.
Note j'ai utilisé le
Access Database Engine(ACE)
fournisseur, qui a succédé à l'ancienJoint Engine Technology(JET)
fournisseur, et mes résultats peut représenter une différence de comportement entre les deux. Bien sûr, si vous ne l'êtes pas déjà, je vous suggérons d'utiliser leACE
fournisseur comme je le crois, Microsoft serait trop. Aussi, la note de la connexionExtended Properties
:Laissez-moi savoir si cela aide.