【问题标题】:Excel Object Model Performance issue (cross appdomain and threading)Excel 对象模型性能问题(跨应用程序域和线程)
【发布时间】:2011-04-28 16:47:39
【问题描述】:

我正在用 VB 中的 VS2010 为 Office 2007 编写 Excel 插件,在与 PowerPoint 中的 Excel 对象模型交互时,我遇到了严重的性能问题。 请在下面找到一个基本测试来证明问题(sub test())。

我们以 4 种不同的方式尝试了这段代码,得到了不同的结果:

  1. 直接从 PowerPoint 调用 Excel 对象模型:平均 13 秒
  2. 通过 Excel 插件托管的 WCF 服务从 PowerPoint 调用此代码:平均 9 秒
  3. 通过计时器从 Excel 插件调用此代码(启动时,等待 20 秒并启动 test()):9 秒
  4. 通过功能区按钮直接从 Excel 插件调用代码:800 毫秒

我可以理解为什么 1. 很慢,因为代码与 Excel 不在同一个 AppDomain 中。 我也可以理解为什么 2. 和 3. 很慢,因为代码没有在 Addin Thread 中执行。 但我想不出任何其他解决方案来解决我的性能问题。

最后我有两个问题

1) 当我说方法 2 和 3 由于多线程而慢时,我是否走在正确的轨道上?

2) 一般而言,我怎样才能在 .Net 应用程序中使用 Excel 对象模型而不会出现这样的性能损失。

提前感谢您提出的任何想法。

尼古拉斯

 Public Sub test(ByVal appE As Excel.Application)

  Dim chrono As New System.Diagnostics.Stopwatch

  chrono.Start()

  appE.Interactive = False

  appE.ScreenUpdating = False
  Dim wb As Excel.Workbook = appE.ActiveWorkbook
  Dim ws As Excel.Worksheet = wb.ActiveSheet
  Dim rng As Excel.Range = ws.Cells(1, 1)


  Dim nbit As Integer = 10000
  For i = 1 To nbit
   rng.Value = i
  Next
  appE.ScreenUpdating = True

  appE.Interactive = true

  chrono.Stop()


  MsgBox(chrono.ElapsedMilliseconds.ToString + " " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString)

 End Sub

【问题讨论】:

    标签: vb.net multithreading excel powerpoint


    【解决方案1】:

    .Net 使用 Excel 的性能目前很差,每次引用 Excel 对象模型都会产生非常高的开销。
    因此,加快此过程的一种方法是收集您想要传输到数组中的所有数据,并在对对象模型的一次调用中将其传输。

    【讨论】:

      【解决方案2】:

      我们在 Excel 对象模型中遇到了类似的性能问题。我们改用 MS ACE 驱动程序来读取 Excel。性能现在很棒,尽管我们遇到了一些问题,例如处理注册表中的 typeguessrows 标志。可用的文档不多,因此我们一直非常依赖 Microsoft 支持团队。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        相关资源
        最近更新 更多