Существует ли более быстрый способ доступа к объектам, предоставляемым VSTO/Excel?

Я пишу много надстроек Office в C#, и мне нравятся все замечательные способы расширения функциональности особенно Excel. Но одна вещь, которая продолжает вызывать у меня беспокойство, это непроизводительные издержки, связанные с выполнением практически чего угодно, практически любого объекта Office.

Я знаю, что есть высокоуровневые трюки для быстрого выполнения многих задач, таких как чтение и запись. object[,] массивы для большего диапазона ячеек вместо доступа к отдельным ячейкам и т. д. Но независимо от этого, сложная надстройка всегда будет снова и снова обращаться ко множеству различных объектов, ко многим свойствам нескольких объектов или к одним и тем же свойствам.

И при профилировании своих надстроек я всегда нахожу, что трачу не менее 90% своего процессорного времени на доступ к основным свойствам объектов 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 ответ

Если вы можете получить Open XML, вы можете загрузить его и просмотреть его, используя Open XML SDK или другие связанные библиотеки. Слово имеет это (Range.WordOpenXML) но я не знаю, если Excel делает. Даже в этом случае может показаться, что не все свойства доступны, например местоположение прокрутки, вероятно, отсутствует.

Другие вопросы по тегам