В SpreadsheetML есть способ заставить Excel пересчитать формулы (и другие зависимости) при открытии документа? - PullRequest
0 голосов
/ 16 марта 2012

Насколько я понимаю, ячейки с формулами в 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.Хотя я нашел довольно много примеров, как вызвать пересчет и как добавить слушатели открытых событий.

Ответы [ 3 ]

1 голос
/ 29 марта 2012

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

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

0 голосов
/ 16 марта 2012

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

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

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

Это будет соответствовать автоматическому режиму расчета, как показано в настройках клиента Excel 2007: enter image description here

0 голосов
/ 16 марта 2012

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

...