首页 > 解决方案 > 是否有更快的方法来访问由 VSTO/Excel 公开的对象

问题描述

我正在用 C# 编写很多 Office 加载项,我喜欢所有可以扩展 Excel 功能的绝妙方法。但一直困扰我的一件事是对几乎任何 Office 对象执行几乎任何操作的开销。

我知道有一些高级技巧可以更快地完成许多事情,例如将object[,]数组读取和写入更大的单元格范围而不是访问单个单元格,等等。但无论如何,一个复杂的插件最终总是会访问许多不同的对象,或者是几个对象的许多属性,或者一遍又一遍地访问相同的属性。

在分析我的加载项时,我总是发现我至少花费了 90% 的 CPU 时间来访问 Office 对象的基本属性。例如,这是我用来检查窗口是否已滚动的一些代码,因此我可以相应地更新一些叠加图形:

Excel.Window window = Globals.ThisAddIn.Application.ActiveWindow;

if (window.ScrollColumn != previousScrollColumn)
{
    needsRedraw = true;
    previousScrollColumn = window.ScrollColumn;
}

if (window.ScrollRow != previousScrollRow)
{
    needsRedraw = true;
    previousScrollRow = window.ScrollRow;
}

if (window.Zoom != previousZoom)
{
    needsRedraw = true;
    previousZoom = window.Zoom;
}

第一行,获取活动窗口,以及每个 if 语句,每个访问该窗口的属性,都在分析时亮起。他们真的很慢。

现在我知道这些是托管包装器中的 COM 对象,并且存在某种托管->非托管接口的东西,可能是进程间通信等等,所以我对有一些开销并不感到惊讶,但我仍然感到惊讶它加起来有多少。

那么有什么技巧可以加快这样的速度吗?

例如,在上述情况下,我正在访问同一对象的三个属性。我忍不住想一定有某种方法可以一口气读完它们,比如可能通过原生伴侣插件或其他东西......?

有任何想法吗?

标签: c#excelcomvstoexcel-addins

解决方案


如果可以获取 Open XML,则可以使用 Open XML SDK 或其他相关库加载并遍历它。Word 有这个 ( Range.WordOpenXML) 但我不知道 Excel 是否有。即使这样,也可能并非所有属性都被公开,例如滚动位置可能不存在。


推荐阅读