Excel自动化VB6客户端应用程序与C#客户端应用程序的性能

时间:2011-08-05 18:12:02

标签: c# performance excel vb6 automation

我花了很多时间将一些旧的VB6 / * .xla代码转换为C#应用程序,现在我发现自己已经把自己挖成了一个主要的性能漏洞。似乎从C#(VS 2010)自动化Excel会产生某种主要的性能影响。我在测试VB6应用程序中编写了“精确”代码,并在大约1-2秒内运行计算。 C#中的代码需要一分钟。代码的一般流程就像这样......(其中Client是VB6或C#应用程序)。

- 仅在客户端应用程序的生命周期内完成一次

  1. 客户端创建并打开Excel应用程序

  2. 客户端自动化Excel以加载计算所需的加载项。

    - 完成每项计算

  3. 客户端自动化Excel以关闭任何现有的* .xls文件并打开所需的* .xls文件。

  4. 使用ExcelAppObject.Run(“AddIn.xla!GetConfiguration”)从Excel中添加客户端调用宏以获取在步骤3中打开的* .xls配置。

  5. 客户端使用ExcelAppObject.Run(“AddIn.xla!LoadInputs”,InputsXmlString)从Excel中调用宏

    1. 宏将InputsXmlString加载到MSXML.DOMDocument40对象中。
    2. 宏转为Application.Calculation = xlCalculationManual(加快填充几个'表'的输入)
    3. 宏设置Application.EnableEvents = false
    4. 宏循环“输入”工作表上的所有“已配置”输入/表并清除它们(如果传入的xml不包含“所有”输入)
    5. 宏循环所有传入的xml并加载到“输入”工作表上的适当位置。
  6. 使用ExcelAppObject.Run(“AddIn.xla!GetResults”,DataXmlString)

    从Excel中调用客户端调用宏
    1. 宏将DataXmlString加载到MSXML.DOMDocument40对象中。
    2. 宏在“输入”工作表上循环所有“已配置”的数据值并清除它们(如果传入的xml不包含“所有”数据或清除以前的计算)
      这与LoadInputs不同,因为我们可以进行批量计算,其中每次计算的输入都相同,但每次计算的“参与者数据”显然不同
    3. 宏将DataXmlString中的所有数据加载到“输入”工作表
    4. 上的相应位置
    5. 宏设置Application.EnableEvents = true
    6. 宏转为Application.Calculation = xlCalculationAutomatic(以确保在加载所有数据/输入后进行计算)
    7. 宏循环所有已配置的“结果单元格”并通过Xml字符串返回它们。
  7. 正如您所看到的,对于每次计算,我只有三次从客户端到Excel的“跨进程”调用(GetConfiguration,LoadInputs和GetResults),以尝试最小化已知的“差”性能问题。问题是,当从VB6应用程序调用完全相同的代码时,步骤4-6需要大约2秒钟。当客户端应用程序是C#应用程序时,4-6需要大约70秒。当我将计算重新设置为自动时,此70秒的所有发生在步骤6上。

    C#应用程序是否存在已知问题,使Excel与旧版VB6应用程序自动化和/或是否有任何建议的解决方案以便我可以保留我的C#代码但不知何故实现与VB6相同的性能?

1 个答案:

答案 0 :(得分:0)

从性能的角度来看,使用C#通过COM Interop与Excel进行交互通常非常差: 我建议如果你想继续使用C#,你可以看看Excel DNA或Addin Express,这两种方法都可以让你使用C#中更快的XLL interace。 见http://fastexcel.wordpress.com/2011/07/07/excel-udf-technology-choices-snakes-ladders-with-vba-vb6-net-c-com-xll-interop/ 我简要评估了当前可用于与Excel交互的技术选择。

C#的主要性能瓶颈通常是将数据从Excel传输到C#:每次数据传输调用都会产生很大的开销,因此使用数组传输大块数据通常要快得多。