Есть ли в SpreadsheetML способ заставить Excel пересчитывать формулы (и другие зависимости) при открытии документа?

Насколько я понимаю, ячейки с формулами в Microsoft Office Excel могут содержать вычисляемые значения при сериализации и сохранении в форматах Office Open XML (в частности, SpreadsheetML). Это, скорее всего, относится к другим типам зависимостей и функций значений из других ячеек (например, диаграммам, сводным таблицам и т. д.). Я, скорее всего, делаю что-то не так, но при обработке этих XML-документов (SpreadsheetML) внешними инструментами, которые не используют какие-либо компоненты .Net или аналогичные API-интерфейсы, предоставляемые MS, а просто напрямую манипулируют XML, я сталкиваюсь с проблемой, что при изменении некоторое содержимое одного из рабочих листов Excel по-прежнему будет использовать последние сгенерированные значения в ячейках, содержащих формулы. Поэтому, когда пользователь открывает сгенерированную электронную таблицу, он видит измененные данные, но все вычисляемые поля устарели. Теперь единственное, что я смог найти (в эти дни) в Интернете, было это:

http://openxmldeveloper.org/discussions/formats/f/14/p/1561/4164.aspx

Это действительно нежелательное решение, особенно если оно применимо к любым вычисляемым ячейкам и объектам (диаграммам и т. д.), поскольку это означает частичную повторную реализацию некоторого процессора SpreadsheetML, когда вы точно не знаете структуру всех рабочих листов.

Я бы надеялся, что в Excel обязательно будет опция или конфигурация в одной из частей SpreadsheetML для принудительного пересчета или пометки ячеек как грязных, но я пока не смог ее найти.

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


person Bohdan Tsymbala    schedule 16.03.2012    source источник


Ответы (3)


Самый простой способ - удалить вычисленное значение из ячейки (как также указано в предоставленной вами ссылке).

Вам не обязательно знать точную структуру рабочих листов. Просто удалите все вхождения <v>#VALUE!</v> в worksheets/sheet1.xml (чтобы другие функции не пострадали).

person fmguler    schedule 29.03.2012

нажмите F9, чтобы пересчитать все открытые книги Пересчет Excel

person gogogirl    schedule 16.03.2012
comment
Мне нужно, чтобы это делалось автоматически без взаимодействия с пользователем (кроме того, что он открывает). - person Bohdan Tsymbala; 16.03.2012

Возможно, ваш режим расчета для рабочей книги устанавливается на ручной. Установите для этого режима автоматический режим при открытии книги, установив для него значение null в коде следующим образом:

    public  void SetAutomaticCalculationMode(WorkbookPart workbookPart1)
    {
        Workbook workbook1 = workbookPart1.Workbook;

        CalculationProperties calculationProperties1=workbook1.GetFirstChild<CalculationProperties>();
        calculationProperties1.CalculationMode = null;
    }

Это будет соответствовать режиму автоматического расчета, как показано в параметрах клиента Excel 2007: введите здесь описание изображения

person Taterhead    schedule 16.03.2012