Documentação do HotXLS

Avaliação contextual de fórmulas

As folhas de cálculo XLS clássicas e XLSX expõem a mesma API só de leitura para avaliar texto de fórmula como se este tivesse sido introduzido numa linha e coluna escolhidas com base um

Avaliação pontual

function EvaluateFormulaAt(Row, Col: Integer;
  const Formula: WideString): TXLSFormulaEvaluationResult; overload;

function EvaluateFormulaAt(Row, Col: Integer;
  const Formula: WideString;
  ReferenceStyle: TXLSFormulaReferenceStyle;
  const Options: TXLSFormulaEvaluationOptions): TXLSFormulaEvaluationResult; overload;
A folha de cálculo fornece o contexto de nomes locais, referências não qualificadas, tabelas e ligações externas sem alterar a folha ativa, a seleção, o modelo de células, a cache de fórmulas, o estado de pendência nem o grafo de dependências
O xlfrsA1 preserva as referências absolutas e mistas enquanto resolve as referências relativas a partir da célula de destino; o xlfrsR1C1 resolve os deslocamentos relativos diretamente a partir desse destino

Resultados tipados

O TXLSFormulaEvaluationResult devolve Status, o Value tipado original, IsVolatile e um registo Issue estável contendo o estado, o código nativo e a mensagem
Os valores de fórmula como #DIV/0!, #REF!, cadeias vazias, matrizes, valores Boolean e datas permanecem valores distinguíveis; as falhas de análise, as funções não suportadas, as referências circulares, as referências externas recusadas, as callbacks inseguras recusadas, o cancelamento, os argumentos inválidos, as folhas indisponíveis e o esgotamento de recursos utilizam estados explícitos da API

Modelos imutáveis reutilizáveis

function CreateFormulaEvaluationTemplate(Row, Col: Integer;
  const Formula: WideString;
  ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
Um modelo compila a fórmula uma vez na respetiva âncora e expõe EvaluateAt e EvaluateAtWithOptions para avaliações repetidas em células de destino diferentes
As fórmulas A1 e R1C1 comuns reutilizam diretamente a árvore compilada; as referências estruturadas A1 cujo significado depende da linha da tabela de destino são resolvidas e compiladas para esse contexto de destino
Os modelos não mantêm estado mutável da folha de cálculo, comunicam xlfeWorksheetUnavailable em segurança após a destruição do livro de trabalho e recuam para a recompilação com conhecimento do contexto quando alterações do livro de trabalho tornam o contexto compilado original obsoleto

Opções de recursos, referências externas e callbacks

AllowExternalReferencesA predefinição é true, mas permite apenas destinos de espaço de trabalho registados explicitamente ou caches locais do ficheiro e nunca efetua acesso implícito a ficheiros ou à rede
AllowUnsafeFormulaCallbacksA predefinição é false e impede que nomes de funções perigosas cheguem a um registo de funções do utilizador ou a uma callback antes de qualquer argumento ser avaliado; a recusa devolve xlfeUnsafeFunctionDenied
CancelFlagPonteiro Boolean opcional verificado antes e depois da avaliação
MaxFormulaLengthA predefinição é 8192 unidades de código UTF-16
MaxEvaluationStepsA predefinição é 1,000,000 avaliações de itens de sintaxe
MaxRecursionDepthA predefinição é 256 avaliações de fórmulas aninhadas
MaxArrayBytesA predefinição é 64 MiB para cargas úteis de matrizes geradas
Um máximo zero ou negativo desativa esse limite por chamada; a política de memória de matrizes de todo o livro de trabalho continua a aplicar-se, e atingir um limite ativo devolve xlfeResourceLimit após libertar o estado temporário de avaliação
A sobrecarga que aceita opções explícitas trata AllowUnsafeFormulaCallbacks como autoritativa para essa chamada; a avaliação pontual predefinida e a avaliação de modelos herdam a propriedade do livro de trabalho com o mesmo nome

Exemplo em Delphi

Template := Sheet.CreateFormulaEvaluationTemplate(2, 2,
  '=R[-1]C[-1]+1', xlfrsR1C1);

Result := Template.EvaluateAt(2, 2);
if Result.Status = xlfeOk then
  UseValue(Result.Value);

Options := XLSDefaultFormulaEvaluationOptions;
Options.MaxEvaluationSteps := 10000;
Result := Template.EvaluateAtWithOptions(20, 4, Options);

Exemplo em C++Builder

Lxcalc::_di_IXLSFormulaEvaluationTemplate evalTemplate =
  sheet->CreateFormulaEvaluationTemplate(1, 1,
    WideString(L"=ROW()+COLUMN()"), Lxcalc::xlfrsA1);

Lxcalc::TXLSFormulaEvaluationResult result =
  evalTemplate->EvaluateAt(7, 8);

Veja também

Método TXLSWorksheet.Calculate
Método IXLSWorkbook.Calculate
Motor de cálculo do Excel