65.9K
CodeProject 正在变化。 阅读更多。
Home

批量数据导出到 Excel(从 Datatable 和 Datagridview)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.19/5 (7投票s)

2014年11月14日

CPOL

3分钟阅读

viewsIcon

69044

downloadIcon

2886

以快速有效的方式将海量数据传输到 Excel。

引言

将数据从 .NET 应用程序导出到 Excel 是一项非常常见的需求。在 Web 上进行简单的搜索会找到多个示例,这些示例向我们展示了复制数据并将其放入 Excel 单元格的方法。但是,存在有效负载问题。如果存在大量/海量数据,那么当前方法实际上是无用的。

背景

它正在将值逐个单元格地复制到 Excel 中。该方法的详细解释可以在我的旧文章中找到....
https://codeproject.org.cn/Articles/19840/Export-to-Excel-using-VB-Net

新方法

我将用两种不同的方式解释这种新方法。即

  1. Datagridview 导出数据。
  2. DataTable 导出数据。

是的,这是大多数开发人员广泛需要的。出于目的,我以这两个为例。

简而言之:我使用剪贴板从源复制数据,然后将复制的值粘贴到 Excels 的范围内。它提高了导出过程和应用程序的性能。我.... 认为.... 你们有一些想法了!!! 我说的对吗?
好的伙计们,从详细的解释中,您将了解更多... 我们开始吧....

1. 从 Datagridview 导出数据

DataGridView 允许您使用其 GetClipboardContent 方法将网格中选定的内容复制到剪贴板。单元格的内容以不同的格式复制到剪贴板:作为制表符和逗号分隔的文本以及作为 HTML 格式的表格(在剪贴板的 SetData 方法中使用 DataFormats 类)。根据网格的 ClipboardCopyMode 属性,复制的文本可能包含也可能不包含行和列标题文本

  • 如果 ClipboardCopyModeDisable,则禁用复制功能。
  • 如果 ClipboardCopyModeEnableAlwaysIncludeHeaderText,则复制的文本将包括所选单元格的值以及包含所选单元格的行和列的标题。
  • 如果 ClipboardCopyModeEnableWithAutoHeaderText,则复制的文本将包括所选单元格的值。只有在至少选择一个标题时,行和列标题才会包含在复制的文本中。
  • 如果 ClipboardCopyModeEnableWithoutHeaderText,则复制的文本将包括所选单元格的值,而不包含行和列标题。

我需要提供一种复制整个网格内容的方法,而不管选择了什么。代码非常简单。下面我将复制 datagridview 中的所有数据,包括列名(标题)和 Unicode 内容,并将复制的数据从头开始粘贴到 Excel 中。稍后,我从剪贴板内存中清除复制的数据。这种方法简单快捷地将数据从 datagridview 导出到 Excel。

'Data transfer from grid to Excel.  
With xlWorkSheet     
    .Range("A1", misValue).EntireRow.Font.Bold = True     
    'Set Clipboard Copy Mode     
    DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText     
    DataGridView1.SelectAll()

    'Get the content from Grid for Clipboard     
    Dim str As String = TryCast(DataGridView1.GetClipboardContent().GetData(DataFormats.UnicodeText), String)
    
    'Set the content to Clipboard     
    Clipboard.SetText(str, TextDataFormat.UnicodeText)

    'Identify and select the range of cells in Excel to paste the clipboard data.     
    .Range("A1:" & ConvertToLetter(DataGridView1.ColumnCount) & DataGridView1.RowCount, misValue).Select()

    'Paste the clipboard data     
    .Paste()     
    Clipboard.Clear() 
End With

2. 从 DataTable 导出数据

Datatable 不提供剪贴板功能。但是有一些技巧可以帮助我们实现目标。这些技巧是将 datatable 列转换为数组,将数组转换为由换行符分隔的单个 string,然后将转换后的 string 作为文本复制到剪贴板并将其粘贴到特定的单元格中。听起来像转换.. 转换... 转换... 是的,它非常简单,我们根本不会使用 FOR..Next 循环。检查转换方法,使用 “ToArray” 方法将 datatable 列转换为数组,使用 “AryToString” 方法将数组转换为单个 string

'Method convert datacolumn to array  
Public Function ToArray(ByVal dr As DataTable) As String()     
    Dim ary() As String = Array.ConvertAll(Of DataRow,String)(dr.Select(), AddressOf DataRowToString)   
Return ary End Function

Public Function DataRowToString(ByVal dr As DataRow) As String     
    Return dr(strCommonColumnName).ToString() 
End Function

'Method convert Array to string 
Public  Function AryToString(ByVal ary As String()) As String     
    Return String.Join(vbNewLine, ToArray(dTable)) 
End Function

这些方法有助于从 datatable 列数据创建一个单个 string。新的 string 将被复制到剪贴板并粘贴到 Excel 中特定选定的单元格范围中。以下代码为您提供了有关从数据库快速批量传输到 Excel 的更多信息。

'Set the content from datatable (which is converted as array and again converted as string) 
Clipboard.SetText(AryToString(ToArray(dTable))) 

'Identifiy and select the range of cells in Excel to paste the clipboard data. 
xlWorkSheet.Range(ConvertToLetter(col + 1) & "1").EntireColumn.Select() 

'Paste the clipboard data 
xlWorkSheet.Paste() 
Clipboard.Clear()

关注点

  • 没有按行循环
  • 使用剪贴板机制
  • 快速数据传输
  • 提高应用程序性能

历史

本文的先前版本是导出到 Excel(用于最小数据)
https://codeproject.org.cn/Articles/19840/Export-to-Excel-using-VB-Net

© . All rights reserved.