Excel Export aus Datagridview langsam

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Excel Export aus Datagridview langsam

    Hey Leute,

    ich möchte ein aus meinem Programm die Möglichkeit bieten, alle Gridviews nach Excel exportieren lassen zu können. Dasselbe gilt auch für einige Tabellen aus meinem Dataset. Bei diesen Dataset Tabellen klappt das auch wunderbar, nur ist der Export aus einem Datagridview sehr langsam. Hier mal mein Code:

    VB.NET-Quellcode

    1. Sub ExcelBestandsverzeichnis()
    2. Dim xlapp As New excel.Application
    3. If xlapp Is Nothing Then
    4. MessageBox.Show("Excel ist nicht installiert!")
    5. Return
    6. End If
    7. Dim xlwb As excel.Workbook
    8. Dim xlws As excel.Worksheet
    9. Dim c, r, k As Integer
    10. Try
    11. xlwb = xlapp.Workbooks.Add()
    12. xlws = DirectCast(xlwb.Sheets(1), excel.Worksheet) 'Konvertierung eines sheets in ein excel.worksheet und Deklarierung an das xlws Objekt
    13. xlws.Name = "Bestandsverzeichnis"
    14. k = 1 'Zeile der Spaltenüberschriften
    15. c = 1 'Startreihe der Werte
    16. r = 2 'Startzeile der Werte
    17. xlapp.Visible = True
    18. 'Spaltenüberschriften
    19. For Each column As DataGridViewColumn In dgvBestandsverzeichnis.Columns
    20. Dim Header As String = column.HeaderText
    21. xlws.Cells(1, k) = Header
    22. k += 1
    23. Next
    24. 'Feldwerte
    25. For Each row As DataGridViewRow In dgvBestandsverzeichnis.Rows
    26. For Each column As DataGridViewColumn In dgvBestandsverzeichnis.Columns
    27. 'für jede Spalte in jeder Reihe wird der Wert des Feldes an Excel übergeben
    28. Dim Value As String = row.Cells(column.Name).Value.ToString
    29. xlws.Cells(r, c) = Value
    30. c += 1
    31. Next
    32. r += 1
    33. c = 1
    34. Next
    35. Catch ex As Exception
    36. MsgBox(Err.Description)
    37. End Try
    38. End Sub


    Gibt es da eine schnellere Lösung? ?(

    Was haltet ihr außerdem von einer Speicherung der Daten in einem Array? Dann würde ich mir für jede Tabelle ein Array erstellen und es der Export Prozedur übergeben, die es dann liest und in die Excel übergibt? Leider waren meine ersten Versuche damit noch langsamer als mein Code da oben. :whistling:
    In etwa so:

    Visual Basic-Quellcode

    1. ​Dim Arr(,) As Double = {{1, 2}, {1, 3}, {2, 1}, {2, 2}, {2, 3}, {3, 1}, {3, 2}, {3, 3}} 'zweidimensionales Array
    2. xlws.Range("A1:C3").Value = Arr 'Range-Bereich muss der Array-Dimension entsprechen
    Du kannst das Array natürlich auch in einer Schleife befüllen.
    Aber wahrscheinlich kannst du auch aus dem DatagridView ein Array extrahieren.
    Einfach ein bisschen kreativ sein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    rickomanio schrieb:

    mein Array ist ja nicht immer gleich groß
    Du kannst dafür Range.Resize verwenden.
    Da kannst du die entsprechenden Dimensionen des Arrays angeben.
    Beachte dabei, dass ein Array üblicherweise nullbasiert ist.

    rickomanio schrieb:

    extrahieren eines Arrays aus einem DGV
    Vielleicht nicht aus dem DGV selbst, aber möglicherweise aus der zugrunde liegenden DataTable.
    Ich habe jetzt keine passende Testumgebung zur Hand, aber ich könnte wetten, dass da zumindest die Rows oder die Columns eine ToArray-Property haben.
    Dann kannst du dir zumindest die innere Schleife sparen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --