Hallo Community,
Ich hab in meiner Applikation die Möglichkeit, die Inhalt einer DatagridView nach Excel zu exportieren.
Bei geringen Datenmengen funktioniert dies wunderbar, bei höheren Datenmengen (~500 Zeilen mit ca 16 Spalten) kann dies jedoch einige Sekunden dauern.
Dabei kann ich auch in der GUI derweil nichts machen.
Hier mein Code:
Habt ihr Ideen was ich in Bezug auf Performance besser machen könnte?
Würde ein zusätzlicher BackgroundWorker hier Sinn machen?
Liebe Grüße
Ich hab in meiner Applikation die Möglichkeit, die Inhalt einer DatagridView nach Excel zu exportieren.
Bei geringen Datenmengen funktioniert dies wunderbar, bei höheren Datenmengen (~500 Zeilen mit ca 16 Spalten) kann dies jedoch einige Sekunden dauern.
Dabei kann ich auch in der GUI derweil nichts machen.
Hier mein Code:
Quellcode
- Public Shared Sub exportDGV(dgv As DataGridView)
- ' return
- If dgv Is Nothing Or dgv.RowCount = 0 Then
- Exit Sub
- End If
- ' init variables for export
- Dim x_app As Excel.Application
- Dim x_workbook As Excel.Workbook
- Dim x_worksheet As Excel.Worksheet
- Dim misValue As Object = System.Reflection.Missing.Value
- Dim i As Integer
- Dim j As Integer
- ' init save file dialog
- Dim sfd_export As New SaveFileDialog
- sfd_export.Filter = "Excel Worksheet|*.xlsx |All Files|*.*"
- sfd_export.Title = "Save an Excel File"
- sfd_export.FileName = "result.xlsx"
- If sfd_export.ShowDialog() = Windows.Forms.DialogResult.OK Then
- ' create new excel objects
- x_app = New Excel.Application
- x_workbook = x_app.Workbooks.Add(misValue)
- x_worksheet = x_workbook.ActiveSheet
- ' set header
- For col As Integer = 0 To dgv.Columns.Count - 1
- x_worksheet.Cells(1, col + 1).Value = dgv.Columns(col).HeaderText
- x_worksheet.Cells(1, col + 1).Font.Bold = True
- Next
- ' some of the dgv have a last empty row, those we want to exclude
- Dim last_row_dgv = 0
- If dgv(0, dgv.RowCount - 1).Value Is Nothing Then
- last_row_dgv = 1
- End If
- ' fill data
- For i = 0 To dgv.RowCount - 1 - last_row_dgv
- For j = 0 To dgv.ColumnCount - 1
- x_worksheet.Cells(i + 2, j + 1) = dgv(j, i).Value.ToString()
- Next
- Next
- ' save to file
- Try
- x_worksheet.SaveAs(sfd_export.FileName)
- Catch ex As Exception
- Finally
- x_workbook.Close()
- x_app.Quit()
- End Try
- ' release objects
- releaseObject(x_app)
- releaseObject(x_workbook)
- releaseObject(x_worksheet)
- MessageBox.Show("Export successfully performed!", "Info")
- End If
- End Sub
Habt ihr Ideen was ich in Bezug auf Performance besser machen könnte?
Würde ein zusätzlicher BackgroundWorker hier Sinn machen?
Liebe Grüße