Auslesen einer Excel-Tabelle mit VB.net

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Snickbrack.

    Auslesen einer Excel-Tabelle mit VB.net

    Rahmenbedingung : VisualStudio2012, Excel Tabelle TestPresse.xlsx

    Hallo zusammen ich bin blutiger Anfänger und komme einfach nicht weiter.
    Ziel ist es in einer Tabelle (D:\TestPresse.xlsx) einen Wert in der Spalte B (ArtNo) nach einer Zahl zu suchen und anschließend den Inhalt dieser Reihe (Typ; Druck; Abstandshalter) in Variablen einzutragen, welche ich anschließend in drei Textboxen ausgebe.
    Idealer weise gebt ihr mir ein Quellcode, ich habe hier schon alles möglich ausprobiert komme aber einfach nicht drauf.
    Gruß
    Harro

    Verschoben. ~Thunderbolt
    Dateien
    • TestPresse.xlsx

      (9,21 kB, 289 mal heruntergeladen, zuletzt: )

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

    Harro L schrieb:


    Idealer weise gebt ihr mir ein Quellcode

    So funktioniert das hier im Forum in der Regel nicht. Hier erarbeitet man zusammen eine Lösung. nun, da dies geklärt ist, wo genau bist du nicht weiter gekommen? Ich würde zunächst das Problem in einzelne Arbeitsschritte aufteilen

    1. Excel einlesen
    2. Daten verarbeiten
    3. Daten ausgeben

    Also, wo bist du bisher nicht weiter gekommen?
    "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
    Danke für die Aufklärung. Ich wollte euch nur nicht mit solchen Kleinigkeiten aufhalten... ;)
    Normalerweise suche ich mir im netz Quellcodeschnipsel die ich dann solange bearbeitet bis ich mein Problem gelöst habe. Das ging bis jetzt auch ganz gut.
    Nur jetzt fehlt mir komplett der Ansatz. Daher hatte ich gedacht Ihr schmeißt mir einen Schnipsel zu und ich versuche es mal.
    Was habe ich gemacht:
    im ersten Teil habe ich mal eine TXT eingelesen... check
    im zweiten Teil habe ich die Tabele eingelesen und wieder ausgegeben... check
    im dritten Teil habe ich zuerst die Tabelle geöffnet, dann einen Wert kontrolliert (auskommentiert), dann wollte ich etwas suchen (geht nicht ), Dann einen wert einer Zelle ausgegeben und zum Schluss versuche ich die Tabelle wieder zu schließen (was aber glaube ich nicht ganz korrekt funktioniert).
    Endziel ist es in der Spalte B (ArtNo) einen wert zu suchen um dann die dazugehörigen werte auszugeben. z.B.
    5555 ; Modul A ; 1,5 ; blau
    [line]​[/line]

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports Microsoft.Office.Interop 'diese imports reichen
    4. Public Class Form1
    5. ' __________________________________________________________Einlesen aus textdatei
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button_Aus_TXE.Click
    7. Dim filelenght
    8. ' datei öffnen
    9. FileOpen(1, "d:\testpresse.txt", OpenMode.Input)
    10. 'ermitteln wie lang der text ist
    11. filelenght = LOF(1)
    12. TextBox2_Ausgabe.Text = InputString(1, filelenght)
    13. 'datei schließen
    14. FileClose(1)
    15. End Sub
    16. ' __________________________________________________________einlesen aus excel
    17. Private Sub Button2_aus_XML_Click(sender As Object, e As EventArgs) Handles Button2_aus_XML.Click
    18. Try
    19. Dim MyConnection As System.Data.OleDb.OleDbConnection
    20. Dim dataSet As System.Data.DataSet
    21. Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
    22. Dim path As String = "D:\\TestPresse.xlsx"
    23. MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;")
    24. MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", MyConnection)
    25. dataSet = New System.Data.DataSet
    26. MyCommand.Fill(dataSet)
    27. DataGridView1_XLS_output.DataSource = dataSet.Tables(0)
    28. MyConnection.Close()
    29. Catch ex As Exception
    30. MsgBox("Excel-Datei nicht gefunden")
    31. End Try
    32. End Sub
    33. ' __________________________________________________________suchen in excel
    34. Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1_Suche.Click
    35. ' ### Excel-Dokument öffnen ###
    36. Dim Excel1 As New Excel.Application
    37. Excel1.Workbooks.Open("D:\TestPresse.xlsx")
    38. Excel1.Sheets("Tabelle1").Columns(2).Select()
    39. 'Dim EXLRange As Excel.Range = Excel1.Range("B2:B5")
    40. Excel1.Visible = False
    41. ' ### Kontrolle einer Zelle nach wert
    42. 'Dim Kontrollwert As String = Excel1.Value
    43. 'If Kontrollwert = "2,2" Then
    44. ' MsgBox("Treffer")
    45. 'Else
    46. ' MsgBox("NOB")
    47. 'End If
    48. ' Test ### Kontrolle einer Zelle nach wert
    49. Dim Kontrollwert As String = Excel1.Value
    50. Dim rngExcel As Excel.Range = Excel1.Range("B2:B5")
    51. If Kontrollwert = "2,2" Then
    52. MsgBox("Treffer")
    53. Else
    54. MsgBox("NOB")
    55. End If
    56. ' ### Wert einer Zelle ausgeben
    57. Dim Wert As String = Excel1.Range("D3").Value
    58. MessageBox.Show(Wert, "Inhalt der Zelle")
    59. ' ### Excel und Anwendung schließen ###
    60. Excel1.ActiveWorkbook.Close()
    61. Excel1.Workbooks.Close()
    62. Excel1.Visible = False
    63. Excel1.Application.Quit()
    64. End Sub
    65. End Class
    Den Ansatz mit dem Dataset finde ich eleganter, es geht natürlich auch über die Excel-Referenz.

    Du hast ja schon ein Dataset mit deiner Datatable, das heißt was fehlt ist die Suche in der Art:

    VB.NET-Quellcode

    1. Dim foundRow() As DataRow
    2. foundRow = dataSet.Tables(0).Select("ArtNo='123456'")
    3. For Each row In foundRow
    4. Dim rowIndex As Integer = dataSet.Tables(0).Rows.IndexOf(row)
    5. Next
    Gruß Murdoc
    Da du geschrieben hast VB.NET und Visual Studio, würde ich dir das hier empfehlen:

    dotnetperls.com/excel

    Ist zwar C# aber relativ simpel auf VB.NET umzumünzen.

    Habe ich auch mal für ein Rechnungsprogramm verwendet, hat super funktioniert.
    So ich bin schon ein erheblichen Schritt weiter...
    Nur gefallen mir mir die drei IF-Zeilen nicht...
    Auch von der Geschwindigkeit es dauert ziemlich lang bis zur Ausgabe, ich denke das hängt damit zusammen:

    VB.NET-Quellcode

    1. Dim ArtNo As String = "5555"
    2. Dim Ausgabe_Typ As String = "nicht vorhanden"
    3. Dim Ausgabe_Druck As String = "nicht vorhanden"
    4. Dim Ausgabe_Abstandshalter As String = "nicht vorhanden"
    5. Dim Excel As Object = CreateObject("Excel.Application")
    6. Dim wb = Excel.Workbooks.Open("D:\TestPresse.xlsx")
    7. 'Dim Gefunden As String
    8. Dim ws = wb.Sheets(1)
    9. Dim Cell = ws.Columns(2).Find(ArtNo)
    10. If Cell Is Nothing Then Ausgabe_Typ = "nicht gefunden" Else Ausgabe_Typ = Cell.Offset(0, 1).Value
    11. If Cell Is Nothing Then Ausgabe_Typ = "nicht gefunden" Else Ausgabe_Druck = Cell.Offset(0, 2).Value
    12. If Cell Is Nothing Then Ausgabe_Typ = "nicht gefunden" Else Ausgabe_Abstandshalter = Cell.Offset(0, 3).Value
    13. MsgBox(" Adapter: " + Ausgabe_Typ + " Pressdruck: " + Ausgabe_Druck + " Abstandshalter: " + Ausgabe_Abstandshalter)
    Lass doch dieses furchtbare Excel Interop Teil weg. Eklig träge und instabil:-/

    Excel import:
    Excel-Daten auslesen

    Daten verarbeiten
    for each row as DataRow in myDataTable.Rows
    If(row(„artno“).ToString = „foo“ ) Then
    'Teffer
    EndIf
    Next

    So, oder ähnlich könnte man das machen... finde die Lösung von @Murdoc ganz nice
    "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

    Harro L schrieb:

    Ich wollte euch nur nicht mit solchen Kleinigkeiten aufhalten...
    Dann geh ins Unterforum Jobbörse & Marktplatz und biete eine Gegenleistung für die von Dir gewünschte Leistung. 8o
    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!

    mrMo schrieb:

    Lass doch dieses furchtbare Excel Interop Teil weg. Eklig träge und instabil:-/


    Naja, wenn man es richtig verwendet funktionierts super.

    Werde das auch immer wieder für sowas verwenden, wenn ich es denn brauche.