listview mit Exceldaten füllen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Apollo.

    listview mit Exceldaten füllen

    Hallo zusammen.

    ich bin noch neu in der Vb Net Programmierung

    Mein Problem ich möchte eine Listview mit Daten aus einer Exceltabelle füllen. ?(

    Das hat auch Anfangs gut funktioniert, aber seit gestern bekomme ich die Fehlermeldung "System.Runtime.InteropServices.COMException: "Der Remoteprozeduraufruf ist fehlgeschlagen. (Ausnahme von HRESULT: 0x800706BE)"

    und ich kann nicht herausfinden wieso. vielleicht kann mir jeman von euch einen Tipp geben

    Hier mal mein Codeansatz.


    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Public Class Form1
    3. Private Structure ExcelRows
    4. Dim C1 As String
    5. Dim C2 As String
    6. Dim C3 As String
    7. Dim C4 As String
    8. Dim C5 As String
    9. Dim C6 As String
    10. Dim C7 As String
    11. Dim C8 As String
    12. Dim C9 As String
    13. Dim C10 As String
    14. Dim C11 As String
    15. End Structure
    16. Private ExcelRowList As List(Of ExcelRows) = New List(Of ExcelRows)
    17. Private Sub btnDateiÖffnen_Click(sender As Object, e As EventArgs) Handles btnDateiÖffnen.Click
    18. Me.OpenFileDialog1.FileName = Nothing
    19. If Me.OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    20. Me.TextBox1.Text = Me.OpenFileDialog1.FileName
    21. End If
    22. If GetInfo() = True Then
    23. For Each Xitem In ExcelRowList
    24. Dim lvitem As ListViewItem
    25. lvitem = Me.lsvDaten.Items.Add(Xitem.C1)
    26. lvitem.SubItems.AddRange(New String() {Xitem.C2, Xitem.C3, Xitem.C4, Xitem.C5, Xitem.C6, Xitem.C7, Xitem.C8, Xitem.C9, Xitem.C10, Xitem.C11})
    27. Next
    28. End If
    29. End Sub
    30. '---------------------------------------------------------------
    31. Private Function GetInfo() As Boolean
    32. Dim Completed As Boolean = False
    33. 'open
    34. Dim MyExcel As New Excel.Application
    35. MyExcel.Workbooks.Open(Me.TextBox1.Text)
    36. 'Extract
    37. MyExcel.Sheets("Übersicht").activate()
    38. MyExcel.Range("A2").Activate()
    39. Dim ThisRow As New ExcelRows
    40. Do
    41. If MyExcel.ActiveCell.Value > Nothing Or MyExcel.ActiveCell.Text > Nothing Then
    42. ThisRow.C1 = MyExcel.ActiveCell.Value
    43. MyExcel.ActiveCell.Offset(0, 1).Activate()
    44. ThisRow.C2 = MyExcel.ActiveCell.Value
    45. MyExcel.ActiveCell.Offset(0, 1).Activate()
    46. ThisRow.C3 = MyExcel.ActiveCell.Value
    47. MyExcel.ActiveCell.Offset(0, 1).Activate()
    48. ThisRow.C4 = MyExcel.ActiveCell.Value
    49. MyExcel.ActiveCell.Offset(0, 1).Activate()
    50. ThisRow.C5 = MyExcel.ActiveCell.Value
    51. MyExcel.ActiveCell.Offset(0, 1).Activate()
    52. ThisRow.C6 = MyExcel.ActiveCell.Value
    53. MyExcel.ActiveCell.Offset(0, 1).Activate()
    54. ThisRow.C7 = MyExcel.ActiveCell.Value
    55. MyExcel.ActiveCell.Offset(0, 1).Activate()
    56. ThisRow.C8 = MyExcel.ActiveCell.Value
    57. MyExcel.ActiveCell.Offset(0, 1).Activate()
    58. ThisRow.C9 = MyExcel.ActiveCell.Value
    59. MyExcel.ActiveCell.Offset(0, 1).Activate()
    60. ThisRow.C10 = MyExcel.ActiveCell.Value
    61. MyExcel.ActiveCell.Offset(0, 1).Activate()
    62. ThisRow.C11 = MyExcel.ActiveCell.Value
    63. ExcelRowList.Add(ThisRow)
    64. MyExcel.ActiveCell.Offset(1, -10).Activate()
    65. Else
    66. Completed = True
    67. Exit Do
    68. End If
    69. Loop
    70. 'Close
    71. MyExcel.Workbooks.Close()
    72. MyExcel = Nothing
    73. Return Completed
    74. End Function
    75. Private Sub btnLeeren_Click(sender As Object, e As EventArgs) Handles btnLeeren.Click
    76. 'Items.Clear() !!!
    77. Me.lsvDaten.Items.Clear()
    78. End Sub
    79. Private Sub btnLöschen_Click(sender As Object, e As EventArgs) Handles btnLöschen.Click
    80. 'einzelne Zeile für den zu löschenden Eintrag/Einträge der Tagelle
    81. Dim zeile As Windows.Forms.ListViewItem
    82. 'Rückfrage, ob wirklich geöscht werden soll
    83. If MsgBox("Möchten Sie wirklich löschen?", MsgBoxStyle.YesNo Or MsgBoxStyle.Question, "Löschen von einem Datensatz / mehrere Datensätzen !") <> MsgBoxResult.Yes Then
    84. Exit Sub 'vorzeitig verlassen
    85. End If
    86. For Each zeile In Me.lsvDaten.SelectedItems
    87. Me.lsvDaten.Items.Remove(zeile)
    88. Next
    89. End Sub
    90. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    91. With Me.cboNamen
    92. ' .Items.Add("")
    93. .Items.Add("Max Mustermann")
    94. .Items.Add("Susi Mustermann")
    95. .SelectedIndex = 0
    96. End With
    97. End Sub


    Danke für eure Hilfe

    *Topic verschoben und Code-Tag eingefügt (das nächste Mal bitte selbst machen!)*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Puh das ist aber ganz schön viel Code für nen bissl Excel Import. Der import via OleDbDataAdapter (musst mal googlen, aus dem Kopf bekomme ich es nicht zusammen) in eine DataTable geht easy und ohne viel code. Die DataTable dann einfach noch als Datenquelle an ein DataGridView Hängen und fertig.
    "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
    @Apollo
    wie vorgeschlagen verwende doch lieber OLEDB

    hier 3 Beispiele die du anwenden kannst

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. 'Bsp.1) select alles:
    5. DataGridView1.DataSource = ExcelOleDb("E:\vbexcel.xlsx", "SELECT * FROM [Tabelle3$]")
    6. 'Bsp.2) select eine Range: A2:G100
    7. 'DataGridView1.DataSource = ExcelOleDb("E:\vbexcel.xlsx", "SELECT * FROM [Tabelle3$A2:G100]")
    8. 'Bsp.3) select Daten mit Vorname = anfangs buchstabe B
    9. 'Vorname und Nachname sind Spaltennamen in der Excel Tabelle:
    10. 'DataGridView1.DataSource = ExcelOleDb("E:\vbexcel.xlsx", "SELECT Vorname, Nachname FROM [Tabelle3$] Where Vorname Like 'B%'")
    11. 'liefert dir dann z.b:
    12. 'Bernd
    13. 'Betty
    14. 'Boris
    15. 'etc....
    16. End Sub
    17. Public Function ExcelOleDb(ByVal strTextPath As String, _
    18. ByVal sSQL As String) As System.Data.DataTable
    19. Dim con As New System.Data.OleDb.OleDbConnection
    20. Dim myCmd As New System.Data.OleDb.OleDbCommand
    21. Dim myadp As New System.Data.OleDb.OleDbDataAdapter
    22. Dim mydt As New System.Data.DataTable
    23. With con
    24. .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;"
    25. .ConnectionString &= "data source=" & strTextPath & ";"
    26. .ConnectionString &= "Extended Properties = ""Excel 12.0 XML"";"
    27. End With
    28. With myCmd
    29. .Connection = con
    30. .CommandType = CommandType.Text
    31. .CommandText = sSQL
    32. End With
    33. With myadp
    34. .SelectCommand = myCmd
    35. Try
    36. .Fill(mydt)
    37. Catch ex As Exception
    38. MessageBox.Show(ex.Message)
    39. End Try
    40. End With
    41. Return (mydt)
    42. End Function
    43. End Class


    ich habe Datagridview genommen statt Listview
    Hallo Kasi

    Danke für Dein Beispiel.

    Mein Code sieht wie folgt aus.
    Und hier Zeile 32 sping dann die MsgBox an und liefert mir die Info "Der Microsoft.ACEOLEDB 12.0 -Provider ist nicht auf dem lokalen Computer registriert. Ich habe mal gegoogle und das scheint wohl ein installationproblem zu sein. 32 - 64 Bit Installer oder so. Vieleicht weis einer von Euch das Problem umgehen kann. Muss ich da ein anders Officepaket installieren?

    Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Data.OleDb
    3. Imports Microsoft.Office.Interop
    4. Public Class Form1
    5. Dim conn As OleDbConnection
    6. Dim dta As OleDbDataAdapter
    7. Dim dts As DataSet
    8. Dim excel As String
    9. Dim OpenfileDialog As New OpenFileDialog
    10. Private Sub btnLaden_Click(sender As Object, e As EventArgs) Handles ImportExcel.Click
    11. Try
    12. OpenfileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
    13. OpenfileDialog.Filter = "All files (*.*)|*.*|Excel files (*.xlsx)|*.xlsx|xls files (+.xls)|*.xls"
    14. If OpenfileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then
    15. Dim fi As New IO.FileInfo(OpenfileDialog.FileName)
    16. Dim FileName As String = OpenfileDialog.FileName
    17. excel = fi.FullName
    18. conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel + ";Extended Properties=Excel 12.0;")
    19. dta = New OleDbDataAdapter("select * from [Sheet1$]", conn)
    20. dts = New DataSet
    21. dta.Fill(dts, "[Sheet1$]")
    22. DGV1.DataSource = dts
    23. DGV1.DataMember = "[Sheet1$]"
    24. conn.Close()
    25. End If
    26. Catch ex As Exception
    27. MsgBox(ex.Message)
    28. conn.Close()
    29. End Try
    30. End Sub
    Du musst den besagten Provider installieren. Der ist wohl nicht installiert.
    "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
    oft kann man dann auch den anderen OledbProvider angeben, den Jet-OleDb. Einer von beiden - ACE oder OleDb - ist meist installiert.

    Habich mal BeispielConnectionString rausgesucht:
    Provider=Microsoft.Jet.OLEDB.4.0; Data Source="C:\Programming\VS13\FormsVb\DbExtensionTester\DbGenerator\Data\RDaten - Kopie.MDB"

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