高效将大量数据导出到Excel的方法

在Web上进行简单搜索,能找到许多示例,展示了如何将数据复制到Excel单元格中。然而,当面临大量数据时,这些方法就显得力不从心了。本文将介绍一种新的方法,通过使用剪贴板来提高数据导出的效率和应用性能。

传统的方法是逐个单元格地将值复制到Excel中。详细的方法可以在之前的文章中找到。但这种方法在处理大量数据时效率低下。

新方法

将从两个不同的角度来解释新方法:从DataGridView导出数据和从DataTable导出数据。这两种情况是大多数开发者经常遇到的。

DataGridView控件允许将选中的网格内容复制到剪贴板,使用其GetClipboardContent方法。单元格的内容以不同的格式复制到剪贴板:作为制表符和逗号分隔的文本,以及作为HTML格式的表格(使用DataFormats类在Clipboard的SetData方法中)。

根据DataGridView的ClipboardCopyMode属性,复制的文本可能包含或不包含行和列标题文本:

  • 如果ClipboardCopyMode是Disable,则禁用复制功能。
  • 如果ClipboardCopyMode是EnableAlwaysIncludeHeaderText,则复制的文本将包括所选单元格的值以及包含所选单元格的行和列的标题。
  • 如果ClipboardCopyMode是EnableWithAutoHeaderText,则复制的文本将包括所选单元格的值。只有当至少选择了一个标题时,行和列标题才会包含在复制的文本中。
  • 如果ClipboardCopyMode是EnableWithoutHeaderText,则复制的文本将只包含所选单元格的值,而不包含行和列标题。

需要提供一种方法,无论选中了什么内容,都能复制整个网格的内容。以下是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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485