Установите xlsx для пересчета формул на открытом
Я генерирую файлы xlsx и не хочу вычислять значения всех формул во время этого процесса.
То есть, я хотел бы установить <v>
в 0 (или опустить) для ячеек с <f>
, и Excel заполнит значения, когда он будет открыт.
Одно из предложений заключалось в том, что при запуске выполнялся макрос Calculate
, но не удалось найти полное руководство о том, как сделать это с помощью подписанных макросов, чтобы избежать запроса пользователя. Флаг, который вы можете установить где-то в xlsx, будет намного лучше.
Изменить: я не ищу ответы, которые связаны с использованием программ Office для внесения изменений. Я ищу подробности в формате файла.
Ответы
Ответ 1
Модуль Python XlsxWriter устанавливает для значения формулы <v>
значение 0 (если только фактическое значение не известно) и <calcPr>
fullCalcOnLoad
атрибут true в файле xl/workbook.xml
:
<calcPr fullCalcOnLoad="1"/>
Это работает для всех версий Excel и OpenOffice, LibreOffice, Google Docs и Gnumeric, которые я тестировал.
Место, в котором он не будет работать, - это приложения без электронной таблицы, которые не могут пересчитать значение формулы, например, просмотр файлов.
Ответ 2
Если режим вычисления установлен на автоматический, Excel всегда (повторно) вычисляет книги в открытом доступе.
Итак, просто создайте свои файлы с режимом расчета, установленным на "Автоматически".
В xl/workbook.xml
добавьте следующую node в книгу node:
<calcPr calcMode="auto"/>
Также проверьте Описание того, как Excel определяет текущий режим расчета.
Вы можете использовать макросы, как было предложено, однако вы создадите менее безопасную и менее совместимую рабочую книгу, не избегая взаимодействия пользователя, чтобы заставить вычислять.
Если вы решите использовать VBA, вы можете Application.Calculate
в событии Workbook_Open
.
Ответ 3
В вашем XML-содержимом просто опустите объект <v>
в каждой ячейке с формулой, это заставит Ms Excel реализовать формулу, независимо от параметров Excel.
Вместо:
<c r="B2" s="1">
<f>SUM(A1:C1)</f>
<v>6</v>
</c>
Есть:
<c r="B2" s="1">
<f>SUM(A1:C1)</f>
</c>
Если вам нужно актуализировать формулу в уже заданном XML-содержимом, вы можете легко закодировать небольшой парсер, который ищет каждый объект <c>
. Если объект <c>
имеет объект <f>
, а затем удаляет его объект <v>
.