在Web上进行简单搜索,能找到许多示例,展示了如何将数据复制到Excel单元格中。然而,当面临大量数据时,这些方法就显得力不从心了。本文将介绍一种新的方法,通过使用剪贴板来提高数据导出的效率和应用性能。
传统的方法是逐个单元格地将值复制到Excel中。详细的方法可以在之前的文章中找到。但这种方法在处理大量数据时效率低下。
将从两个不同的角度来解释新方法:从DataGridView导出数据和从DataTable导出数据。这两种情况是大多数开发者经常遇到的。
DataGridView控件允许将选中的网格内容复制到剪贴板,使用其GetClipboardContent方法。单元格的内容以不同的格式复制到剪贴板:作为制表符和逗号分隔的文本,以及作为HTML格式的表格(使用DataFormats类在Clipboard的SetData方法中)。
根据DataGridView的ClipboardCopyMode属性,复制的文本可能包含或不包含行和列标题文本:
需要提供一种方法,无论选中了什么内容,都能复制整个网格的内容。以下是VB.NET的代码示例:
Public Sub ExportDataToExcel()
' 设置剪贴板复制模式
DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
DataGridView1.SelectAll()
' 获取网格内容
Dim str As String = TryCast(DataGridView1.GetClipboardContent().GetData(DataFormats.UnicodeText), String)
' 设置剪贴板内容
Clipboard.SetText(str, TextDataFormat.UnicodeText)
' 选择Excel中的单元格范围
With xlWorkSheet
.Range("A1:" & ConvertToLetter(DataGridView1.ColumnCount) & DataGridView1.RowCount).Select()
' 粘贴剪贴板数据
.Paste()
Clipboard.Clear()
End With
End Sub
DataTable没有提供剪贴板功能,但可以通过一些技巧来实现目标。这些技巧包括将datatable列转换为数组,将数组转换为以换行符分隔的单个字符串,然后将转换后的字符串复制到剪贴板中,并粘贴到Excel的特定单元格中。
以下是VB.NET的代码示例:
Public Function ToArray(ByVal dTable As DataTable) As String()
Dim ary() As String = Array.ConvertAll(Of DataRow, String)(dTable.Select(), AddressOf DataRowToString)
Return ary
End Function
Public Function DataRowToString(ByVal dr As DataRow) As String
Return dr(strCommonColumnName).ToString()
End Function
Public Function AryToString(ByVal ary As String()) As String
Return String.Join(vbNewLine, ToArray(dTable))
End Function