Excel Spreadsheet mit VB Programm auslesen
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.
-
-
Wenn du Excelnur als ReadOnly-DB benötigst, bietet sich ADODB an:
dotnetheaven.com/article/acces…s-using-ado.net-in-vb.net
Ansonsten:
support.office.com/en-us/artic…1a-4e48-9c21-dc18a102433f--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Peter329 schrieb:
EXCEL
Spoiler anzeigen VB.NET-Quellcode
- Private Sub LoadExcelFile(path As String, table As String)
- Try
- Dim DtSet = New DataSet
- Dim connString As String
- If path.ToLower.EndsWith(".xlsx") Then
- 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=Excel 12.0;"
- connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
- Else
- connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
- End If
- Using myConnection = New OleDb.OleDbConnection(connString)
- Dim myCommand As OleDb.OleDbDataAdapter
- myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
- myCommand.TableMappings.Add("Table", "TestTable")
- myCommand.Fill(DtSet)
- Me.DataGridView1.DataSource = DtSet.Tables(0)
- myConnection.Close()
- End Using
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- 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
- 'Check input
- If Not File.Exists("P:WLAN.xlsx") Then
- MessageBox.Show("Source file does not exist.")
- Exit Sub
- End If
- ' Connection string for ODBC Excel Driver
- Dim ConnectionString As String = "Driver={Microsoft Excel Driver (*.xlsx)};DBQ=P:WLAN.xlsx"
- Dim conn As New OdbcConnection(ConnectionString)
- ' Table in Excel can be thought of as sheets and are queried as shown
- Dim sql As String = "Select ID, IP, MAC, ACC OWN, DESC FROM WLAN"
- 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:
falschFalls 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
- Dim path As String = "P:WLAN.xlsx"
- Dim table As String = "WLAN"
- Try
- Dim DtSet = New DataSet
- Dim connString As String
- Dim fi = New IO.FileInfo(Path)
- Me.Text = fi.Name
- If Path.ToLower.EndsWith(".xlsx") Then
- 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=Excel 12.0;"
- connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
- Else
- connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & Path & "; Extended Properties=Excel 8.0;"
- End If
- Using myConnection = New OleDb.OleDbConnection(connString)
- Dim myCommand As OleDb.OleDbDataAdapter
- myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
- myCommand.TableMappings.Add("Table", "TestTable")
- myCommand.Fill(DtSet)
- Me.dataGrid1.DataSource = DtSet.Tables(0)
- myConnection.Close()
- End Using
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- 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 übertragenFalls 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
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! -
-
Jetzt hab ich doch noch eine Frage. Mein Coding sieht inzwischen wie folgt aus:
VB.NET-Quellcode
- 'Load EXCEL file into datagrid view
- Try
- Dim DtSet = New DataSet
- Dim connString As String
- Dim fi = New IO.FileInfo(path)
- If path.ToLower.EndsWith(".xlsx") Then
- connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
- Else
- connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
- End If
- Using myConnection = New OleDb.OleDbConnection(connString)
- Dim myCommand As OleDb.OleDbDataAdapter
- myCommand = New OleDb.OleDbDataAdapter( _
- "select 'EXCEL' AS STATUS, Name, IP, MAC, ' ' AS ACC, ' ' AS NET, OWN, DESC, 0 as S from [" & table & "$]" & " order by MAC",
- myConnection)
- myCommand.TableMappings.Add("Table", "TestTable")
- myCommand.Fill(DtSet)
- Me.dgvMAC.DataSource = DtSet.Tables(0)
- myConnection.Close()
- End Using
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- lblMessage.Text = "Error loading EXCEL Table"
- Return False
- 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:
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“ ()
-
Ähnliche Themen
-
Dieter__ - - Sonstige Problemstellungen
-
4 Benutzer haben hier geschrieben
- Peter329 (8)
- RodFromGermany (4)
- petaod (1)
- Dksksm (1)