【问题标题】:How can I speed-up creating excel Excel spreadsheets from C#?如何加快从 C# 创建 excel Excel 电子表格的速度?
【发布时间】:2011-09-28 19:33:21
【问题描述】:

我目前正在使用带有 C# COM Interop 的 Excel 2007 编写大约 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();
}

澄清:我现在正在单独填充每个单元格

我会尝试你的一些建议,然后接受最好的解决方案。

【问题讨论】:

  • 没有看到您的“填写数据表”代码(或至少是合理的传真),很难给出建议。
  • 您正在使用进程外 COM,这会为每个单独的调用增加大量开销。一个简单的属性 getter 可以慢 10,000 倍。您可以通过最大限度地减少调用次数或在 Excel 中将代码作为加载项运行来加快速度。
  • 为了操作 Excel,我退出了 .NET 并重新开始编写常规 COM 对象。总体而言,“用户可见”开销更少(UI 响应更快),因为调用进程中 COM 对象的方法只是一个虚函数调用。进程内 .NET 使用一些编组(并且您有 .NET 运行时开销),而进程外 .NET 非常慢。特别是当您使用大量方法调用时。如果您正在编写 Excel 工作表,为什么不直接编写它们呢?它们只是 XML 文件,应该很容易手动查看。
  • 这基本上是 EPPlus 正在做的 - 因此它非常快。查看 XML 以手工制作它们需要的不仅仅是使用库。

标签: c# performance excel com-interop


【解决方案1】:

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

【讨论】:

  • @weismat,EPPlus 太棒了。不要重新发明轮子!
  • 我试用了 EPPlus,并且喜欢它的性能和 API。由于 API 非常相似,只需不到一个小时即可更改我的程序。明天我会添加准确的性能数据,但这只是过去的一小部分(比以前快 8-10 倍)。
  • 我现在做了数学计算,它实际上快了 23 倍。
  • @weismat,你也应该测试一下@Daniel's solution,看看 that 快了多少倍。 :)
  • 请注意,EPPlus 是 GPL。他声称它是 LGPL,但由于它仍然是 ExcelPackage 的衍生作品,因此它仍然是 GPL,就像它的前身一样。如果您在商业包中使用它,从技术上讲,您的产品也必须作为开源发布。
【解决方案2】:

您可以将 8 到 10 列的 1000 行视为一个数组,然后一次性将数据复制到该数组中,而不是单独填充这 8000 到 10000 个单元格中的每一个,从而加快这一速度。更多信息请看这里:Write Array to Excel Range

【讨论】:

    【解决方案3】:

    您是否考虑过使用 C# 工具,例如 NPOI
    它运行良好,并且不需要您使用 COM Interop。
    Scott Mitchell 写了关于它recently

    【讨论】:

      【解决方案4】:

      我不会使用 Excel 应用程序来执行此操作,而是使用库直接从 c# 编写它:Create Excel (.XLS and .XLSX) file from C#

      更快。

      Rgds GJ

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多