Blog Home  Home Feed your aggregator (RSS 2.0)  
artiso Blog - Import von gemischten Excel-Spalten über OLEDB
Neues rund um's Thema .Net
 
 Sunday, January 14, 2007

Mit OleDB lassen sich sehr einfach Excel-Dateien lesen. Man macht sich einen Connectionstring der ungefähr so aussieht:

Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ExcelFileName & ";Extended Properties='Excel 8.0;HDR=No;"

Nun kann man eine ganz normale Connection öffnen und wie gewohnt z.B. über ein Select-Statement ein DataSet befüllen.

Dim conn As OleDbConnection = New OleDbConnection(connectionString)
conn.Open()
Dim dt As DataTable = New DataTable()
Dim oleDbDataAdapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM [Tabelle1]", conn)
oleDbDataAdapter.Fill(dt)
oleDbDataAdapter.Dispose()
oleDbDataAdapter =
Nothing
conn.Close()

Das Problem ist dabei, wenn in Excel z.B. Integer und Textwerte in einer Spalte gemischt stehen und die Integerwerte dabei überwiegen, wird diese Spalte als Integer angelegt und die Textwerte stehen im Dataset dann als NULL. Das kann man umgehen, wenn man am Connectionstring den Parameter IMEX=1 anhängt. Damit wird ein "ImportMixedTypes"-Mode aktiviert, der gemischte Spalten immer als Text interpretiert.

Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Me.tbImportdatei.Text & ";Extended Properties='Excel 8.0;HDR=No;IMEX=1'"

Das Problem bei der ganzen Sache ist nur, dass nun standardmäßig die ersten 8 Zeilen geprüft werden. Sind diese alle Integers, wird die Saplte auch als Integer definiert, auch wenn weiter unten noch Textwerte kommen. Man findet hier an verschiedenen Stellen den Hinweis auf einen weiteren Parameter MaxScanRows. Dieser scheint aber nicht zu funktionieren, wie man auch aus diesem MSDN-Artikel ersehen kann. Statt dessen muss man die Einstellung in der Registry vornehmen, wenn man eine andere Anzahl prüfen möchte. Hierzu passt man im Zweig

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

 

den Parameter TypeGuessRows an. Dieser Wert kann auf 1-16 Zeilen eingestellt werden. Ein Wert von 0 bedeutet dass die ersten 16384 Zeilen geprüft werden, um festzustellen, ob der mixed Mode verwendet werden muss oder ob der Datentyp eindeutig bestimmt werden kann. Dass das eigentlich keine saubere Lösung ist, ist klar. Wer will schon seinen Kunden zumuten, in der Registry rumzupfuschen? Aber es scheint im Moment keine bessere Lösung zu geben.

HDR=No bedeutet im obigen Fall übrigens, dass die Excel-Datei keine Header-Zeile hat.

Sunday, January 14, 2007 4:23:55 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
All comments require the approval of the site owner before being displayed.
Name
E-mail
Home page

Comment (HTML not allowed)  

Enter the code shown (prevents robots):

Copyright © 2008 Thomas. All rights reserved.
DasBlog 'Portal' theme by Johnny Hughes.
Pick a theme: