快速导出 DataSet 到 Excel
一种将大量数据从 DataSet 快速导出到 Excel 的方法。

引言
将数据从 .NET 应用程序导出到 Excel 是一个非常常见的需求。在网上简单搜索,会发现许多示例展示了将数据复制并放入 Excel 单元格的方法。然而,这种方法存在一个问题:每次将值放入 Excel 单元格都需要一次 InterOp 调用。如果需要传输的数据量很大,就会出现性能问题。有没有更好的方法来完成这个任务?
传统的“逐单元格复制”方法
在网上搜索将数据传输到 Excel 的方法时,最常用的方法是将值逐个单元格地复制到 Excel 中。以下 C# 代码展示了如何将数据从 DataTable
传输到 Excel 工作表,逐个单元格地复制每个值
// Copy the values from a DataTable to an Excel Sheet (cell-by-cell)
for (int col = 0; col < dataTable.Columns.Count; col++)
{
for (int row = 0; row < dataTable.Rows.Count; row++)
{
excelSheet.Cells[row + 1, col + 1] =
dataTable.Rows[row].ItemArray[col];
}
}
每次 InterOp 调用都有相关的性能开销,因此大量数据会导致应用程序性能下降。
一种“快速批量复制”方法
我们的方法是使用 Microsoft Excel 对象库提供的 Range
类的 Value2
属性。我们可以选择一个单元格区域,并使用一次 InterOp 调用为所有单元格分配一个值。为了正确地将值分配给一个单元格区域,我们可以使用一个二维对象数组。以下 C# 代码展示了如何将数据从一个二维对象数组传输到一个单元格区域
// Copy a bi-dimensional object array to an Excel cell range
excelSheet.get_Range("A1:H25", Type.Missing).Value2 =
bidimensionalObjectArray;
测量性能
本文附带的源代码显示了一个小的 Windows 应用程序,它使用这两种描述的方法将相同的数据导出到 Excel。它显示了每种方法完成所需的时间。这个演示程序使用 Northwind 数据库创建一个 SQL Server 本地连接。它生成一个包含 Customers
表内容的 DataSet
。为了使数据量更具意义,我们将 DataTable
复制 24 次。然后,我们将这两种方法应用于生成两个 Excel 文件,每个方法一个。
源代码包含一个 C# 版本和一个 VB.NET 版本的演示应用程序。我自己的测试表明,这种方法大约快 35 倍。请自行测试并得出自己的结论。
历史
- 2007 年 11 月 28 日:首次发布