Работа с цепочкой вычислений
В этом разделе рассматривается класс Open XML SDK CalculationChain и его связь со схемой SpreadsheetML формата файла Open XML. Дополнительные сведения об общей структуре частей и элементов, составляющих документ SpreadsheetML, см. в разделе Структура документа SpreadsheetML.
Цепочка вычислений в SpreadsheetML
В следующей информации из спецификации ISO/IEC 29500 представлен CalculationChain
элемент (<calcChain/>
).
Экземпляр части этого типа содержит упорядоченный набор ссылок на все ячейки во всех листах книги, значения которых вычисляются по какой-либо формуле. Упорядочение позволяет вычислять взаимосвязанные формулы ячеек в правильном порядке при загрузке листа.
Пакет должен содержать не более одной части "цепочка вычислений".
Корневым элементом для части с таким типом содержимого должен быть элемент calcChain.
Часть "цепочка вычислений" указывает порядок, в котором в последний раз вычислялись ячейки книги. В ней записывается информация только о ячейках, содержащих формулы. В нее не включается информация о зависимом от формулы дереве вычислений. Иначе говоря, часть "цепочка вычислений" не указывает зависимости формул от других значений ячеек; указывается только порядок, в котором были вычислены ячейки.
Какое-либо определенное событие вычисления может привести к переупорядочению или изменению цепочки вычислений. Например, добавление в книгу формул, увеличивающих количество ссылок в части "цепочка вычислений".
Другим примером способа изменения порядка вычислений является частичное вычисление. Частичное вычисление это оптимизация, которая осуществляется приложением для работы с электронными таблицами и при которой вычисляются только ячейки, зависящие от других ячеек, значения которых изменились, и игнорируются другие формулы в книге. Это позволяет избежать многократного повторного вычисления результатов, которые уже известны. Таким образом, если набор формул, который ранее был проигнорирован во время вычисления, теперь требуется вычислить (в связи с изменением значения ячейки), то эти формулы перемещаются на "первое" место в цепочке вычислений, чтобы их можно было вычислить.
Это не обязательно, если приложение для работы с электронными таблицами может загрузить информацию цепочки вычислений. Цепочка вычислений может создаваться в памяти во время загрузки на основе формул и их взаимозависимости, если приложение для работы с электронными таблицами находит эту информацию полезной. Порядок, выраженный в части "цепочка вычислений", не навязывает исполняющему приложению порядок, в котором необходимо выполнять вычисления во время выполнения.
© ISO/IEC 29500: 2016
В следующей таблице перечислены распространенные классы open XML SDK, используемые при работе с классом CalculationChain
.
Элемент SpreadsheetML | Класс пакета SDK Open XML |
---|---|
<c/> |
CalculationCell |
Класс цепочки вычислений пакета SDK Open XML
Класс Open XML SDK CalculationChain
представляет элемент абзаца (<calcChain/>
), определенный в схеме формата файлов Open XML для документов SpreadsheetML. Используйте класс для CalculationChain
управления отдельными <calcChain/>
элементами в документе SpreadsheetML.
Класс расчетной ячейки
Класс CalculationCell
представляет элемент cell (<c/>
), который представляет ячейку, содержащую формулу.
В следующей информации из спецификации ISO/IEC 29500 представлен CalculationCell
элемент (<c/>
).
Каждый элемент "c" представляет ячейку, содержащую формулу. Первая вычисляемая ячейка отображается первой (сверху вниз) и т. д. Ссылочный атрибут "r" указывает адрес ячейки на листе. Индексный атрибут "i" указывает индекс листа, с которым связана ячейка.
© ISO/IEC 29500: 2016
SpreadsheetML
В следующей информации из спецификации ISO/IEC 29500 показан XML-код для примера цепочки вычислений после выполнения приложением первого полного вычисления.
<calcChain xmlns="…">
<c r="B2" i="1"/>
<c r="B3" s="1"/>
<c r="B4" s="1"/>
<c r="B5" s="1"/>
<c r="B6" s="1"/>
<c r="B7" s="1"/>
<c r="B8" s="1"/>
<c r="B9" s="1"/>
<c r="B10" s="1"/>
<c r="C10" s="1"/>
<c r="D10" s="1"/>
<c r="A2"/>
<c r="A3" s="1"/>
<c r="A4" s="1"/>
<c r="A5" s="1"/>
<c r="A6" s="1"/>
<c r="A7" s="1"/>
<c r="A8" s="1"/>
<c r="A9" s="1"/>
<c r="A10" s="1"/>
</calcChain>