如何将 DataGridView 中的数据导入 EPPlus ExcelWorksheet

How to get the data in a DataGridView into an EPPlus ExcelWorksheet

我试过这段抛出强制转换异常的代码:

Dim worksheet As ExcelWorksheet = package.Workbook.Worksheets.Add(pageTitle)
Dim dataTable As DataTable
dataTable = dataGridView.DataSource ' cast exception

异常:

System.InvalidCastException: Unable to cast object of type 'System.Windows.Forms.BindingSource' to type 'Microsoft.Office.Interop.Excel.DataTable'.

我需要一个DataTable来设置工作表:

worksheet.Cells("A1").LoadFromDataTable(dataTable, True)

如果您不能将 DataSource 直接转换为 DataTable,您可以使用以下例程将 DataGridView 中的可见数据提取到新的 DataTable

  Public Function Dgv2Dtb(ByVal dgv As DataGridView) As DataTable
    Dim dtbOutput As New DataTable
    For intCol As Integer = 0 To dgv.Columns.Count - 1
      Dim dgvc As DataGridViewColumn = dgv.Columns(intCol)
      Dim dtyCol As System.Type = dgvc.ValueType
      If dtyCol Is Nothing And dgvc.CellType.Name = "DataGridViewTextBoxCell" Then
        dtyCol = GetType(String)
      End If
      Dim dclOutput As DataColumn = New DataColumn(dgvc.HeaderText, dtyCol)
      dtbOutput.Columns.Add(dclOutput)
    Next intCol
    For intRow As Integer = 0 To dgv.Rows.Count - 1
      Dim drwNew As DataRow = dtbOutput.NewRow()
      Dim dgvr As DataGridViewRow = dgv.Rows(intRow)
      For intCol As Integer = 0 To dgv.Columns.Count - 1
        drwNew.Item(intCol) = dgvr.Cells(intCol).Value
      Next intCol
      dtbOutput.Rows.Add(drwNew)
    Next intRow
    Return dtbOutput
  End Function

用法:

Dim dtbNew As DataTable = Dgv2Dtb(dgvMyDataGridView)