2009-05-22 9 views
11

ich die OleDbConnection-Klasse bin mit zum Abrufen von Daten aus einer Excel-Arbeitsmappe 2000/2003: esExcel-Zelle-Werte werden durch OLEDB-Provider abgeschnitten

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
          "Data Source=" + filename + ";" + 
          "Extended Properties=\"Excel 8.0;IMEX=1\";"; 

OleDbConnection connection = new OleDbConnection(connectionString); 
connection.Open(); 

// code to get table name from schema omitted 

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection); 
var myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "ExcelInfo"); 

Nun stellt sich heraus, dass die Zellen in dem Arbeitsblatt mit einer Länge größer als 255 Zeichen werden abgeschnitten. Ist das eine Einschränkung im Microsoft.Jet.OLEDB-Provider, oder kann ich etwas dagegen tun?

Jeder?

Antwort

17

Der OLEDB-Provider für Excel versucht, die DataTypes, die auf den ersten 8 Datenzeilen basieren, automatisch zu ermitteln. Dies kann mit der Eigenschaft HDR = Yes/No in der Verbindungszeichenfolge festgelegt werden. Darüber hinaus gibt es mehrere Typen, die auf Textspalten angewendet werden können. Der Memo-Typ enthält mehr als 255 Zeichen. Wenn also keine der ersten 8 Zeilen das hat, wird der Datentyp falsch eingestellt.

Die Art und Weise, dies zu ändern ist durch eine Registrierungseinstellung genannt TypeGuessRows ändern, wie hier beschrieben: Microsoft Support

HINWEIS: Der gültige Wertebereich für die TypeGuessRows Taste 0 bis 16. Jedoch ist, wenn der Wert 0 Die Anzahl der gescannten Quellzeilen beträgt 16384. Wenn Sie also eine sehr große Datei haben, stellen Sie sicher, dass die größten Zeilen zuerst angezeigt werden.

+1

Dank. Es ist eine etwas hässliche Lösung, da mein Installer die Registrierung des Benutzers ändern muss, aber ich gehe davon aus, dass es funktionieren wird. Solange ein Administrator das Installationsprogramm ausführt. –

+1

Ich verstehe nicht, Microsofts Vorschlag hier/wenn Sie es in 16 ändern, nicht nur die ersten 16 Zeilen überprüfen? – leora

+1

@ooo Wenn Sie es in 0 ändern, werden alle Zeilen gescannt. Seien Sie jedoch vorsichtig, da dies bei größeren Tabellen Auswirkungen auf die Leistung haben kann. – rmoore

1

Versuchen Sie diese OleDBAdapter Excel QA ich über den Stack-Überlauf gebucht.

ich eine Arbeitsblatt-Zelle aufgefüllt (Zeilen [0] [4]) w/445 Zeichen und es funktionierte gut ... diese an das Ende des Codes für die ouput

// DataSet:   
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2]; 
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4]; 

string rowZeroColumn3 = row0Col3.ToString(); 
string rowZeroColumn4 = row0Col4.ToString(); 

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);   
Verwandte Themen