O XLS clássico e o XLSX expõem o mesmo contrato sem efeitos secundários para classificar a introdução de fórmulas antes de o autor da chamada alterar uma célula
Política partilhada
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
O IXLSWorkbook e o TXLSWorkbook clássicos expõem a propriedade juntamente com o TXLSXWorkbook; XLSDefaultFormulaEntryPolicy limpa a introdução vazia e rejeita funções desconhecidas e nomes definidos desconhecidos
A propriedade do livro de trabalho é copiada por valor e validada atomicamente na atribuição, pelo que os valores de enumeração não suportados geram EArgumentOutOfRangeException sem alterar a política anterior
Resultado da validação
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue distingue ausência de erro, função desconhecida, nome desconhecido, erro de sintaxe, limitação do formato de destino e coordenadas de destino inválidas
Action seleciona limpar a célula, armazenar a cadeia, armazenar a fórmula ou rejeitar, enquanto Symbol identifica uma função ou um nome desconhecido quando um deles foi reconhecido
Texto vazio e fórmulas
Uma introdução exatamente vazia devolve xlfeaClearCell ou xlfeaStoreString de acordo com EmptyStringMode
Uma fórmula que devolve uma cadeia vazia, como ="", mantém-se uma fórmula e devolve xlfeaStoreFormula quando o formato de destino a consegue representar
O texto da fórmula pode incluir ou omitir um sinal de igualdade inicial
A atribuição de uma cadeia exatamente vazia através da propriedade Value normal da célula do XLS clássico ou do XLSX aplica agora este modo diretamente: a predefinição remove qualquer valor ou fórmula existente, enquanto xlfesmPreserveString substitui o conteúdo da célula por uma cadeia constante de comprimento zero
Null e Unassigned limpam sempre a célula em qualquer modo, enquanto uma fórmula real como ="" se mantém uma fórmula com um resultado de cadeia vazia armazenado ou calculado de forma independente
Os escritores de linhas ou colunas de cadeias e Variant do XLSX aplicam a mesma regra sem materializar as lacunas limpas e mantêm o armazenamento empacotado desde que os valores restantes sejam representáveis nele
Os leitores nativos de XLS, XLSX e ODS e os conversores de XLS para XLSX ou de XLSX para XLS tratam os valores armazenados como introdução fidedigna, pelo que uma cadeia vazia constante ao nível do ficheiro sobrevive mesmo quando o livro de trabalho de destino mantém a política predefinida de introdução do utilizador
Símbolos desconhecidos e formatos de destino
As funções de utilizador registadas no âmbito do livro de trabalho ou do processo e as retrollamadas OnUserFunction ou OnUserFunctionEx atribuídas contam como conhecidas durante a validação sem invocar um processador, enquanto as chamadas não registadas mantêm o nome da função em Symbol
O modo estrito devolve xlfeaReject para funções ou nomes desconhecidos; a atribuição através da propriedade Formula normal da célula rejeita antes de alterar o valor, a cache de fórmulas ou as dependências
O modo de preservação retém o diagnóstico e armazena a fórmula através da API normal da célula; o XLS clássico serializa uma chamada desconhecida através de tokens de funções de utilizador de suplementos BIFF e mantém o texto dos nomes desconhecidos ao guardar, reabrir e converter entre XLS e XLSX
O XLS clássico compila ainda fórmulas conhecidas através do escritor BIFF e devolve xlfeiTargetFormatUnsupported quando a expressão não pode ser representada, enquanto o XLSX aceita as funções de fórmula modernas conhecidas suportadas pelo seu modelo de fórmulas
A validação do XLSX reconhece LAMBDA, elementos chamáveis lexicais LET, nomes definidos que remetem para lambdas, marcadores de posição de relatórios, ligações a livros de trabalho externos registados e referências estruturadas qualificadas ou não qualificadas válidas, incluindo formas aninhadas e da linha atual
O modo de compatibilidade também pode manter referências estruturadas externas não resolvidas para processamento posterior, enquanto o modo estrito continua a rejeitar nomes de tabela não resolvidos
Cálculo e auditoria em massa
Uma função desconhecida preservada que permanece sem tratamento após o despacho para lambdas e funções de utilizador, ou um nome desconhecido preservado, é avaliada como um erro Variant com o código $1D, o erro do Excel #NAME?; o mesmo erro tipado propaga-se pelas fórmulas dependentes e pela avaliação contextual
As funções incorporadas conhecidas que não estão implementadas mantêm-se distintas de uma chamada desconhecida, enquanto registar, substituir, remover ou limpar uma função de utilizador no âmbito do livro de trabalho ou do processo e alterar a fórmula de um nome definido invalida o estado desatualizado de dependências e cálculo
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSWorkbook e TXLSXWorkbook disponibilizam as mesmas sobrecargas de auditoria em massa; cada problema identifica uma função desconhecida, um nome desconhecido ou um erro de sintaxe juntamente com uma localização de célula da folha de cálculo ou de um nome definido, a fórmula de origem e o símbolo não resolvido
A auditoria percorre árvores de fórmulas analisadas ou tokens BIFF armazenados em vez de analisar texto, pelo que um texto com aparência de função dentro de uma cadeia não é comunicado; a compilação do XLSX utiliza uma cache local da operação cuja chave assenta no texto da fórmula resolvido, na folha de cálculo, na configuração regional, na geração dos nomes definidos, nas gerações dos registos de funções de utilizador e na disponibilidade das retrollamadas
EntryCount comunica as fórmulas auditadas, UniqueFormulaCount comunica as fórmulas compiladas ou inspecionadas de forma independente e CacheHitCount comunica as entradas repetidas servidas pela cache da operação
Sem mutação da folha de cálculo
A validação não cria nem edita uma célula, não altera os valores em cache, não atualiza o grafo de dependências, não marca o livro de trabalho como modificado e não invoca um processador de funções de utilizador registado
A validação direta mantém-se isenta de mutações; a atribuição normal de fórmula aplica a mesma decisão internamente e só consolida depois de a validação e a preparação do formato de destino serem bem-sucedidas
Exemplo em Delphi
Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;
Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
Sheet.Cells[4, 2].Formula := FormulaText;
Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
if Issues[I].Kind = xlfsiUnknownFunction then
LogUnknownSymbol(Issues[I].Symbol);
Veja também