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

快速导出 DataSet 到 Excel

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (49投票s)

2007 年 12 月 1 日

CPOL

2分钟阅读

viewsIcon

374326

downloadIcon

15895

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

Screenshot - FastExporting DEMO App

引言

将数据从 .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 日:首次发布
从 DataSet 快速导出到 Excel - CodeProject - 代码之家
© . All rights reserved.