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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top