locked
Exceldatei aus DataGridView schreiben RRS feed

  • Frage

  • Hallo zusammen,

    Ich möchte aus meinem DataGridView eine Exceldokument exportieren.

    Dies können auch 500 Zeilen und 20 Spalten sein.

    Gibt es so eine Funktion die ich irgendwoher Importieren kann?

    Bei meinem verwendeten Code dauert es sehr lange bzw. kommt es zu Fehlern bei großen Tabellen:

     SaveFileDialog1.Filter = "Excel Document (*.xlsx)|*.xlsx"
     Dim xlApp As Microsoft.Office.Interop.Excel.Application
                    Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook
                    Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet
                    Dim misValue As Object = System.Reflection.Missing.Value
                    Dim i As Integer
                    Dim j As Integer
    
                    xlApp = New Microsoft.Office.Interop.Excel.Application
                    xlWorkBook = xlApp.Workbooks.Add(misValue)
                    xlWorkSheet = xlWorkBook.Sheets("Tabelle1")
    
                    For i = 0 To DataGridView2.RowCount - 2
                        For j = 0 To DataGridView2.ColumnCount - 1
                            For k As Integer = 1 To DataGridView2.Columns.Count
                                xlWorkSheet.Cells(1, k) = DataGridView2.Columns(k - 1).HeaderText
                                xlWorkSheet.Cells(i + 2, j + 1) = DataGridView2(j, i).Value.ToString()
                            Next
                        Next
                    Next
    
                    xlWorkSheet.SaveAs(SaveFileDialog1.FileName)
                    xlWorkBook.Close()
                    xlApp.Quit()
    
                    releaseObject(xlApp)
                    releaseObject(xlWorkBook)
                    releaseObject(xlWorkSheet)
    
                    MsgBox("Erfolgreich gespeichert" & vbCrLf & "Datei gespeichert unter : " & SaveFileDialog1.FileName, MsgBoxStyle.Information, "Information")
    
    
       Private Sub releaseObject(ByVal obj As Object)
            Try
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
            Finally
                GC.Collect()
            End Try
        End Sub

    Liebe Grüße

    Johannes


    Viele Grüße Johannes Harzer

    Donnerstag, 17. September 2020 11:37

Antworten

  • Hi,

    in VB wird " in einem String verdoppelt:

    thecsvfile = thecsvfile & """" & cell.FormattedValue.replace(",", "") & ""","

    Besser sieht man es bspw. hier:

    Dim x As String = """Hallo Welt"""

    Wenn man x ausgibt, wird dann:

    "Hallo Welt"

    zu sehen sein.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    • Bearbeitet Stefan FalzModerator Donnerstag, 17. September 2020 20:19
    • Als Antwort markiert joHarz Freitag, 18. September 2020 08:45
    Donnerstag, 17. September 2020 20:19
    Moderator

Alle Antworten

  • Hi Lohannes,
    eine sehr schnelle Variante auch bei großen Datenmengen ist die Ausgabe als csv-Datei. Diese kann dann problemlos in Excel geöffnet werden. Noch schnelle geht es, wenn nicht auf die DatGridView-Zellen zugegriffen wird, sondern auf die DataSource.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 17. September 2020 12:00
  • Hallo,

    Ich habe schon eine CSV export funktion.

    Dabei habe ich folgendes Problem:

    In meinen Zelle vom DataGridView gibt es Texte mit Zeilenumbruch.

    Im CSV-export wirken sich diese Zeilenumbrüche auch aus --> Trennzeichen für Spalten sind Kommas

    Somit kann ich aus dem CSV-Export keine Exceldatei machen, die den selben innhalt hat wie mein DataGridView.

    Hat jemad eine Lösung für dieses Problem.


    Viele Grüße Johannes Harzer

    Donnerstag, 17. September 2020 12:44
  • Hallo Johannes,

    dafür gibt es die Zeichen, mit denen man die Werte umfassen kann. Bspw. "Hier kommt ein Text". Die sollten in der CSV Datei immer drin stehen, wenn es vorkommen kann, dass irgendwo die Spaltentrennzeichen oder Zeilenumbrüche vorkommen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 17. September 2020 14:54
    Moderator
  • Vielen Dank für die Antwort,

    Hier ist mein Quellcode:

     SaveFileDialog1.Filter = "CSV Document (*.csv)|*.csv"
            If SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                
                'create empty string
                Dim thecsvfile As String = String.Empty
                'get the column headers
                For Each column As DataGridViewColumn In DataGridView2.Columns
                    thecsvfile = thecsvfile & column.HeaderText & ","
                Next
                'trim the last comma
                thecsvfile = thecsvfile.TrimEnd(",")
                'Add the line to the output
                thecsvfile = thecsvfile & vbCr & vbLf
                'get the rows
                For Each row As DataGridViewRow In DataGridView2.Rows
                    'get the cells
                    For Each cell As DataGridViewCell In row.Cells
                        thecsvfile = thecsvfile & cell.FormattedValue.replace(",", "") & ","
                    Next
                    'trim the last comma
                    thecsvfile = thecsvfile.TrimEnd(",")
                    'Add the line to the output
                    thecsvfile = thecsvfile & vbCr & vbLf
                Next
                'write the file
                My.Computer.FileSystem.WriteAllText(SaveFileDialog1.FileName, thecsvfile, False)

    Bedeutet dies, ich muss zwei mal ein """ in die Zeile einfügen?

    thecsvfile = thecsvfile & cell.FormattedValue.replace(",", "") & ","

    allerdings erkennt er es nicht als " im Quellcode

    Danke für eure Hilfe


    Viele Grüße Johannes Harzer

    Donnerstag, 17. September 2020 16:49
  • Hi,

    in VB wird " in einem String verdoppelt:

    thecsvfile = thecsvfile & """" & cell.FormattedValue.replace(",", "") & ""","

    Besser sieht man es bspw. hier:

    Dim x As String = """Hallo Welt"""

    Wenn man x ausgibt, wird dann:

    "Hallo Welt"

    zu sehen sein.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    • Bearbeitet Stefan FalzModerator Donnerstag, 17. September 2020 20:19
    • Als Antwort markiert joHarz Freitag, 18. September 2020 08:45
    Donnerstag, 17. September 2020 20:19
    Moderator
  • Hallo Stefan,

    vielen Dank für die Antwort. Auf dem Fahrrad Richtung Heimat ist mir dann auch eingefallen, dass man das so noch mal ausprobieren hätte können.

    Hat jemand noch eine einfache Methode um aus der CSV-Datei eine .xlsx zu machen? Gibt es da Erfahrungswerte?


    Viele Grüße Johannes Harzer

    Freitag, 18. September 2020 08:55
  • Hallo Johannes,

    aus CSV eine xls oder XLS Datei zu erstellen, geht recht einfach über die JET Engine (auf jedem Windows System vorhanden aber nur 32 Bit und nur für das alte .xls Format) oder über ACE (muss auf so gut wie jedem System noch installiert werden, gibt es für 32 und für 64 Bit, muss zur ggfs. installierten Office Variante passen, kann dafür aber sowohl die alten .xls als auch die neuen .xlsx Formate).

    Codebeispiel muss ich mal schauen, wo ich ein passendes rumliegen habe.

    Wer es etwas komfortabler mag und die Exceldatei bspw. auch mal formatieren oder Formeln, ... verwenden möchte, kann sich auch mal das Syncfusion Excel-Framework anschauen. Die Syncfusion Komponenten gibt es im Rahmen einer Community Lizenz auch für kommerzielle Zwecke kostenlos.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 18. September 2020 10:46
    Moderator