Поделиться через


Работа с цепочкой вычислений

В этом разделе рассматривается класс 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>