有没有一种更快的方法来访问VSTO / Excel

时间:2018-12-03 19:44:13

标签: c# excel com vsto excel-addins

我正在用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对象,并且发生了某种托管->非托管接口的事情,可能是进程间通信之类的事情,所以我并不感到有些开销,但是我我仍然对它加起来多少感到惊讶。

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

例如,在上述情况下,我正在访问同一对象的三个属性。我忍不住想,必须有某种方法可以一次性阅读所有内容,例如通过本地伴侣加载项之类的东西??

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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