Quirky SELECT aus Excel-Datei über OleDbDataAdapter-Methode (C #)
-
29-09-2019 - |
Frage
Ich habe eine Excel-Datei in dieser Form bekommen:
Column 1 Column 2 Column 3
data1 data2
data1 data2
data1 data2
data1 data2
data1 data2 data3
Das heißt, ist die ganze Spalte 3 leer, bis auf die letzte Zeile. Ich bin Zugriff auf die Excel-Datei über OleDbDataAdapter, eine Datatable Rückkehr: hier der Code ist.
query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;
Der Punkt ist in diesem Szenario meines Code eine Datentabelle mit nur Spalte 1 und Spalte 2.
zurück
Meine Vermutung ist, dass JET-Engine versucht herzuleiten Spaltentyp vom Typ der ersten Zelle in jeder Spalte; wobei der erste Wert Null, wird die gesamte Spalte ignoriert.
Ich habe versucht, in Nullen und dieser Code zu füllen ist tatsächlich alle drei Säulen der Rückkehr; dies ist natürlich die am wenigsten bevorzugte Lösung, weil ich eine große Anzahl von kleinen Dateien zu verarbeiten haben.
Umkehren der Auswahlbereich (ab, das heißt „A1: C5“ bis „C5: A1“) funktioniert auch nicht.
Ich suche nach etwas eleganter.
Ich habe gefunden, schon ein paar Beiträge Typenkonflikt (varchar Zellen in int Spalten und umgekehrt) zu diskutieren, aber haben eigentlich nichts im Zusammenhang mit dieser einer gefunden.
Vielen Dank für das Lesen!
Bearbeiten
Weird-Verhalten wieder. Ich habe auf meist Excel 2003 .xls-Dateien zu arbeiten, aber da diese Frage dachte ich beanwortet kann ich meinen Code gegen Excel 2007 .xslx Dateien testen. Die Verbindungszeichenfolge ist die folgende:
string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
Ich erhalte die „Externe Tabelle ist nicht im erwarteten Format“ Ausnahme, die ich rechne damit, die Standard Ausnahme ist, wenn ein Versionskonflikt zwischen ACE / JET ist und die Datei geöffnet werden kann.
Die Zeichenfolge
Provider=Microsoft.ACE.OLEDB.12.0
bedeutet, dass ich verwende die neueste Version von OLEDB, nahm ich einen kurzen Blick um und diese Version verwendet wird, überall gibt es Bedarf an zu XLSX-Dateien verbinden.
Ich habe nur mit einem Vanille-Anbieter versucht (nur Excel 12.0, ohne IMEX noch HDR), aber ich bekomme die gleiche Ausnahme.
Ich bin auf .NET 2.0.50727 SP2, vielleicht Zeit für ein Upgrade?
Lösung
neu erstellt ich Ihre Situation und im Anschluss an die 3 Spalten korrekt zurückgegeben. Das heißt, die ersten beiden Spalten vollständig mit Daten gefüllt und die dritten enthalten null bis zur letzten Zeile, die Daten hatte.
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);
Beachten Sie ich den Access Database Engine(ACE)
Provider, die den alten Joint Engine Technology(JET)
Anbieter erfolgreich war, und meine Ergebnisse ein Verhalten Unterschied zwischen den beiden darstellen. Natürlich, wenn Sie nicht bereits verwenden schlage ich die ACE
Provider wie ich Microsoft zu glauben würde. Beachten Sie auch, die Verbindung des Extended Properties
:
"HDR = Ja;" zeigt an, dass die erste Zeile enthält Spaltennamen, keine Daten. "HDR = No;" zeigt das Gegenteil.
"IMEX = 1;" sagt dem Fahrer immer lesen „vermischte“ (Zahlen, Daten, Strings usw.) Datenspalten als Text. Beachten Sie, dass diese Option auswirken könnten Blatt Schreibzugriff negativ Excel.
Lassen Sie mich wissen, ob das hilft.