Como trabalhar com a cadeia de cálculo

Este tópico discute a classe Open XML SDK CalculationChain e como ela se relaciona com o esquema SpreadsheetML do formato de arquivo Open XML. Para obter mais informações sobre a estrutura geral das partes e elementos que compõem um documento SpreadsheetML, consulte Estrutura de um documento SpreadsheetML.

CalculationChain em SpreadsheetML

As seguintes informações da especificação ISO/IEC 29500 introduzem o CalculationChain elemento (<calcChain/>).

Uma instância desse tipo de parte contém um conjunto ordenado de referências a todas as células em todas as planilhas da pasta de trabalho cujo valor é calculado com base em qualquer fórmula. A ordenação permite que fórmulas de células inter-relacionadas sejam calculadas na ordem correta quando uma planilha é carregada para uso.

Um pacote não deve conter mais do que uma parte da cadeia de cálculo.

O elemento raiz de uma parte desse tipo de conteúdo deve ser calcChain.

A parte Cadeia de Cálculo especifica a ordem na qual as células da pasta de trabalho foram calculadas pela última vez. Ele apenas registra informações sobre células que contêm fórmulas. Ela não inclui nenhuma informação sobre a árvore de cálculo de dependência de fórmula. Em outras palavras, a parte Cadeia de Cálculo não indica as dependências que as fórmulas têm em outros valores de célula; Indica apenas a ordem em que as células foram calculadas pela última vez.

Qualquer evento de cálculo específico pode fazer com que a ordem da cadeia de cálculo seja reorganizada ou alterada. Por exemplo, adicionar mais fórmulas à pasta de trabalho adiciona referências na parte Cadeia de Cálculo.

Outro exemplo de como a ordem de cálculo pode ser atualizada envolve a ideia de cálculo parcial. O cálculo parcial é uma otimização que um aplicativo de planilha pode implementar para calcular apenas as células que dependem de outras células cujos valores foram alterados e para ignorar outras fórmulas na pasta de trabalho. Isso ajuda a evitar o recálculo redundante de resultados já conhecidos. Portanto, se um conjunto de fórmulas que foram ignoradas anteriormente durante um cálculo se tornar necessário para o cálculo (devido à alteração do valor de uma célula), essas fórmulas serão movidas para o "primeiro" na cadeia de cálculo para que possam ser avaliadas.

Embora as informações da cadeia de cálculo possam ser carregadas por um aplicativo de planilha, elas não são necessárias. Uma cadeia de cálculo pode ser construída na memória em tempo de carregamento com base nas fórmulas e sua interdependência, se o aplicativo de planilha achar essas informações úteis. A ordem expressa na parte da Cadeia de Cálculo não força ou dita ao aplicativo de implementação a ordem na qual os cálculos devem ser executados em tempo de execução.

© ISO/IEC 29500: 2016

A tabela a seguir lista as classes comuns do Open XML SDK usadas ao trabalhar com a CalculationChain classe.

Elemento SpreadsheetML Classe Open XML SDK
<c/> CalculationCell

Open XML SDK CalculationChain Class

A classe Open XML SDK CalculationChain representa o elemento de parágrafo (<calcChain/>) definido no esquema de formato de arquivo Open XML para documentos SpreadsheetML. Use a CalculationChain classe para manipular elementos individuais <calcChain/> em um documento SpreadsheetML.

Classe de célula de cálculo

A CalculationCell classe representa o elemento cell (<c/>) que representa uma célula que contém uma fórmula.

As seguintes informações da especificação ISO/IEC 29500 introduzem o CalculationCell elemento (<c/>).

Cada elemento c representa uma célula que contém uma fórmula. A primeira célula calculada aparece primeiro (de cima para baixo) e assim por diante. O atributo de referência r indica o endereço da célula na planilha. O atributo de índice i indica o índice da planilha à qual essa célula está associada.

© ISO/IEC 29500: 2016

SpreadsheetML

As informações a seguir do ISO/IEC 29500 mostram o XML para uma cadeia de cálculo de exemplo depois que o aplicativo executa seu primeiro cálculo completo.

<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>