【发布时间】:2014-01-29 17:56:56
【问题描述】:
我可能是盲人,但这与正常的导出到 Excel 有点不同。我已经创建了一个解决方案,并想知道这是否是最好的方法。或者即使有其他方法可以做到这一点。
背景:WinForms、VisualBasic、VS2012、N-Tier(后端是 DB2)。我的 DTO 是按照 DB2 表的顺序设置的。我的用户希望在 DGV 中按特定顺序查看字段,并能够以相同顺序导出字段。用户还可以重新排列和隐藏列。不应导出隐藏的列。
我的解决方案确实从 dgv 逐个字段复制到 excel。不同之处在于我必须使用 DataGridViewColumnCollection 才能使用 DataGridViewElementStates.Visible 以确保我只导出可见列。
这里是代码。
Private Sub ExportToExcelToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExportToExcelToolStripMenuItem.Click
If((dgv.Columns.Count = 0) Or (dgv.Rows.Count = 0)) Then Exit Sub
Dim XlApp = New Excel.Application With {.Visible = True}
xlApp.Workbooks.Add(Excel.XlSheetType.xlWorksheet)
Dim xlWS = xlApp.ActiveSheet
xlWS.Name = "Exported Data"
'Copy visible data from DGV to Excel
Dim columnCollection As DataGridViewColumnCollection = dgv.Columns
Dim currentVisibleColumn AS DataGridViewColumn = columnCollection.GetFirstColumn(DataGridViewElementStates.Visible)
Dim lastColumnExported As DataGridViewColumn = currentVisibleColumn
Dim visibleColumntCount As Integer = columnCollection.GetColumnCount(DataGridViewElementStates.Visible)
'Finally export the data
For c = 1 to VisibleColumnCount
xlWS.Cells(1,c) = currentVisibleColumn.HeaderText
currentVisibleColumn = columnCollection.GetNextColumn(lastColumnExported, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
lastColumnExported = currentVisibleColumn
Next
'Only export visible cells
For r = 0 To dgv.Rows.Count - 1
'Reset values
currentVisibleColumn = columnCollection.GetFirstColumn(DataGridViewElementStates.Visible)
lastColumnExported = currentVisibleColumn
For c = 1 to visibleColumnCount
Dim value = dgv.Rows(r).Cells(currentVisibleColumn.Index).Value
If value <> vbNullString Then
xlWS.Cells(r + 2, c) = value.ToString()
End If
currentVisibleColumn = columnCollection.GetNextColumn(lastColumnExported, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
lastColumnExported = currentVisibleColumn
Next
Next
'Autosize columns in excel
Dim columns = xlWS.UsedRange.Columns
columns.AutoFit()
End Sub
感谢您的反馈。 布赖恩。
【问题讨论】:
-
您的问题到底是什么?只是“这段代码写得好吗”?
-
问题是,“还有其他更好的方法吗?或者这就是方法?”我第一次遇到这种情况,所以我想确保我做得对。
标签: vb.net winforms visual-studio-2012 datagridview export-to-excel