【问题标题】:Exporting displayed columns in dataGridView to Excel将 dataGridView 中显示的列导出到 Excel
【发布时间】: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


【解决方案1】:

有更简单的方法可以做到这一点,它是在单元格复制过程的每次迭代中执行 if 语句。您询问该索引处的该列是否可见,如果可见则复制,否则您保留该列并继续下一步。

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2013-09-11
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多