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

Я пишу много надстроек 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 Ответ

0 голосов
/ 05 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...