gefilterte BindingSource exportieren

  • VB.NET
  • .NET 5–6

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

    gefilterte BindingSource exportieren

    Hallo Leute
    Vor einer Weile habe ich mir mal eine Funktion geschrieben um die (gefilterten) Daten meiner DGVs zu exportieren. Also es wird das was der User gerade in einem DGV mit DataBinding ans Dts sieht exportiert.
    Hierbei greife ich allerdings die Daten direkt aus dem DGV ab.
    Da ist ja zum einen unsauber (da im Control rumzufuschen, statt die Daten aus der Bindingsource zu nehmen) und es hat den Nachteil, dass der User nur die Spalten exportieren kann, die das DGV auch anzeigt.

    Nun bin ich dabei das ganze etwas zu säubern. Die Export Daten sollen nun aus der Bindingsource kommen und nicht mehr aus dem DGV.
    Mein Ansatz liefert auch schon eine korrekte csv, bzw. Exceldatei.
    Aber an einer Stelle habe ich so meine Probleme:

    VB.NET-Quellcode

    1. Private Function startcsvExportDataSet(ExportColsList As List(Of DataColumn), strDelimiter As String, Source As BindingSource, DGV As DataGridView) As Boolean

    Ich übergebe der Exportfunktion eine Liste mit zu exportierenden Spalten (diese kann der User vorher auswählen), das Trennzeichen (für csv), die Bindingsource des DGV, und (leider auch) das Das DGV selbst.

    Denn innerhalb der Sub habe ich folgendes Problem:
    Ich muss ja mit dem doppelten DirectCast auf meine typisierte Datarow Casten:

    VB.NET-Quellcode

    1. ​ row1 = DirectCast(DirectCast(Source.Item(i), DataRowView).Row, DtsSettings.ArticleRow)

    hier muss ich ja aber angeben um welche DataRow es sich handelt - also hier DtsSettings.ArticleRow.
    Dies Suche ich mir bisher anhand einer Select Case Anweisung anhand des DGV - aber das muss doch sauberer gehen.
    Bekomme ich diese DtsSettings.Datarow irgendwie aus der Bindingsource?

    VB.NET-Quellcode

    1. For i = 0 To Source.Count - 1
    2. For Each col In ExportColsList
    3. Select Case DGV.Name
    4. Case = "ArticleDataGridView"
    5. row1 = DirectCast(DirectCast(Source.Item(i), DataRowView).Row, DtsSettings.ArticleRow)
    6. Case = "DTAddressbookDataGridView"
    7. row1 = DirectCast(DirectCast(Source.Item(i), DataRowView).Row, DtsSettings.PersonRow)
    8. End Select
    9. If Not row1(col.ColumnName).ToString Is Nothing Then
    10. csvFile &= row1(col.ColumnName).ToString() & strDelimiter
    11. Else
    12. csvFile &= strDelimiter
    13. End If
    14. Next
    15. For j = 1 To strDelimiter.Length
    16. charDelimiter = strDelimiter(strDelimiter.Length - j)
    17. csvFile = csvFile.TrimEnd(charDelimiter)
    18. Next
    19. csvFile &= Environment.NewLine
    20. Next
    Wozu castest Du überhaupt? row1 kann doch eh nur als DataRow deklariert sein. Welche Rolle spielt es in Deinem Snippet, von welchem Typ genau?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Edit: Jo. Beim Korrekturlesen meines Posts ist es mir aufgefallen. Steht ja da warum es nicht funktioniert, war nur zu doof es warzunehemn :o)
    System.InvalidCastException: "Das Objekt des Typs "[b]System.Data.DataRowView[/b]" kann nicht in Typ "System.Data.DataRow" umgewandelt werden."
    Ich habe nun Dim row1 As DataRowView und row1 = DirectCast(Source.Item(i), DataRowView)
    dann gehts natürlich - so wie VS es mir ja auch erklärt hat :o)
    Ich nehme an, genau das meintest du auch?

    Originalpost:
    Spoiler anzeigen
    Ich habe
    row1 = Source.item(i) und
    row1 = DirectCast(Source.Item(i), DataRow) versucht.
    Das erste geht natürlich nicht wegen der Konvertierung von Object in Datarow.
    Aber auch das zweite wirft mir zur Laufzeit den Fehler:
    System.InvalidCastException: "Das Objekt des Typs "System.Data.DataRowView" kann nicht in Typ "System.Data.DataRow" umgewandelt werden."

    Für mich ist der Grund des Castens im obigen Post in Zeile2:

    VB.NET-Quellcode

    1. For Each col In ExportColsList

    ExportColsList enthält die Column.Names der enstprechenden DataTables (ich glaube darum muss ich auch auf die entsprechende DataRow casten).

    Hier der komplette Code (Sorry für die Nachreichung :)

    Edit2: Code gelöscht wegen Irrelevanz.

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

    Nee, kann ich nicht nachvollziehen, weil keine row1-Deklaration angegeben war. Steht ja nirgends in Post#1, dass row1 ein DataRowView ist. In Post#1 ist auch gar nichts von einer Exception zu lesen. Sondern nur, dass Du Deine Exportfunktion ohne DGV machen wolltest. Deswegen: ?(
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ups. Ich bitte um Verzeihung :)
    Im Code habe ich Zeile 18 Dim row1 as datarow durch Zeile 19 Dim row1 as DataRowView ersetzt.
    Dann funktioniert ow1 = DirectCast(Source.Item(i), DataRowView) und ich kann mir das doppelte Casten auf die DtsSettings.DataRow sparen.
    Das meintest du doch (wenn ja nerve ich gleich mit dem nächsten. hihi)

    Hier der Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function startcsvExportDataSet(ExportColsList As List(Of DataColumn), ExportColsNames As List(Of String), strDelimiter As String, Source As BindingSource) As Boolean
    2. Dim charDelimiter As Char
    3. Dim Path = My.Computer.FileSystem.SpecialDirectories.Desktop
    4. Dim csvFile As String = ""
    5. For i = 0 To ExportColsList.Count - 1
    6. csvFile &= ExportColsNames(i) & strDelimiter
    7. Next
    8. For i = 1 To strDelimiter.Length
    9. charDelimiter = strDelimiter(strDelimiter.Length - i)
    10. csvFile = csvFile.TrimEnd(charDelimiter)
    11. Next
    12. csvFile &= Environment.NewLine
    13. 'Dim row1 as DataRow
    14. Dim row1 As DataRowView
    15. For i = 0 To Source.Count - 1
    16. For Each col In ExportColsList
    17. row1 = DirectCast(Source.Item(i), DataRowView)
    18. If Not row1(col.ColumnName).ToString Is Nothing Then
    19. csvFile &= row1(col.ColumnName).ToString() & strDelimiter
    20. Else
    21. csvFile &= strDelimiter
    22. End If
    23. Next
    24. For j = 1 To strDelimiter.Length
    25. charDelimiter = strDelimiter(strDelimiter.Length - j)
    26. csvFile = csvFile.TrimEnd(charDelimiter)
    27. Next
    28. csvFile &= Environment.NewLine
    29. Next
    30. My.Computer.FileSystem.WriteAllText(Path & "\test.csv", csvFile, False)
    31. Return True
    32. End Function


    Edit: Ich hau das nächste Problem mal doch gleich raus, weil könnte sein, dass das zusammenhängt.
    Beim Export mancher DataTables gibt es Verweise auf andere Tables.
    Bei den Artikeln z.B. wird auf Category und ProductGroup verweisen. Mit meinem Code steht natürlich nur die ID dort. Hier muss natürlich der Name hin.
    Dazu habe ich ja dann aber wieder keine Wahl als auf die entsprechende DtsSettings.DataRow doppelt zu casten.
    Das versuche ich so (Beispiel für Category):

    VB.NET-Quellcode

    1. For i = 0 To Source.Count - 1
    2. For Each col In ExportColsList
    3. row1 = DirectCast(Source.Item(i), DataRowView)
    4. If col.ColumnName = "CategoryID" Then
    5. If Not row1(col.ColumnName).ToString Is Nothing Then
    6. csvFile &= GetChildRowName(DirectCast(row1(col.ColumnName), DataRowView), col.ColumnName) & strDelimiter
    7. Else
    8. csvFile &= strDelimiter
    9. End If
    10. Else
    11. If Not row1(col.ColumnName).ToString Is Nothing Then
    12. csvFile &= row1(col.ColumnName).ToString() & strDelimiter
    13. Else
    14. csvFile &= strDelimiter
    15. End If
    16. End If
    17. Next
    18. Private Function GetChildRowName(Row As DataRowView, Colname As String) As String
    19. Dim value As String
    20. Select Case Colname
    21. Case = "CategoryID"
    22. Dim CastedRow = DirectCast(DirectCast(Row, DataRowView).Row, DtsSettings.ArticleRow)
    23. value = CastedRow.CategoryRow.Name
    24. End Select
    25. Return value
    26. End Function


    Zur Laufzeit erhalte ich aber den Fehler: System.InvalidCastException: "Das Objekt des Typs "System.Int32" kann nicht in Typ "System.Data.DataRowView" umgewandelt werden." in Zeile 6.
    Ey. Wo ist da eine Int32? Oo

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

    In Zeile 6 steht: DirectCast(row1(col.ColumnName), DataRowView. Da aber eine DataTable nur ein paar einfache Datentypen kennt, wirst Du diese Stelle nicht in ein DataRowView bekommen. An der Stelle hast Du eine ID. Und zwar die ID, die in der verbundenen Tabelle auf eine bestimmte Zeile zugreift. Du bekommst also ein INT32-Wert - einen Integer. Und ein Integer lässt sich nunmal nicht in eine DataRowView konvertieren. Einfaches Beispiel:

    Quellcode

    1. Tabelle1: Personen
    2. ID Name
    3. -1 Adam
    4. -2 Berta
    5. -3 Cäsar


    Quellcode

    1. Tabelle1: Adressen
    2. ID Name PersonenID
    3. -1 Augsburg -3
    4. -2 Berlin -1
    5. -3 Celle -2


    Der Verweis ist als Hinterlegung der Personen-ID hinterlegt. Du siehst, dass Du gar nicht direkt auf die Person zugreifst, sondern nur über die hinterlegte ID.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nunja. Vom DGV Export habe ich mich verabschieded und exportiere nun die Daten über die entsprechende Bindingsource.
    So habe ich den Vorteil, dass ich einen eventuell vorhandenen BS.Filter automatisch verwenden kann (also nur das exportiert wird was der User auch sieht).
    Außerdem kann ich alle Spalten der DataTable exportieren und nicht (wie bisher) eben nur die, die im DGV angezeigt werden (in manchen DGVs sind das sehr wenig).
    Und hinzu kommt, dass der DGV Export merklich langsamer ist (bei 10.000 Export Einträgen).

    Also es funktioniert ja alles. Nur kann ich jetzt eben z.B. die Category exportieren (Verweis auf die CategoryTable), was vorher garnicht ging (weil nicht im DGV angezeigt)
    Nur steht eben im Export die ID statt des Namens. Weil ich ja quasi nur die Fremdschlüssel ID im Dts speichere.
    Aus diesem Grund wollte ich meine row1 ( row1 = DirectCast(Source.Item(i), DataRowView) in die entsprechende typisierte DataRow casten, um über die Beziehung der beiden Tables den Category.Name zu bekommen.
    Aber das scheint ja nicht zu gehen :(

    So wie ich das sehe, hab ich nun 4 Möglichkeiten:
    1. Die row1 wieder von vornherein als typisierte Row casten (so wie in Post1):

    VB.NET-Quellcode

    1. Select Case DGV.Name
    2. Case = "ArticleDataGridView"
    3. row1 = DirectCast(DirectCast(Source.Item(i), DataRowView).Row, DtsSettings.ArticleRow)
    4. Case = "DTAddressbookDataGridView"
    5. row1 = DirectCast(DirectCast(Source.Item(i), DataRowView).Row, DtsSettings.PersonRow)
    6. End Select

    Anhand dieser row1 müsste ich ja dann mit Beziehungen arbeiten können. Aber mir erscheint die Übergabe des DGV zum aufdröseln in was gecastet werden muss wohl eher ineffizient und irgendwie doof.
    Dann stellen sich aber wieder die Fragen aus Post1

    2. Anhand der CategoryID in der CategoryTable den entsprechenden Wert suchen und mir daher den Namen holen (glaube das ist das angenehmste)

    3. für jede Spalte mit Fremdschlüssel eine extra berechnete Spalte anlegen: Parent(FK_ArticleSupplier_article).Name (hier mit Lieferanten, die gibts schon, damit der Name im DGV angezeigt werden kann.
    Allerdings hätte ich dann eine Menge neuer Spalten (ca. 10), das kann ja nur für den Zweck das ich eventuell mal was davon exportiere nicht gut sein.

    4. Ich klammere alle Spalten mit Fremdschlüssel beim export aus (das ist aber nur die Notlösung)
    Wenn über die BindingSource laufen soll, musst du eine generische Methode schreiben, damit du den Datentyp als Typparameter mitgeben kanns.
    ausserdem musst du für FK-Spalten eine anonyme Methode basteln und mitgeben, welche den richtigen Wert aus der verknüpften Tabelle ermittelt.
    na viel Vergnügen.

    DerSmurf schrieb:

    Nur steht eben im Export die ID statt des Namens. Weil ich ja quasi nur die Fremdschlüssel ID im Dts speichere. Aus diesem Grund wollte ich meine row1 ( row1 = DirectCast(Source.Item(i), DataRowView) in die entsprechende typisierte DataRow casten, um über die Beziehung der beiden Tables den Category.Name zu bekommen. Aber das scheint ja nicht zu gehen
    Doch, klar. Sobald Du die typisierte Row hast, kannst Du auch auf deren ParentRow zugreifen. Und somit auf eine Spalte und deren Wert der ParentRow.
    Wenn Du aber auf die ChildRow zugreifst, gibt es ja theoretisch immer mehrere Rows. Wie ist denn Dein Datenmodell. Was ist Parent, was ist Child?
    Lösung 2 ist daher möglich, aber ineffizient, weil es eben auch direkt geht, wie gerade erwähnt. Lösung 3 ist noch umständlicher. Lösung 4 ist daher von vornherein irrelevant.

    Aber mal grundsätzlich: Die BS enthält ja erstmal trotz gesetztem Filter alle Daten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hmm.
    Bei euch beiden klingt das alles so kompliziert, was ich hier bereits gemacht habe.
    Aber alles geht, einfacher als ich mir das gedacht habe. Also habe ich hier irgendwie großen Mist fabriziert, oder ich drücke mich mit "Export über BindingSource" schlecht aus
    Ich haue hier mal meine gesamte ExportKlasse rein. Hoffe das reicht euch.
    Wenn ihr eine Demoanwendung braucht bitte sagen:

    Außerdem ein Bild meines DataSets (Im Beispiel oben geht es um die CategoryTable - ganz rechts und die ArticleTable - links daneben)
    Ich glaube Category ist der Parent und Article das Child.

    Aufrufsub:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub TSExport_Click(sender As Object, e As EventArgs) Handles TSExport.Click
    2. Dim Export As New clsDGVexport
    3. With Export
    4. Select Case True
    5. Case TCMain.SelectedTab Is TPAddressbook
    6. .startDataSetExport(DtsSettings.Person, DTAddressbookDataGridView)
    7. Case TCMain.SelectedTab Is TPArticles
    8. .startDataSetExport(DtsSettings.Article, ArticleDataGridView)
    9. Case TCMain.SelectedTab Is TPOrders
    10. .startDataSetExport(DtsSettings.Order, OrderDataGridView)
    11. Case TCMain.SelectedTab Is TPCustomerOrders
    12. .startDataSetExport(DtsSettings.CustomerOrder, CustomerOrderDataGridView)
    13. Case TCMain.SelectedTab Is TPPasswords
    14. .startDataSetExport(DtsSettings.Passwords, PasswordsDataGridView)
    15. Case TCMain.SelectedTab Is TPReclamations
    16. .startDataSetExport(DtsSettings.Reclamation, ReclamationDataGridView)
    17. Case Else
    18. Dim Messageform As New frmMessage
    19. With Messageform
    20. .SetDisplayText = "hier gibt es nichts zum exportieren."
    21. .SetDisplayTime = 2
    22. .SetAutoClose = True
    23. .Show()
    24. End With
    25. End Select
    26. End With
    27. End Sub


    ExportKlasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports OfficeOpenXml
    3. Public Class clsDGVexport
    4. Public Sub startDataSetExport(DataTable As DataTable, DGV As DataGridView)
    5. Dim AllColsList As New List(Of DataColumn)
    6. Dim ExportColsList As New List(Of DataColumn)
    7. Dim DecimalCols As New List(Of Integer)
    8. Dim DateCols As New List(Of Integer)
    9. Dim NumberCols As New List(Of Integer)
    10. Dim ExportColsNames As New List(Of String)
    11. Dim strDelimiter As String
    12. Dim Exportcsv As Boolean
    13. For Each col As DataColumn In DataTable.Columns
    14. If col.ColumnName = "ID" Then Continue For
    15. If col.ColumnName = "SupplierID" And (DGV.Name = "ArticleDataGridView" Or DGV.Name = "ReclamationDataGridView") Then Continue For
    16. AllColsList.Add(col)
    17. Next
    18. Using ChooseColumns As New frmChooseColDataSet
    19. With ChooseColumns
    20. .SetAllColsList = AllColsList
    21. .ShowDialog()
    22. ExportColsList = ._ExportColsList
    23. ExportColsNames = ._ExportColsNames
    24. strDelimiter = ._Delimiter
    25. Exportcsv = ._Exportcsv
    26. If .DialogResult <> DialogResult.OK Then Exit Sub
    27. End With
    28. End Using
    29. If Exportcsv Then
    30. If startcsvExportDataSet(ExportColsList, ExportColsNames, strDelimiter, DirectCast(DGV.DataSource, BindingSource)) Then
    31. MessageBox.Show("csv Export erfolgreich.")
    32. End If
    33. Else
    34. DecimalCols = GetDecimalCols(ExportColsList)
    35. DateCols = GetDateCols(ExportColsList)
    36. NumberCols = GetNumberCols(ExportColsList)
    37. ExcelexportDataSet(ExportColsList, ExportColsNames, DecimalCols, DateCols, NumberCols, DirectCast(DGV.DataSource, BindingSource))
    38. MessageBox.Show("xlsx Export erfolgreich.")
    39. End If
    40. End Sub
    41. Private Function GetNumberCols(ExportColsList As List(Of DataColumn)) As List(Of Integer)
    42. Dim NumberCols As New List(Of Integer)
    43. 'Spalten zum Zahlenformatieren
    44. For i = 0 To ExportColsList.Count - 1
    45. Select Case ExportColsList(i).ColumnName
    46. Case = "Tax" : NumberCols.Add(i + 1)
    47. Case = "Amount" : NumberCols.Add(i + 1)
    48. Case = "EAN" : NumberCols.Add(i + 1)
    49. End Select
    50. Next
    51. Return NumberCols
    52. End Function
    53. Private Function GetDecimalCols(ExportColsList As List(Of DataColumn)) As List(Of Integer)
    54. Dim DecimalCols As New List(Of Integer)
    55. 'Spalten zum Dezimalformatieren
    56. For i = 0 To ExportColsList.Count - 1
    57. Select Case ExportColsList(i).ColumnName
    58. Case = "ListPrice" : DecimalCols.Add(i + 1)
    59. Case = "Discount" : DecimalCols.Add(i + 1)
    60. Case = "PurchasingPrice" : DecimalCols.Add(i + 1)
    61. Case = "SalesMargin" : DecimalCols.Add(i + 1)
    62. Case = "RetailPrice" : DecimalCols.Add(i + 1)
    63. Case = "OldPurchasingPrice" : DecimalCols.Add(i + 1)
    64. Case = "OldSellingPrice" : DecimalCols.Add(i + 1)
    65. Case = "Net19" : DecimalCols.Add(i + 1)
    66. Case = "Net7" : DecimalCols.Add(i + 1)
    67. Case = "Total" : DecimalCols.Add(i + 1)
    68. Case = "Price" : DecimalCols.Add(i + 1)
    69. Case = "" : DecimalCols.Add(i + 1)
    70. End Select
    71. Next
    72. Return DecimalCols
    73. End Function
    74. Private Function GetDateCols(ExportColsList As List(Of DataColumn)) As List(Of Integer)
    75. Dim DateCols As New List(Of Integer)
    76. 'Spalten zum Datumsformatieren
    77. For i = 0 To ExportColsList.Count - 1
    78. Select Case ExportColsList(i).ColumnName
    79. Case = "LastCalculation" : DateCols.Add(i + 1)
    80. Case = "LastCalculationSP" : DateCols.Add(i + 1)
    81. Case = "OrderDate" : DateCols.Add(i + 1)
    82. Case = "DeliveryDate" : DateCols.Add(i + 1)
    83. Case = "InvoiceReceive" : DateCols.Add(i + 1)
    84. Case = "InvoiceDate" : DateCols.Add(i + 1)
    85. Case = "OrderDate" : DateCols.Add(i + 1)
    86. Case = "Ordered" : DateCols.Add(i + 1)
    87. Case = "Called" : DateCols.Add(i + 1)
    88. Case = "ReclaDate" : DateCols.Add(i + 1)
    89. Case = "DoneDate" : DateCols.Add(i + 1)
    90. End Select
    91. Next
    92. Return DateCols
    93. End Function
    94. Private Function startcsvExportDataSet(ExportColsList As List(Of DataColumn), ExportColsNames As List(Of String), strDelimiter As String, Source As BindingSource) As Boolean
    95. Dim charDelimiter As Char
    96. Dim Path = My.Computer.FileSystem.SpecialDirectories.Desktop
    97. Dim csvFile As String = ""
    98. For i = 0 To ExportColsList.Count - 1
    99. csvFile &= ExportColsNames(i) & strDelimiter
    100. Next
    101. For i = 1 To strDelimiter.Length
    102. charDelimiter = strDelimiter(strDelimiter.Length - i)
    103. csvFile = csvFile.TrimEnd(charDelimiter)
    104. Next
    105. csvFile &= Environment.NewLine
    106. Dim row1 As DataRowView
    107. For i = 0 To Source.Count - 1
    108. For Each col In ExportColsList
    109. row1 = DirectCast(Source.Item(i), DataRowView)
    110. If Not row1(col.ColumnName).ToString Is Nothing Then
    111. csvFile &= row1(col.ColumnName).ToString() & strDelimiter
    112. Else
    113. csvFile &= strDelimiter
    114. End If
    115. Next
    116. For j = 1 To strDelimiter.Length
    117. charDelimiter = strDelimiter(strDelimiter.Length - j)
    118. csvFile = csvFile.TrimEnd(charDelimiter)
    119. Next
    120. csvFile &= Environment.NewLine
    121. Next
    122. My.Computer.FileSystem.WriteAllText(Path & "\test.csv", csvFile, False)
    123. Return True
    124. End Function
    125. Private Function ExcelexportDataSet(ExportColsList As List(Of DataColumn), ExportColsNames As List(Of String), DecimalCols As List(Of Integer), DateCols As List(Of Integer),
    126. NumberCols As List(Of Integer), Source As BindingSource) As Boolean
    127. Dim Path = My.Computer.FileSystem.SpecialDirectories.Desktop
    128. Dim RowCounter = 0
    129. Dim ColCounter = 0
    130. Using ExcelPackage As New ExcelPackage()
    131. ExcelPackage.Workbook.Properties.Created = DateTime.Now
    132. Dim worksheet As ExcelWorksheet = ExcelPackage.Workbook.Worksheets.Add("Seite 1")
    133. For i = 0 To ExportColsList.Count - 1
    134. worksheet.Cells(1, i + 1).Value = ExportColsNames(i)
    135. Next
    136. Dim row1 As DataRowView
    137. For i = 0 To Source.Count - 1
    138. RowCounter += 1
    139. ColCounter = 0
    140. For Each col In ExportColsList
    141. row1 = DirectCast(Source.Item(i), DataRowView)
    142. If Not row1(col.ColumnName).ToString() Is Nothing Then
    143. ColCounter += 1
    144. worksheet.Cells(i + 2, ColCounter).Value = row1(col.ColumnName)
    145. End If
    146. Next
    147. Next
    148. 'Dezimal formatieren
    149. For Each Col In DecimalCols
    150. worksheet.Cells(2, Col, RowCounter, Col).Style.Numberformat.Format = "#,##0.00"
    151. Next
    152. 'Datum formatieren
    153. For Each Col In DateCols
    154. worksheet.Cells(2, Col, RowCounter, Col).Style.Numberformat.Format = "dd.MM.yyyy"
    155. Next
    156. 'Zahlen formatieren
    157. For Each Col In NumberCols
    158. worksheet.Cells(2, Col, RowCounter, Col).Style.Numberformat.Format = "0.##"
    159. Next
    160. worksheet.Cells(worksheet.Dimension.Address).AutoFitColumns()
    161. Dim fi As FileInfo = New FileInfo(Path & "\File.xlsx")
    162. ExcelPackage.SaveAs(fi)
    163. End Using
    164. Return True
    165. End Function
    166. End Class
    Bilder
    • dts.png

      144,4 kB, 1.920×1.080, 36 mal angesehen