Mehrere Excel-Sheets in DataTable

CShark

Mitglied
Guten Tag Meister der Tutorials!

Wie viele die hier schreiben habe ich ich Problem....

Alsooo....
Ich habe ein Programm das mehrere Excel(xls) Dateien zu einer zusammenfasst.
Dazu lade ich die Daten mittels OleDb in eine DataTable.
Dann schreibe ich die Daten in eine xml und diese wandle ich in eine .xls um.

Das Problem ist nun, dass wenn in Spalten nur Zahlen sind, die erste Reihe nicht übernommen wird, also wenn in Spalte A nur Zahlen sind dann fehlt in der Zelle A1 der Inhalt.

Dieser fehler entsteht schon an der Stelle, an der die Daten in die DataTable geschrieben werden. Dort hat diese Zelle den value DBNull, obwohl sie gar nicht leer ist!
Es liegt auch nicht an der Datei, da dies bei mehreren der Fall ist.

Gibt es jemanden der mir helfen kann?

Hier ist der Code der die xls in die DataTable schreibt.:

Code:
    Private Function GetExcelDataSet(ByVal excelFile As String, ByVal headers As Boolean) As DataSet
        Dim ds As New DataSet()

        Dim con As New OleDbConnection()
        con.ConnectionString = "Data Source=" & excelFile & ";Provider=Microsoft.Jet.OLEDB.4.0;"

        If headers Then
            con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=Yes"""
        Else
            con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=No"""
        End If

        con.Open()
        Dim sheets As DataTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})

        For Each sheet As DataRow In sheets.Rows
            Dim tableName As String = sheet("Table_Name").ToString()
            Dim sql As String = "SELECT * FROM [" & tableName & "]"
            Dim adap As New OleDbDataAdapter(sql, con)
            adap.Fill(ds, "DBASE")
            If zaehler > 0 Then
                ds.Tables("DBASE").Rows.RemoveAt(0)
            End If
        Next

        con.Close()
        Return ds
    End Function

Und natürlich:

Vielen Dank für euer Intresse wenn ihr es lest und noch mehr Dank wenn ihr mir helft :)

Ok mitlerweile habe ich herausgefunden, dass es daran liegt da in der Spalte mehrere Dateitypen vorkommen.
Bei dem Select guckt er dann welcher Datentyp am meisten vertreten ist und alle Zellen die einen anderen Typ enthalten bekommen den Wert System.DBNull...

So wie ich das verstanden habe muss ich bei dem Select den Dateitypen den er nehmen soll vorgeben.... wie weiß ich noch nicht.. ich halte euch auf dem laufenden.
 
Zuletzt bearbeitet:

CShark

Mitglied
Hey hey,
naja also ich habe schon eine Lösung gefunden, aber di eist nicht ganz "sauber"...
Ich lese die .xls ohne die Header aus.
Die Überschriften hole ich mir dann indem ich die .xls in eine .csv umschreibe.
Alle Daten der ganzen .xls Dateien sind dann in der DataTable und werden zusammen mit den Überschriften weggeschrieben.

MfG,

CShark
 

CShark

Mitglied
Heureka!
Soooo jetzt habe ich das ganze endgültig gelöst!

Nochmal Danke VScan durch dich hab ich mein Problem richtig und besser lösen können.
Ich schreibe jetzt nichts mehr in CSVs oder sonstiges.

Das Zusammenfassen funktioniert, da das umschrieben in die CSVs wegfällt, auch nur noch einen Bruchteil des vorherigen und die Überschriften sind trotzdem dabei. Die längste Zeit beansprucht immernoch das Schreiben der Datensätze in die neue Datei, das habe ich denke ich aber auch optimiert... viel mehr geht da glaube ich nicht.

Ein kleines Beispiel:
Ich habe Excel Dateien mit insgesamt 393.193 Datensätzen zusammengefügt und dafür 11:41,340 Minuten gebraucht.
 
Zuletzt bearbeitet: