【问题标题】:Is there a faster way to access objects exposed by VSTO/Excel是否有更快的方法来访问由 VSTO/Excel 公开的对象
【发布时间】:2019-05-05 03:53:42
【问题描述】:

我正在用 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# excel com vsto excel-addins


    【解决方案1】:

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

    【讨论】:

    • 遗憾的是,Excel 似乎没有这样的属性。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多