Documentação HotXLS

Motor de cálculo do Excel

Visão geral

O HotXLS inclui um motor integrado para análise e cálculo de fórmulas; este motor avalia as fórmulas das células programaticamente dentro do seu processo, eliminando a necessidade de invocar o Excel ou controladores OLE externos para resolver os valores calculados do livro

Execução do cálculo

Antes de guardar ou exportar, acione um recálculo completo do livro utilizando a interface principal do livro

procedure Calculate;

O motor suporta as famílias padrão de funções matemáticas, de data, lógicas, de cadeia de caracteres e estatísticas; resolve sequencialmente as dependências das células e segue as cadeias de referência para evitar referências circulares

Avaliação contextual de fórmulas

Os TXLSWorksheet e TXLSXWorksheet expõem EvaluateFormulaAt para calcular texto de fórmulas numa linha e coluna selecionadas de base um, sem escrever uma célula temporária nem alterar o estado de cálculo do livro

Os estilos de referência A1 e R1C1, os nomes locais, as referências estruturadas, as dependências de fórmulas, as raízes de matriz, os valores de erro tipados do Excel, o estado volátil, a autorização explícita de referências externas, o cancelamento e as categorias de falha estáveis partilham o avaliador normal do livro

CreateFormulaEvaluationTemplate compila uma âncora imutável uma única vez e reutiliza-a nas células alvo; as referências estruturadas A1 sensíveis à linha alvo são resolvidas para cada contexto alvo, e os limites por chamada restringem o comprimento da fórmula, os passos de itens de sintaxe, a profundidade de recursão e os bytes de matriz gerados

Consulte Avaliação contextual de fórmulas para obter os tipos de resultado, os orçamentos predefinidos, as regras de tempo de vida e exemplos em Delphi e C++Builder

Operadores de matriz

Os operadores aritméticos, de comparação, de concatenação, de negação unária e de percentagem aceitam matrizes calculadas além de valores escalares

Um escalar difunde-se por todos os elementos, e uma matriz de uma só linha ou de uma só coluna difunde-se ao longo de uma dimensão compatível; formas incompatíveis devolvem #VALUE!

Os erros são mantidos nas respetivas células de resultado, pelo que uma divisão por zero ou um elemento inválido não descarta os valores calculados para as restantes células

COMBINA e PERMUTATIONA partilham a semântica escalar e de difusão em matriz, com argumentos inteiros não negativos truncados e overflow verificado, enquanto MUNIT devolve uma matriz identidade Double bidimensional compacta

FormulaArrayMemoryLimit assume 64 MiB por predefinição e limita os payloads de matriz gerados; o MUNIT valida também a área de spill restante da folha de cálculo em vez de impor um teto fixo de dimensões

Inspeção da presença de fórmulas

ISFORMULA(reference) verifica se a célula tem fórmula sem a calcular, pelo que uma fórmula continua a ser detetável quando o resultado em cache é um erro ou uma cadeia vazia

Um intervalo retangular devolve uma matriz booleana com a mesma forma; os membros de fórmula partilhada e de fórmula de matriz clássica ou XLSX devolvem true, enquanto só a âncora de um spill dinâmico é uma célula com fórmula

Os valores diretos e os nomes definidos escalares devolvem #VALUE!, as referências inválidas preservam #REF!, e as matrizes booleanas geradas são limitadas por FormulaArrayMemoryLimit

O XLSX escreve _xlfn.ISFORMULA e restaura o nome simples ao abrir, o ODS usa a sintaxe padrão of:=ISFORMULA, e a saída do XLS clássico rejeita a função futura não suportada antes de gravar os dados

Funções de texto modernas

UNICHAR trunca as entradas numéricas em direção a zero e converte valores escalares Unicode válidos para UTF-16, incluindo a saída em pares surrogate para os planos suplementares e todos os intervalos de uso privado

As entradas zero e fora do intervalo devolvem #VALUE!, enquanto os code points surrogate isolados e os noncharacters Unicode devolvem #N/A; as entradas de intervalo e de matriz gerada preservam estes erros por elemento

BAHTTEXT converte números finitos em texto de baht e satang tailandeses, arredonda valores a meio para longe de zero com duas casas decimais, mantém o sinal negativo quando a magnitude arredondada passa a zero e expande a notação científica sem a estreitar através de um tipo inteiro

