Excel Spreadsheet mit VB Programm auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Excel Spreadsheet mit VB Programm auslesen

    Hi,

    ich möchte gern ein EXCEL Spreadsheet mit meinem VB Programm auslesen ... Das Spreadsheet hat ein paar Zeilen und ein paar Spalten ... das sollte doch machbar sein.

    LG
    Peter

    Peter329 schrieb:

    EXCEL
    So was, Pfad der XLS und Name der Tabelle, Tabelle im Datagridview:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub LoadExcelFile(path As String, table As String)
    2. Try
    3. Dim DtSet = New DataSet
    4. Dim connString As String
    5. If path.ToLower.EndsWith(".xlsx") Then
    6. 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=Excel 12.0;"
    7. connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    8. Else
    9. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
    10. End If
    11. Using myConnection = New OleDb.OleDbConnection(connString)
    12. Dim myCommand As OleDb.OleDbDataAdapter
    13. myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
    14. myCommand.TableMappings.Add("Table", "TestTable")
    15. myCommand.Fill(DtSet)
    16. Me.DataGridView1.DataSource = DtSet.Tables(0)
    17. myConnection.Close()
    18. End Using
    19. Catch ex As Exception
    20. MessageBox.Show(ex.Message)
    21. End Try
    22. End Sub

    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 kling ja genau danach was ich benötige. Ich hab das jetzt versucht umzusetzen:

    VB.NET-Quellcode

    1. 'Check input
    2. If Not File.Exists("P:WLAN.xlsx") Then
    3. MessageBox.Show("Source file does not exist.")
    4. Exit Sub
    5. End If
    6. ' Connection string for ODBC Excel Driver
    7. Dim ConnectionString As String = "Driver={Microsoft Excel Driver (*.xlsx)};DBQ=P:WLAN.xlsx"
    8. Dim conn As New OdbcConnection(ConnectionString)
    9. ' Table in Excel can be thought of as sheets and are queried as shown
    10. Dim sql As String = "Select ID, IP, MAC, ACC OWN, DESC FROM WLAN"
    11. conn.Open()


    Die open Anweisung scheitert aber:

    ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

    Was mache ich denn falsch ?

    LG
    Peter

    Peter329 schrieb:

    falsch
    Probier mal mein Snippet aus.
    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!
    Hi RFG,

    ich hab auch deinen Vorschlag mal versucht umzusetzen. Da komme ich auf Anhieb sehr viel weiter:

    VB.NET-Quellcode

    1. Dim path As String = "P:WLAN.xlsx"
    2. Dim table As String = "WLAN"
    3. Try
    4. Dim DtSet = New DataSet
    5. Dim connString As String
    6. Dim fi = New IO.FileInfo(Path)
    7. Me.Text = fi.Name
    8. If Path.ToLower.EndsWith(".xlsx") Then
    9. 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=Excel 12.0;"
    10. connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    11. Else
    12. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & Path & "; Extended Properties=Excel 8.0;"
    13. End If
    14. Using myConnection = New OleDb.OleDbConnection(connString)
    15. Dim myCommand As OleDb.OleDbDataAdapter
    16. myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
    17. myCommand.TableMappings.Add("Table", "TestTable")
    18. myCommand.Fill(DtSet)
    19. Me.dataGrid1.DataSource = DtSet.Tables(0)
    20. myConnection.Close()
    21. End Using
    22. Catch ex As Exception
    23. MessageBox.Show(ex.Message)
    24. End Try


    Die Sache läuft ohne Fehler durch ... und die DataGridView hat das Layout des Excel files. Nur werden keine Daten übertragen ... die DataGridView ist leer. :(

    Ich hab das mal gerade durch"gesteppt" ... die Anweisungen im USING werden fehlerfrei durchlaufen ... soweit sieht das gut aus. Nur die Daten kommen nicht an ...

    Was mache ich jetzt schon wieder falsch?

    LG
    Peter

    [edit]

    OUCH ... die Daten kommen doch an ! Die Spalten werden noch einmal angehängt. Das hab ich nicht gesehen, weil das Display zu klein ist!

    Ich hab die DataGridView mit allen Spalten im Designer definiert. Das ist wohl nicht erforderlich ...

    Ich lösche die DGV und definiere sie noch mal ... !

    [edit edit]

    Jau jetzt funzt das. Bleiben noch ein paar Kleinigkeiten:

    Es werden sehr viele Leerzeilen angezeigt ! Muss ich die von Hand eliminieren?

    Alle Spalten haben die gleiche Breite. Ich vermute, dass ich das Layout der DGV jetzt programmatisch einstellen muss (denn im Designer hab ich ja nix deklariert).

    LG
    Peter

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Nur werden keine Daten übertragen
    Zippe mal Deine XLS und häng die dran.
    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!
    Na wie schon gesagt, die Sache läuft ja ... sorry für die Konfusion.

    Meine EXCEL Tabelle hat drei Zeilen. Die werden auch angezeigt. Aber hinten dran stehen noch jede Menge Leerzeilen. Muss ich die "von Hand" aus der DataGrid View löschen?

    Die Spalten der DataGrid View sind alle gleich breit. Wie stelle ich das ein ? Muss ich das auch programmatisch machen ?

    LG
    Peter

    Peter329 schrieb:

    Leerzeilen
    löschst Du in der DataTable, bevor Du sie an das DGV bindest, geh rückwärts von hinten nach vorn, bis Du eine Zeile erwischst, die (mindestens) ein Element hat.
    Gugst Du DataGridView.AutoSizeColumnsMode.
    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!
    Ich bin lückenlos begeistert ! Das ging ja diesmal ratz fatz ! :D

    Meine Anwendung macht genau das, was ich mir vorgestellt habe ... und verhält sich auch so, wie sich "anständige" Anwendungen verhalten sollten.

    Danke an alle Ratgeber. Ihr habt meinen Tag gerettet !

    LG
    Peter
    Jetzt hab ich doch noch eine Frage. Mein Coding sieht inzwischen wie folgt aus:

    VB.NET-Quellcode

    1. 'Load EXCEL file into datagrid view
    2. Try
    3. Dim DtSet = New DataSet
    4. Dim connString As String
    5. Dim fi = New IO.FileInfo(path)
    6. If path.ToLower.EndsWith(".xlsx") Then
    7. connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    8. Else
    9. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
    10. End If
    11. Using myConnection = New OleDb.OleDbConnection(connString)
    12. Dim myCommand As OleDb.OleDbDataAdapter
    13. myCommand = New OleDb.OleDbDataAdapter( _
    14. "select 'EXCEL' AS STATUS, Name, IP, MAC, ' ' AS ACC, ' ' AS NET, OWN, DESC, 0 as S from [" & table & "$]" & " order by MAC",
    15. myConnection)
    16. myCommand.TableMappings.Add("Table", "TestTable")
    17. myCommand.Fill(DtSet)
    18. Me.dgvMAC.DataSource = DtSet.Tables(0)
    19. myConnection.Close()
    20. End Using
    21. Catch ex As Exception
    22. MessageBox.Show(ex.Message)
    23. lblMessage.Text = "Error loading EXCEL Table"
    24. Return False
    25. End Try


    Wie man sieht, werden einige Spalten mit Konstanten befüllt, z.B. die Spalte STATUS mit dem String "EXCEL" oder die Spalte S mit 0.

    Diese Spalten möchte ich nun mit Werten befüllen, die ich in meinem Programm ermittelt habe. Wie mache ich das denn?

    Ich könnte die Werte in die DatagridView eintragen ... etwa um die Spalte S in der k-ten Zeile zu befüllen:

    VB.NET-Quellcode

    1. dgvMAC.Rows(k).Cells(8).Value = "17"


    Aber das ist ja nun sicher kein gutes Coding, weil die dgvMAC über DataBinding gesteuert wird. Wie mache ich das also richtig ?

    LG
    Peter
    Schade, irgendwie mag mir niemand mehr antworten. Warum auch immer.

    Für alle, die es interessiert wie ich das jetzt gelöst habe:

    Ich habe das Databinding einfach eliminiert. Diese Kiste ist eben enorm unhandlich. Und bringen tut sie mir in diesem Fall eigentlich überhaupt nix.

    Ich lese den typed Dataset direkt in die Datagridview ein. Damit vermeide ich das ganze Getüddel ... und außerdem hat das den Charme, dass ich die Formatierung der DataGridView jetzt im Designer vornehmen kann. Das reduziert mein Coding ganz erheblich.

    Und schwups ... schon sind alle Anomalien, die ich vorher mit Data Binding hatte, auf einen Schlag verschwunden. Auf diese Lösung hätte ich schon viel früher kommen sollen. :)

    LG
    Peter

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

    Von einem typisiertem Dataset ist in Deinem Listing (Post #11) aber weit und breit nichts zu sehen.

    Mich würde interessieren, wie Du deine Excel-Daten ins typ. Dataset bekommen hast (kannst Du bitte Code zeigen?) und als nächstes, was du verstehst unter "Ich lese den typed Dataset direkt in die Datagridview ein".
    Korrekterweise macht man das nämlich auch mit Databinding, aber halt über den Desinger und einer Bindigsource.

    Dksksm schrieb:

    Von einem typisiertem Dataset ist in Deinem Listing (Post #11) aber weit und breit nichts zu sehen.


    Ok, es muss wohl einfach "Dataset" heißen.

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