Selektierte DGV-Zeilen nach Excel exportieren

  • VB.NET

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

    Selektierte DGV-Zeilen nach Excel exportieren

    Hallo Zusammen,

    mit folgendem Code wird das DGV nach Excel exportiert.

    VB.NET-Quellcode

    1. Dim xls_Appl As Excel.Application ' Excel Anwendung
    2. Dim xls_Mappe As Excel.Workbook ' Excel Arbeitsmappe
    3. Dim xls_Blatt As Excel.Worksheet ' Excel Blatt (Tabelle)
    4. Dim Anzahlzeilen As Integer
    5. xls_Appl = New Excel.Application() ' Excel Instanz bilden
    6. xls_Appl.Visible = True
    7. xls_Mappe = xls_Appl.Workbooks.Add()
    8. xls_Blatt = xls_Mappe.ActiveSheet
    9. 'hier muß der Name des zu exportierenden DataGridViews rein
    10. With dgv
    11. For Spalte As Integer = 0 To .Columns.Count - 1
    12. xls_Blatt.Cells(1, Spalte + 1).Value = .Columns(Spalte).HeaderText
    13. xls_Blatt.Cells(1, Spalte + 1).Font.Bold = True
    14. Next
    15. Anzahlzeilen = .SelectedRows.Count
    16. If .AllowUserToAddRows = True Then
    17. Anzahlzeilen = Anzahlzeilen - 1 ' Leerzeile abziehen
    18. End If
    19. For Zeile As Integer = 0 To Anzahlzeilen - 1
    20. For Spalte As Integer = 0 To .Columns.Count - 1
    21. xls_Blatt.Cells(Zeile + 2, Spalte + 1).Value _
    22. = .Rows(Zeile).Cells(Spalte).Value.ToString
    23. Next
    24. Next
    25. End With


    In Zeile 18 Anzahlzeilen = .SelectedRows.Count liegt das Problem.
    .Rows.Count für den Export aller Zeilen funktioniert.
    Ich möchte aber eben nur die markierten Zeilen exportieren.

    Das Problem ist nun, egal, welche Zeilen ich markiere, er exportiert immer die Anzahl ab der ersten Zeile.
    Selektiere ich also die Zeilen 12,13,14, exportiert er 1, 2 und 3

    Wo mache ich den Fehler?

    Gruß Madde


    EDIT: Kommando zurück = .Rows(Zeile).Cells(Spalte).Value.ToString muss natürlich auch .SelectedRows heißen. Der Export funktioniert nun ABER die Reihenfolge ist nicht von klein nach groß.
    Soll heißen, ziehe ich die Markierung von oben nach unten auf, wird von groß nach klein exportiert, ziehe ich von unten nach oben, entsprechend von klein nach groß.
    Wie kann hier immer von klein nach groß exportiert werden?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Madde“ ()

    Madde schrieb:



    EDIT: Kommando zurück = .Rows(Zeile).Cells(Spalte).Value.ToString muss natürlich auch .SelectedRows heißen. Der Export funktioniert nun ABER die Reihenfolge ist nicht von klein nach groß.
    Soll heißen, ziehe ich die Markierung von oben nach unten auf, wird von groß nach klein exportiert, ziehe ich von unten nach oben, entsprechend von klein nach groß.
    Wie kann hier immer von klein nach groß exportiert werden?

    Warum machst Du nicht statt:

    Visual Basic-Quellcode

    1. For Spalte As Integer = 0 To .Columns.Count - 1
    2. xls_Blatt.Cells(1, Spalte + 1).Value = .Columns(Spalte).HeaderText
    3. xls_Blatt.Cells(1, Spalte + 1).Font.Bold = True
    4. Next

    nicht dies:

    Visual Basic-Quellcode

    1. For Spalte As Integer = 1 To .Columns.Count
    2. xls_Blatt.Cells(1, Spalte).Value = .Columns(Spalte).HeaderText
    3. xls_Blatt.Cells(1, Spalte).Font.Bold = True
    4. Next


    Ich glaube nicht, dass Du die Reihenfolge der ausgewählten Zeilen auslesen kannst.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Die DataGridViewSelectedRowCollection enthält die selektierten Reihen in umgekehrter Selektierreihenfolge.
    Um sie in die gleich Reihenfolge wie im DataGridView zu bringen, kann man sie nach dem .Index sortieren.

    VB.NET-Quellcode

    1. Dim MySelectetRows As List(Of DataGridViewRow) = (From row In .SelectedRows.Cast(Of DataGridViewRow)() Where Not row.IsNewRow Order By row.Index).ToList()
    2. For Zeile As Integer = 0 To MySelectetRows.Count - 1
    3. For Spalte As Integer = 0 To .Columns.Count - 1
    4. CType(xls_Blatt.Cells(Zeile + 2, Spalte + 1), Excel.Range).Value = MySelectetRows(Zeile).Cells(Spalte).Value.ToString()
    5. Next
    6. Next