O XLSX guarda UNICHAR como _xlfn.UNICHAR e restaura o nome simples ao reabrir; o BAHTTEXT mantém a sua identidade de função padrão e permanece simples nas fórmulas XLS e XLSX

Regressão e previsão

LINEST e LOGEST aceitam uma ou mais colunas ou linhas de preditores e devolvem os coeficientes pela ordem do Excel, seguidos da ordenada na origem opcional

Quando o argumento de estatísticas é true, ambas as funções devolvem o resultado completo de cinco linhas, com os erros dos coeficientes, as estatísticas de ajuste, a estatística F, os graus de liberdade, a soma dos quadrados da regressão e a soma dos quadrados dos resíduos

TREND e GROWTH usam o mesmo modelo multivariável e preservam a forma de linha ou de coluna dos novos valores preditores fornecidos

Recálculo de dependências do XLS clássico

TXLSWorkbook.Recalculate constrói um grafo de dependências de fórmulas na primeira chamada e avalia as fórmulas pela ordem dos precedentes, em vez da ordem física das células

As chamadas seguintes reutilizam o grafo e recalculam apenas os dependentes transitivos dos valores alterados, mais as fórmulas voláteis; as edições de fórmulas, os nomes, a estrutura da folha de cálculo e as reescritas de referências invalidam e reconstruem o grafo em segurança

As referências circulares usam as definições EnableIteration, MaxIterations e MaxIterationChange do livro clássico, enquanto UseFullPrecision=False aplica a precisão do número apresentado aos resultados em cache e aos cálculos que dependem destes

Dependências de nomes definidos

O cálculo incremental segue os nomes com âmbito de livro e de folha de cálculo através de fórmulas aninhadas e referências de várias áreas

As fórmulas de nomes acíclicas contribuem com as suas dependências exatas de células, enquanto os ciclos recursivos de nomes revertem com segurança para o recálculo volátil

Tabelas de dados What-If

As folhas de cálculo XLS clássicas e as XLSX modernas podem criar, calcular, ler, escrever, copiar e ajustar estruturalmente tabelas de dados What-If de uma ou duas variáveis

function AddDataTable(
  const AResultRange, ARowInputCell, AColumnInputCell: WideString
): TXLSDataTable;

O intervalo de resultados contém apenas células de saída calculadas, enquanto as fórmulas e os valores de teste usam as células envolventes, com o mesmo layout do Excel

  • Tabela de entrada por coluna — deixe ARowInputCell vazio, coloque uma fórmula de origem acima de cada coluna de resultados e coloque os valores de teste à esquerda das linhas de resultados
  • Tabela de entrada por linha — deixe AColumnInputCell vazio, coloque uma fórmula de origem à esquerda de cada linha de resultados e coloque os valores de teste acima das colunas de resultados
  • Tabela de duas variáveis — forneça ambas as células de entrada, coloque a fórmula de origem acima e à esquerda do intervalo de resultados, os valores de teste da entrada por linha acima dos resultados e os valores de teste da entrada por coluna à esquerda
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;

Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;

Este exemplo de entrada por coluna calcula 3, 5 e 7 em D2:D4; cada valor de teste é aplicado através de um contexto de cálculo isolado, pelo que as fórmulas que chegam a B1 indiretamente, através de outras células com fórmula, são recalculadas corretamente

AddDataTable devolve nil para um intervalo inválido, uma referência de entrada inválida ou quando ambas as referências de entrada estão vazias; a coleção DataTables da folha de cálculo expõe a definição resultante e as respetivas flags de entrada eliminada

Eliminar uma célula de entrada referenciada preserva a definição da tabela e devolve #REF! para as saídas, em conformidade com a semântica do livro guardado

Funções definidas pelo utilizador

Estenda o motor de fórmulas com lógica de negócio personalizada; registe as suas próprias funções utilizando os eventos abaixo

Nomes externos perigosos e nomes ao estilo de macros são recusados antes de os argumentos ou handlers serem executados, a menos que o livro ou uma avaliação contextual individual ative explicitamente AllowUnsafeFormulaCallbacks