2016-06-20 9 views
0

ich diesen Code versucht haben, die eine Guss Ausnahme auslöst:Wie die Daten in einem Datagridview in einem EPPlus ExcelWorksheet bekommen

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

Ausnahme:

System.InvalidCastException: Kann nicht das Objekt werfen vom Typ 'System.Windows.Forms.BindingSource', um 'Microsoft.Office.Interop.Excel.DataTable' einzugeben.

Ich brauche ein DataTable das Arbeitsblatt zu setzen:

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

Die Fehlermeldung scheint klar genug zu sein. Die 'DataSource'-Eigenschaft eines' DataGridView' kann eine von verschiedenen Typen sein, ein möglicher Typ ist 'DataTable' und ein anderer ist' BindingSource'. Ihre Vermutung ist vermutlich eine BindingSource. – Blackwood

+0

Ja, die 'DataSource' ist' BindingSource'. Ich brauche eine 'DataTable', um die Daten im Arbeitsblatt zu setzen. (Ich habe zu Frage hinzugefügt). –

+0

Interessant, dass 'dataTable' ist' Microsoft.Office.Interop.Excel.DataTable' anstelle von 'System.Data.DataTable' - Ich glaube nicht, dass Sie die Interop-Assemblies mit EPPlus verweisen müssen, aber Sie müssen diese Deklaration beheben . Ist die 'BindingSource' ebenfalls eine' DataTable', 'DataSet' oder etwas anderes, da es' DataSource' ist? Es kann so einfach wie sein Dim DatTable als System.Data.DataTable = DirectCast (DirectCast (DataGridView.DataSource, BindingSource) .DataSource, System.Data.DataTable), aber ich glaube nicht, dass Sie uns genügend Informationen gegeben haben sicher wissen. – Mark

Antwort

1

Wenn Sie nicht die DataSource zu einem DataTable direkt umwandeln können, können Sie die sichtbaren Daten im DataGridView zu einem neuen DataTable mit der folgenden Routine extrahieren :

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 

Verbrauch:

Dim dtbNew As DataTable = Dgv2Dtb(dgvMyDataGridView)