首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB6客户端应用程序与C#客户端应用程序的Excel自动化性能

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

Stack Overflow用户
提问于 2011-08-05 18:12:02
回答 1查看 824关注 0票数 0

我花了很多时间将一些旧的VB6 / *.xla代码转换成C#应用程序,现在我发现自己陷入了一个主要的性能漏洞。从C# (VS 2010)自动化Excel似乎对性能有一定的影响。我已经在测试VB6应用程序中编写了“精确”代码,计算运行时间约为1-2秒。因为C#中的代码需要超过一分钟的时间。代码的一般流程类似于这个…(客户端为VB6或C#应用程序)。

--只在客户端应用程序的生存期内执行一次

Excel创建并打开Application

  • Client,
  1. 自动加载计算所需的外接程序。

performed

  • Client -为每个计算完成的自动关闭任何现有的*.xls文件并打开所需的*.xls文件。

  • 客户端从Excel调用宏,使用ExcelAppObject.Run( "AddIn.xla!GetConfiguration“)来获得第3步打开的*.xls配置。

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

代码语言:javascript
复制
1. The macro loads InputsXmlString into MSXML.DOMDocument40 object.
2. **The macro turns Application.Calculation = xlCalculationManual (to speed up populating several 'tables' of inputs)**
3. The macro sets Application.EnableEvents = false
4. The macro loops all 'configured' inputs/tables on the 'Input' worksheet and clears them (in case the passed in xml doesn't contain 'all' inputs)
5. The macro loops all xml passed in and loads into appropriate locations on the 'Input' worksheet.

  1. 客户端使用ExcelAppObject.Run( "AddIn.xla!GetResults",DataXmlString )

从Excel调用宏

代码语言:javascript
复制
1. The macro loads DataXmlString into MSXML.DOMDocument40 object.
2. The macro loops all 'configured' data values on the 'Input' worksheet and clears them (in case the passed in xml doesn't contain 'all' data or clearing out previous calculation)

--这与LoadInputs不同,因为我们可以进行批量计算,每次计算的输入是相同的,但是“参与者数据”对于每一次计算显然是不同的。

3.宏将来自DataXmlString的所有数据加载到“输入”工作表上的适当位置。

4.宏集Application.EnableEvents = true

5. 宏将Application.Calculation = xlCalculationAutomatic (以确保所有数据/输入都已加载)

6.宏循环所有配置的“结果单元格”,并通过Xml字符串返回它们。

因此,您可以看到,对于每一次计算,我只有三个从客户端到Excel的“跨进程”调用(GetConfiguration、LoadInputs和GetResults),以尽量减少已知的“差”性能问题。问题是,当从VB6应用程序调用相同的代码时,步骤4-6需要大约2秒。当客户端应用程序是C#应用程序时,4-6大约需要70秒.所有这70秒发生在步骤6,当我将计算转回自动。

C#应用程序自动化Excel与传统的VB6应用程序是否存在已知的问题?或者是否存在任何建议的工作方法,以便保留VB6代码,但以某种方式实现与VB6相同的性能?

EN

回答 1

Stack Overflow用户

发布于 2011-08-07 15:20:03

从性能的角度来看,使用C#通过continue与C#进行交互通常是非常糟糕的:我建议,如果您想继续使用Excel或Addin,则可以使用Excel或Addin,这两种方法都使您能够使用C#中速度更快的C#。有关我对当前可用的与Excel交互的技术选择的简要评估,请参见http://fastexcel.wordpress.com/2011/07/07/excel-udf-technology-choices-snakes-ladders-with-vba-vb6-net-c-com-xll-interop/

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6960768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档