Установите 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>.