如何在C#中加速创建Excel电子表格?

4

我目前使用Excel 2007和C# COM互操作编写了大约200个Excel电子表格。

不幸的是,我需要花费大约4分钟来编写这些200张表格-每张表格大约有1000行,其中包含8-10列。

如何加快速度?

我的代码基本上像这样:

var xlApp = new Excel.Application();
xlApp.DisplayAlerts=false;
foreach (x in z) {
   var wb = xlApp.Workbooks.add(XLWBATemplae.xlWBATWorksheet);
   var ws = (Worksheet)wb.Worksheets[1];
   //fill data into sheet
   wb.SaveAs(fileName);
   wbClose();
}

澄清:目前我正在逐个填写每个单元格。

我将尝试一些你提供的建议,然后选择最佳解决方案。


3
若没有看到你的“数据填写表格”代码(或者至少是类似的代码),很难给出建议。 - dlev
2
您正在使用外部进程的COM,这会给每个单独的调用增加很多开销。一个简单的属性获取器可能会慢上10,000倍。通过最小化调用次数或将代码作为Excel插件运行来提高速度。 - Hans Passant
为了操作Excel,我放弃了.NET并回到编写常规COM对象。总体而言,“用户可见”的开销较少(UI更具响应性),因为调用进程内COM对象的方法只是虚函数调用。进程内.NET使用一些封送处理(并且您有.NET运行时开销),而进程外.NET则非常慢。特别是当您使用大量方法调用时。如果您正在编写Excel工作表,为什么不直接编写它们?它们只是XML文件,手动查看应该相当容易。 - Alexandre C.
这基本上就是EPPlus正在做的事情 - 因此它非常快。手工制作XML需要比使用库更多的时间。 - weismat
5个回答

5
你可以通过使用EPPlus (这里)完全摆脱COM Interop。该库使用2007 XML格式创建Excel文件,而不是Excel COM接口,因此速度更快。

@weismat,EPPlus非常棒。不要重复造轮子! - bzlm
我尝试了EPPlus并喜欢它的性能和API。由于API非常相似,所以只需要不到一个小时就可以更改我的程序。明天我会添加确切的性能数据,但它只是旧时间的一小部分(比之前快8-10倍左右)。 - weismat
1
我现在做了数学计算,实际上速度快了23倍。 - weismat
1
@weismat,你也应该测试一下@Daniel的解决方案,看看它有多快。 :) - bzlm
请注意,EPPlus采用GPL许可证。他声称它是LGPL许可证,但由于它仍然是ExcelPackage的派生作品,因此像其前身一样采用GPL许可证。如果您在商业软件包中使用它,从技术上讲,您的产品也必须以开源方式发布。 - Beep beep

4
您可以将具有8到10列的1000行视为数组,并一次性将数据复制到此数组中,而不是逐个填充其中的8000到10000个单元格,以加快速度。有关更多信息,请参见此处:将数组写入Excel范围

1

你考虑过使用C#工具,例如NPOI吗?
它非常好用,而且不需要使用COM互操作。
Scott Mitchell最近写了一篇关于它的文章recently


0

0
有时候将文件保存为 csv 格式的文本文件就足够了。它可以像普通的 Excel 表格一样被 Excel 打开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接