ListView to Excel

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    ListView to Excel

    Wie ermögliche ich es mir, aus einem ListView bestimmt Spalten nach Excel zu Exportieren?

    Hab das hier gefunden, aber da Exportiert er jede Spalte.

    VB.NET-Quellcode

    1. SaveFileDialog1.Title = "Save Excel File"
    2. SaveFileDialog1.Filter = "Excel Files (*.xlsx)|*.xlsx"
    3. SaveFileDialog1.ShowDialog()
    4. 'exit if no file selected
    5. If SaveFileDialog1.FileName = "" Then
    6. Exit Sub
    7. End If
    8. 'create objects to interface to Excel
    9. Dim xls As New Excel.Application
    10. Dim book As Excel.Workbook
    11. Dim sheet As Excel.Worksheet
    12. 'create a workbook and get reference to first worksheet
    13. xls.Workbooks.Add()
    14. book = xls.ActiveWorkbook
    15. sheet = book.ActiveSheet
    16. 'step through rows and columns and copy data to worksheet
    17. Dim row As Integer = 2
    18. Dim col As Integer = 1
    19. '////////////////////////////////////////////////////////////////////////
    20. Dim rowhead As Integer = 1
    21. Dim colhead As Integer = 1
    22. Dim columns As New List(Of String)
    23. Dim columncount As Integer = ListView2.Columns.Count - 1
    24. For i As Integer = 0 To columncount
    25. sheet.Cells(rowhead, colhead) = ListView2.Columns(i).Text
    26. colhead = colhead + 1
    27. Next
    28. '////////////////////////////////////////////////////////////////////////
    29. For Each item As ListViewItem In ListView2.Items
    30. For i As Integer = 0 To item.SubItems.Count - 1
    31. sheet.Cells(row, col) = item.SubItems(i).Text
    32. col = col + 1
    33. Next
    34. row += 1
    35. col = 1
    36. Next
    37. 'save the workbook and clean up
    38. book.SaveAs(SaveFileDialog1.FileName)
    39. xls.Workbooks.Close()
    40. xls.Quit()
    41. releaseObject(sheet)
    42. releaseObject(book)
    43. releaseObject(xls)


    Danke :)
    Für alle anderen: Der Code stammt von stackoverflow.
    Die Lösung heißt: Code verstehen und dann anpassen. Woran scheitert es? Denn einen fremden Code, der nicht macht, was Du willst, hier zu posten und von uns anpassen zu lassen, so dass er passt, hat nix mit Problemlösung oder Programmieren zu tun. Ich versuche mich häufiger mal in Hilfsbereitschaft, aber sorry, sowas wie hier geht einfach verhaltenstechnisch nicht. Dafür ist das Forum nicht da. Wenn das jemand anders sieht und eine fertige Lösung posten will, nur zu.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    VB.NET-Quellcode

    1. Dim columns As New List(Of String)
    2. Dim columncount As Integer = ListView2.Columns.Count - 1
    3. For i As Integer = 0 To columncount
    4. sheet.Cells(rowhead, colhead) = ListView2.Columns(i).Text
    5. colhead = colhead + 1
    6. Next


    Ich finde leider nichts wie ich es ändern kann, deswegen habe ich gefragt.

    Er soll z.b. nur die daten aus

    VB.NET-Quellcode

    1. ListView2.Columns(0).Text
    und

    VB.NET-Quellcode

    1. ListView2.Columns(1).Text
    exportieren. aber so geht das nicht :/
    Was macht diese Zeile#1: Dim columns As New List(Of String)
    Was macht Zeile#3?
    Sobald Du das weißt, bist Du einen großen Schritt weiter.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Falsch. Zeile#1 erzeugt eine String-Liste. Und wird später überhaupt nicht mehr verwendet! Oh je. Codeverständnis. Zeile#3 schon etwas besser: Da wird von 0 bis ListView-Columns-Anzahl durchgezählt. Und danach mit jenen Columns bearbeitet. Aber da sollte Dir auch allein schon klar werden, dass das nicht ist, was Du willst. Du willst nicht alle Spalten durchgehen, sondern nur einzelne. Das heißt: Abändern. Ob Du jetzt jede einzelne Spalte abarbeitest oder alle gewünschten Spalten in einem Array zusammenfasst und dann mit einer For-Loop arbeitest*, bleibt Dir überlassen.

    * Für den Fall, dass Du das nicht kennst:

    VB.NET-Quellcode

    1. For Each Column In {ListView1.Columns(0), ListView1.Columns(4), ListView1.Columns(2)}
    2. sheet.Cells(rowhead, colhead) = Column.Text
    3. colhead = colhead + 1
    4. Next
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Vielen Dank für deine Hilf.

    Jetzt hab ich aber das selbe Problem hier bei

    VB.NET-Quellcode

    1. For Each item As ListViewItem In ListView2.Items
    2. For i As Integer = 0 To item.SubItems.Count - 1
    3. sheet.Cells(row, col) = item.SubItems(i).Text
    4. col = col + 1
    5. Next
    6. row += 1
    7. col = 1
    8. Next


    So liest er ja alle Subitems aus, er soll aber ja nur aus 0, 4 und 2 aus lesen. Hab das so versucht:

    VB.NET-Quellcode

    1. For Each item As ListViewItem In {ListView2.SubItems(0)}
    2. For i As Integer = 0 To item.SubItems.Count - 1
    3. sheet.Cells(row, col) = item.SubItems(i).Text
    4. col = col + 1
    5. Next
    6. Next


    Aber wie du bestimmt schon erkennst, wird das nicht Funktionieren :(
    What? Das ergibt ja inhaltlich überhaupt keinen Sinn. ListView2 hat keine SubItems. Daher ist der hintere Teile von Zeile#1 syntaktisch falsch. Du willst jedes Item des ListViews durchgehen. Also muss Zeile#1 unverändert bleiben. Die Auswahl, dass Du nur die Spalten 0, 4 und 2 verarbeiten willst, erfolgt in Z#2 nach dem gleichen Schema wie Post#6, Z#1. Da man allerdings von einem SubItem keinen Index zurückbekommt, muss man eben direkt die Indices durchgeben:

    VB.NET-Quellcode

    1. For Each SubItemIndex In {0, 4, 2}
    2. sheet.Cells(row, SubItemIndex) = item.SubItems(SubItemIndex).Text
    3. '...

    Allerdings wird das mit Excel aus 2 Gründen scheitern: Man darf in Excel keinen Spaltenindex 0 angeben, da es dort bei 1 anfängt und außerdem willst Du ja bestimmt keine Leerspalten dazwischen haben. Mal sehen, ob Du dieses Problem selber lösen kannst.

    btw: Du und Deine ListViews. Ich habe das Gefühl, dass der Übergang zu einem DGV in diesem Leben nicht mehr vollzogen wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Du könntest dir ein Array vom Typ Integer anlegen welches die Indexer der Listview Columns beinhaltet die du speichern möchtest. Wie bereits in Post #8 angedeutet wurde. Anschließend durchläufst du alle ListViewItems (ListView2.Items.Count - 1) mittels For - Schleife. Bei jedem Schleifendurchlauf durchläufst du mit einer 2. For - Schleife alle Items des Arrays mit dem Columns die ausgelesen werden sollen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim colToFetch = integer { 0, 1 } ' Columns die ausgelesen werden sollen
    2. For row As Integer = 0 To ListView2.Items.Count - 1
    3. For col As Integer = 0 To colToFetch.length - 1
    4. sheet.Cells(row, col) = item.SubItems(col).Text
    5. Next
    6. Next

    Die erste Zeile kompiliert nicht und der Vorschlag löst nicht das Excel-akzeptiert-keinen-Spaltenindex-0-Problem. But go ahead, present a solution. Und der TE wird solch triviale Probleme auch in Zukunft nicht alleine lösen können. Man bedenke, der TE ist seit 10 Jahren dabei und hat > 700 Beiträge.

    ##########

    Ist der Ruf erst ruiniert, ist man gern extrovertiert.
    @Pixxxas: Scheint nicht trivial genug zu sein, oder?
    Du willst nur die Spaltenindizes 0, 4, 2 haben. Da stand die Lösung ja schon in Post#8: For Each ColumnIndex In {0, 4, 2}
    Nun zur Geschichte keine Leerspalten in Excel. Da Du die aufgezählten Spaltenindizes nicht in Excel verwenden kannst (Stichwort 0 und Leerspalten), musst Du eben manuell die Spalten in Excel hochzählen. Aber zumindest das hattest Du ja schon selber gefunden.

    VB.NET-Quellcode

    1. For RowIndex = 0 To ListView2.Items.Count - 1
    2. Dim CurrentExcelColumnIndex = 1
    3. For Each ColumnIndex In {0, 4, 2}
    4. Sheet.Cells(RowIndex + 1, CurrentExcelColumnIndex) = ListView2.Items(RowIndex).SubItems(ColumnIndex).Text
    5. CurrentExcelColumnIndex += 1
    6. Next
    7. Next

    An dieser Stelle verabschiede ich mich. BlackList.Add(7428)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()