Einlesen von 2003er Excel Dateien mit OLeDBDataAdapter

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Einlesen von 2003er Excel Dateien mit OLeDBDataAdapter

    Hallo zusammen,
    hier im Forum habe ich einen schönen kleinen Code zum Einlesen von 2003er Exceldateien in ein Dataset gefunden, klappt auch wie ne eins.(An der Stelle schon einmal vielen Dank an RodFromGermany)
    Mein Problem ist jetzt, dass das gefüllte Datatable mir die in der Excel Datei hinterlegten Strings nicht mitliefert.
    Mir fehlen die Überschriften meiner Excel Tabelle.
    Wie kann man das Konfigurieren, das die Datatable alle Daten einliest?
    Vielen Dank für jeden Hinweis?
    Die Spaltenüberschriften werden glaub als ComumnName verwendet. Wie man das verhindert weiß ich jedoch nicht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Pinot Teste mal diesen Code, bei mir funktioniert er. Form mit 2 Button und nem DGV:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Using dlg = New OpenFileDialog
    5. dlg.Filter = "Excel|*.xls;*.xlsx"
    6. If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
    7. Return
    8. End If
    9. ' Hier muss eine
    10. Me.LoadExcelFile(dlg.FileName, "*")
    11. End Using
    12. End Sub
    13. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    14. Using dlg = New OpenFileDialog
    15. dlg.Filter = "Excel|*.xls;*.xlsx|All Files|*.*"
    16. If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
    17. Return
    18. End If
    19. Me.LoadExcelFile(dlg.FileName, "Tabelle1")
    20. End Using
    21. End Sub
    22. Private Sub LoadExcelFile(path As String, table As String)
    23. Try
    24. Dim DtSet = New DataSet
    25. Dim connString As String
    26. Dim fi = New IO.FileInfo(path)
    27. Me.Text = fi.Name
    28. If path.ToLower.EndsWith(".xlsx") Then
    29. 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=Excel 12.0;"
    30. connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    31. Else
    32. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
    33. End If
    34. Using myConnection = New OleDb.OleDbConnection(connString)
    35. Dim myCommand As OleDb.OleDbDataAdapter
    36. myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
    37. myCommand.TableMappings.Add("Table", "TestTable")
    38. myCommand.Fill(DtSet)
    39. Me.DataGridView1.DataSource = DtSet.Tables(0)
    40. myConnection.Close()
    41. End Using
    42. Catch ex As Exception
    43. MessageBox.Show(ex.Message)
    44. End Try
    45. End Sub
    46. ''' <summary>
    47. ''' Holt die Daten aus einer Excel-Datei in ein DataSet
    48. ''' </summary>
    49. ''' <param name="excelFile">Pfad zur Excel-Datei</param>
    50. ''' <param name="headers">Haben die Tabellenspalten Überschriften</param>
    51. ''' <returns>DataSet</returns>
    52. ''' <remarks></remarks>
    53. Private Function GetExcelDataSet(ByVal excelFile As String, ByVal headers As Boolean) As DataSet
    54. Dim ds As DataSet = New DataSet()
    55. Dim con As OleDbConnection = New OleDbConnection()
    56. con.ConnectionString = "Data Source=" & excelFile & ";Provider=Microsoft.Jet.OLEDB.4.0;"
    57. If headers Then
    58. con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=Yes"""
    59. Else
    60. con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=No"""
    61. End If
    62. con.Open()
    63. Dim sheets As DataTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
    64. For Each sheet As DataRow In sheets.Rows
    65. Dim tableName As String = sheet("Table_Name").ToString()
    66. Dim sql As String = "SELECT * FROM [" & tableName & "]"
    67. Dim adap As OleDbDataAdapter = New OleDbDataAdapter(sql, con)
    68. adap.Fill(ds, tableName)
    69. Next
    70. con.Close()
    71. Return ds
    72. End Function
    73. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo zusammen,
    vielen Dank für die Rückmeldungen
    @mrMo, ja , Die erste Zeile wird für die Spaltenüberschriften genutzt.In Zeile 2 stehen meine Spaltenüberschriften (MEsswertgrößen= und in der Spalte 3 stehen die Einheiten

    @RodFromGermany. Ich bekomme den Code nicht zum laufen. Der gibt mir die Meldung :
    ex.Message "Das Microsoft Jet-Datenbankmodul konnte das Objekt 'XXX' nicht finden. Stellen Sie sicher, dass das Objekt existiert und dass die Namens- und Pfadangaben richtig eingegeben wurden." String

    "XXX" ist der Tabellenname der Excel Datei.
    Was mach ich verkehrt?

    Pinot schrieb:

    "Das Microsoft Jet-Datenbankmodul konnte das Objekt 'XXX' nicht finden.
    Da hast Du offensichtlich den Code bei Dir reinkopiert, ohne ihn Dir anzusehen geschweige denn zu verstehen. ;(
    Kann es einfach sein, dass bei Dir eine Tabelle des Namens

    RodFromGermany schrieb:

    "Tabelle1"
    nicht vor kommt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ich den Code nicht verstehe, will ich nicht abstreiten, aber angesehen habe ich ihn mir.
    Ich hatte meine ExcelTabelle extra "XXX" genannt und deinen Code für Button2 so angepaßt, dass "XXX" übertragen wird.



    ÄH, sorry, da ist mir noch etwas passiert.
    Beim fröhlichen Editieren im Code habe ich auch das "$" in der SQL Abfrage entfernt. Frag bitte nicht warum.
    Das war es wohl, die DGV wir jetzt gefüllt, aber leider immer noch ohne Strings.

    Das ich mir den Code nicht angesehen habe, kann man wirklich nicht sagen, beim Verstehen sieht die sache anders aus..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pinot“ ()

    Pinot schrieb:

    das 1:1 der Code
    Da Du bereits editiert hast, poste mal den Code und ggf. eine kurze Excel-Tabelle zum Testen (=> ZIP).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die Mühe

    kann ich gerne machen,
    es aber wirklich fast 1:1 der Code, da ich extra noch einmal eine Exceldatei mit "Tabelle1" eingerichtet habe, deinen Code noch mal geladen habe.
    Der einzige Unterschied ist, dass ich DialogResult statt Windows.forms.DialogResult verwendet habe.

    Die DGV wird befüllt, aber ohne strings.
    Also die Tabellenüberschriften fehlen.

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Using dlg = New OpenFileDialog
    5. dlg.Filter = "Excel|*.xls;*.xlsx"
    6. If dlg.ShowDialog() <> DialogResult.OK Then
    7. Return
    8. End If
    9. ' Hier muss eine
    10. Me.LoadExcelFile(dlg.FileName, "*")
    11. End Using
    12. End Sub
    13. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    14. Using dlg = New OpenFileDialog
    15. dlg.Filter = "Excel|*.xls;*.xlsx|All Files|*.*"
    16. If dlg.ShowDialog() <> DialogResult.OK Then
    17. Return
    18. End If
    19. Me.LoadExcelFile(dlg.FileName, "Tabelle1")
    20. End Using
    21. End Sub
    22. Private Sub LoadExcelFile(path As String, table As String)
    23. Try
    24. Dim DtSet = New DataSet
    25. Dim connString As String
    26. Dim fi = New IO.FileInfo(path)
    27. Me.Text = fi.Name
    28. If path.ToLower.EndsWith(".xlsx") Then
    29. 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=Excel 12.0;"
    30. connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    31. Else
    32. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
    33. End If
    34. Using myConnection = New OleDb.OleDbConnection(connString)
    35. Dim myCommand As OleDb.OleDbDataAdapter
    36. myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
    37. myCommand.TableMappings.Add("Table", "TestTable")
    38. myCommand.Fill(DtSet)
    39. Me.DataGridView1.DataSource = DtSet.Tables(0)
    40. myConnection.Close()
    41. End Using
    42. Catch ex As Exception
    43. MessageBox.Show(ex.Message)
    44. End Try
    45. End Sub
    46. ''' <summary>
    47. ''' Holt die Daten aus einer Excel-Datei in ein DataSet
    48. ''' </summary>
    49. ''' <param name="excelFile">Pfad zur Excel-Datei</param>
    50. ''' <param name="headers">Haben die Tabellenspalten Überschriften</param>
    51. ''' <returns>DataSet</returns>
    52. ''' <remarks></remarks>
    53. Private Function GetExcelDataSet(ByVal excelFile As String, ByVal headers As Boolean) As DataSet
    54. Dim ds As DataSet = New DataSet()
    55. Dim con As OleDbConnection = New OleDbConnection()
    56. con.ConnectionString = "Data Source=" & excelFile & ";Provider=Microsoft.Jet.OLEDB.4.0;"
    57. If headers Then
    58. con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=Yes"""
    59. Else
    60. con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=No"""
    61. End If
    62. con.Open()
    63. Dim sheets As DataTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
    64. For Each sheet As DataRow In sheets.Rows
    65. Dim tableName As String = sheet("Table_Name").ToString()
    66. Dim sql As String = "SELECT * FROM [" & tableName & "]"
    67. Dim adap As OleDbDataAdapter = New OleDbDataAdapter(sql, con)
    68. adap.Fill(ds, tableName)
    69. Next
    70. con.Close()
    71. Return ds
    72. End Function
    73. End Class
    Dateien
    • Test.zip

      (9,26 kB, 110 mal heruntergeladen, zuletzt: )
    Die XLS hat keinen brauchbaren Header.
    Ich glaube nicht, dass man dem OleDb-Treiber beibringen kann, die erste Zeile zu überspringen und die zweite und dritte als Header zu betrachten.
    Da wirst du wohl von Hand modifizieren müssen.

    Wer erstellt die Exceldatei?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Aber die ersten drei Zeilen sind keine Daten.
    Wenn du die trotzdem drin haben willst, musst du halt im ConnectionString HDR=No mitgeben.

    Wenn du es richtig machen willst, musst du die Exceldatei vor dem Einlesen modifizieren und anstatt der ersten drei Zeilen eine Headerzeile rein packen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    mm, Ohne diese Zeilen ist der Rest der Daten nix wert.

    Verzeih meine blöde Frage, aber wo packke ich das HDR=No hin?
    Ich habe es jetzt einmal in Zeile 63 gepackt

    VB.NET-Quellcode

    1. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0; HDR=No;"


    Das gibt mir den Fehler
    "Installierbares ISAM nicht gefunden."
    @Pinot Also:
    Mit XLSX funktioniert dieser Code bei mir (W10).
    Für XLS bräuchte ich den Provider 4.0, der bei mir nicht installiert ist.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Using dlg = New OpenFileDialog
    5. dlg.Filter = "Excel|*.xls;*.xlsx|All Files|*.*"
    6. If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
    7. Return
    8. End If
    9. 'Dim path = "C:\Temp\TestTable.xls" ' die Tabelle
    10. Dim DtSet = LoadExcelFile(dlg.FileName, True)
    11. DataGridView1.DataSource = DtSet.Tables(0)
    12. End Using
    13. End Sub
    14. Private Function LoadExcelFile(ByVal path As String, ByVal headers As Boolean) As DataSet
    15. Dim ds As DataSet = New DataSet()
    16. Dim con As OleDbConnection = New OleDbConnection()
    17. If path.ToLower.EndsWith(".xlsx") Then
    18. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    19. Else
    20. con.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
    21. End If
    22. If headers Then
    23. con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=Yes"""
    24. Else
    25. con.ConnectionString += "Extended Properties=""Excel 8.0;HDR=No"""
    26. End If
    27. con.Open()
    28. Dim sheets As DataTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
    29. For Each sheet As DataRow In sheets.Rows
    30. Dim tableName As String = sheet("Table_Name").ToString()
    31. Dim sql As String = "SELECT * FROM [" & tableName & "]"
    32. Dim adap As OleDbDataAdapter = New OleDbDataAdapter(sql, con)
    33. adap.Fill(ds, tableName)
    34. Next
    35. con.Close()
    36. Return ds
    37. End Function
    38. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nicht das wir an einander vorbei schreiben
    Lädt der Code bei Dir die Zeilenüberschriften der Exceldatei aus Zeile 2 und 3 mit in die DGV?
    Bei mir mach er das nicht. Die Zeilen 1+2 in der DGV bleiben leer. (Sowohl XLS als auch XLSX, allerdings W7)
    Den Inhalt der Zeile 1 aus der Exceldatei hat er als Zeilenüberschrift in der DGV benutzt,

    Pinot schrieb:

    kann ich davon ausgehen
    Keine Ahnung. ;(
    Du hast da ein sehr spezielles Problem.
    Wenn es jemandem bekannt vorkommt und der hat ne Lösung, bekommst Du sie.
    Wenn nicht, musst Du sehr viel Fleiß und Eigeninitiative investieren.
    Wir sehen dann drüber, ob Deine Lösungsvorschläge gut und gut implementiert sind.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!