Автоматическое обновление поля формулы после создания документа Open XML Word


У меня есть библиотека, которая генерирует документы Word с помощью OpenXML SDK, одной из функций библиотеки является генерация таблиц с формулами в последней строке (например, SUM(ABOVE)).

Word имеет эти встроенные функции, но при создании документа я должен предположить, что Word не установлен на машине.

Проблема в том, что если я просто создам таблицу и поле формулы, оно не будет обновляться автоматически при открытии документа, пользователь будет нужно открыть документ и вручную выбрать "обновить поле" для функции, которая будет вычисляться.

Есть ли способ сделать это в коде (без необходимости вычислять функцию вручную)?

3 4

3 ответа:

Нет, это сделано специально. Дополнительные сведения см. В разделе , какие поля обновляются при открытии, переназначении или печати документа.

Это верно и для любого ручного ввода (например, если бы у вас было 10 в A1, 10 в A2, вставлено =SUM(ABOVE) в A3, у вас было бы 20. Но если вы изменили A1 на 15, A3 не будет обновляться автоматически, пока вы не сделаете это вручную).

Единственный способ обойти это-создать надстройку (VSTO, VBA и т. д.) чтобы потопить событие Document_Open на клиентских компьютерах и запустить некоторый код чтобы обновить все поля или создать приложение взаимодействия на сервере, которое открывает документ, визуализирует его с некоторым кодом, а затем сохраняет его перед отправкой дальше.

Вы видели этот класс, UpdateFieldsOnOpen. (https://msdn.microsoft.com/en-us/library/cc861799 ) он должен принудительно обновить все поля при первом открытии документа с помощью приложения, которое может его обновить (например, Word).

Я предполагаю, что каждое поле, имеющее флаг Dirty, установленный в true, получит обновление, но не цитируйте меня на это ;)

Вы можете установить значение UpdateFieldsOnOpen, при открытии документа Word спросит вас, что вы хотите обновить. Смотрите эту статью для получения более подробной информации: http://www.samuraiprogrammer.com/blog/2010/08/09/OpenXMLHowToRefreshAFieldWhenTheDocumentIsOpened.aspx