Datagridview Export in Excel nur sichtbare spalten

  • VB.NET

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

    Datagridview Export in Excel nur sichtbare spalten

    Hallo zusammen,

    Ich exportiere wie folgt mein DGV in ein Excel file:

    VB.NET-Quellcode

    1. If System.IO.File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Stückliste.xls") Then
    2. Kill(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Stückliste.xls")
    3. End If
    4. Dim xls_Appl As Excel.Application
    5. Dim xls_Mappe As Excel.Workbook
    6. Dim xls_Blatt As Excel.Worksheet
    7. Dim Anzahlzeilen As Integer
    8. xls_Appl = New Excel.Application()
    9. xls_Appl.Visible = False
    10. xls_Mappe = xls_Appl.Workbooks.Add()
    11. xls_Blatt = xls_Mappe.ActiveSheet
    12. 'hier muß der Name des zu exportierenden DataGridViews rein
    13. With Artikel_stuecklisteDataGridView
    14. For Spalte As Integer = 0 To .Columns.Count - 1
    15. xls_Blatt.Cells(1, Spalte + 1).Value = .Columns(Spalte).HeaderText
    16. xls_Blatt.Cells(1, Spalte + 1).Font.Bold = True
    17. Next
    18. Anzahlzeilen = .Rows.Count
    19. If .AllowUserToAddRows = True Then
    20. Anzahlzeilen = Anzahlzeilen - 1 ' Leerzeile abziehen
    21. End If
    22. For Zeile As Integer = 0 To Anzahlzeilen - 1
    23. For Spalte As Integer = 0 To .Columns.Count - 1
    24. xls_Blatt.Cells(Zeile + 2, Spalte + 1).Value() _
    25. = .Rows(Zeile).Cells(Spalte).Value()
    26. Next
    27. Next
    28. End With
    29. xls_Appl.DisplayAlerts = False 'vor dem Speichern - vermeidet eventuelle Dialoge
    30. xls_Mappe.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Stückliste.xls")
    31. xls_Appl.Quit()


    Nun würde ich gerne nur diejenige Spalten Exportieren die auch Sichtbar sind.

    Kann mir jemand helfen?
    Hab es wie folgt angepasst:

    VB.NET-Quellcode

    1. Me.Artikel_stuecklisteBindingSource.Sort = "id ASC"
    2. If ((Artikel_stuecklisteDataGridView.Columns.Count = 0) Or (Artikel_stuecklisteDataGridView.Rows.Count = 0)) Then Exit Sub
    3. Dim XlApp = New Excel.Application With {.Visible = True}
    4. XlApp.Workbooks.Add(Excel.XlSheetType.xlWorksheet)
    5. Dim xlWS = XlApp.ActiveSheet
    6. xlWS.Name = "Stückliste"
    7. 'Copy visible data from DGV to Excel
    8. Dim columnCollection As DataGridViewColumnCollection = Artikel_stuecklisteDataGridView.Columns
    9. Dim currentVisibleColumn As DataGridViewColumn = columnCollection.GetFirstColumn(DataGridViewElementStates.Visible)
    10. Dim lastColumnExported As DataGridViewColumn = currentVisibleColumn
    11. Dim visibleColumnCount As Integer = columnCollection.GetColumnCount(DataGridViewElementStates.Visible)
    12. 'Finally export the data
    13. For c = 1 To visibleColumnCount
    14. xlWS.Cells(1, c) = currentVisibleColumn.HeaderText
    15. currentVisibleColumn = columnCollection.GetNextColumn(lastColumnExported, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
    16. lastColumnExported = currentVisibleColumn
    17. Next
    18. 'Only export visible cells
    19. For r = 0 To Artikel_stuecklisteDataGridView.Rows.Count - 1
    20. 'Reset values
    21. currentVisibleColumn = columnCollection.GetFirstColumn(DataGridViewElementStates.Visible)
    22. lastColumnExported = currentVisibleColumn
    23. For c = 1 To visibleColumnCount
    24. Dim value = Artikel_stuecklisteDataGridView.Rows(r).Cells(currentVisibleColumn.Index).Value
    25. If value <> vbNullString Then
    26. xlWS.Cells(r + 2, c) = value.ToString()
    27. End If
    28. currentVisibleColumn = columnCollection.GetNextColumn(lastColumnExported, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
    29. lastColumnExported = currentVisibleColumn
    30. Next
    31. Next
    32. 'Autosize columns in excel
    33. Dim columns = xlWS.UsedRange.Columns
    34. columns.AutoFit()
    35. XlApp.DisplayAlerts = False 'vor dem Speichern - vermeidet eventuelle Dialoge
    36. xlWS.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "/" & Id_anlageTextBox1.Text & " - Stückliste.xls")

    Bei der Spaltenüberschrift Funktioniert es.
    Alles darunter leider nicht.
    Guten Morgen HenryV

    Vielen dank für diene Hilfe, das war die lösung für mein Problem,
    Nun hat sich noch ein 2. Problem herausgestellt.
    In meinem Datagridview hat es Comboboxen die Werte von einer anderen Tabelle anhand der ID anzeigen.

    Nun ist das Problem das er mir nicht den "Display Member" sondern der "Value Member" ausgiebt.

    Gibt es hierfür auch eine lösung?

    schnibli schrieb:

    Gibt es hierfür auch eine lösung?
    Das wird etwas haarig.
    Du müsstest die entsprechenden Values in eine separate Tabelle derselben Excel-Datei speichern.
    Vielleicht fängst Du anders herum an:
    Mach Dir eine Excel-Datei, die dieselbe Funktionalität hat, wie Dein DGV, insbesondere dieselben Verknüpfungen, also wenn Du auf eine ComboBox klickst, werden hi und da dieselben Inhalte angezeigt.
    Mit diesem Wissen kannst Du dann Dein Problem deutlich besser formulieren und lösen bzw. Dir beim Lösen helfen lassen.
    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!