Попытка получить внутренний SheetId в VSTO для помощи в обнаружении переименования листа - PullRequest
0 голосов
/ 16 января 2019

В настоящее время я кеширую информацию для формул на листах в моем дополнении. Когда на листе есть изменения, они фиксируются, так что кэш обновляется. Я видел, что нет надежного способа определить, когда меняется имя листа, поэтому я проделал некоторую работу, чтобы посмотреть, что изменилось при добавлении, перемещении вкладок и т. Д.

Создавая свою книгу в файле .zip и просматривая workbook.xml, я обнаружил следующую структуру:

<sheets>
   <sheet r:id="rId1" sheetId="2" name="POC2"/>
   <sheet r:id="rId2" sheetId="1" name="POC1"/>
</sheets>

Есть ли что-то, чего мне не хватает, или этот подход кажется надежным?

Кажется, что sheetId доступен, и на него не влияют изменение порядка вкладок и другие операции. Я думаю, что я могу использовать этот внутренний идентификатор вместе с именем листа. Если имя листа имеет имя, отличное от имени в кэше, это будет означать, что лист был переименован. Если sheetId больше не существует, лист был удален и т. Д.

У меня вопрос: есть ли в VSTO способ завладеть атрибутом sheetId, если мои другие идеи верны?

Спасибо

Lee

1 Ответ

0 голосов
/ 16 января 2019

Нет, sheetId - это просто атрибут в определении Excel Open XML, поэтому его нельзя запросить кодом из открытого файла Excel.

То, что вы хотите (и является эквивалентом sheetId объектной модели), равно Worksheet.CodeName.

Кодовое имя рабочего листа будет при создании объекта рабочего листа совпадать с именем рабочего листа. Но это не изменяется, когда пользователь меняет имя листа. И при этом это не может быть изменено во время выполнения.

Единственный способ изменить CodeName - это окно Properties редактора кода (VBA или настройка уровня документа VSTO).

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