O XLS clássico e o XLSX expõem o mesmo contrato sem efeitos colaterais para classificar a entrada de fórmulas antes que o chamador altere uma célula
Política compartilhada
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 junto com o TXLSXWorkbook; XLSDefaultFormulaEntryPolicy limpa a entrada vazia e rejeita funções desconhecidas e nomes definidos desconhecidos
A propriedade da pasta de trabalho é copiada por valor e validada atomicamente na atribuição, de modo que valores de enumeração sem suporte 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 de caracteres, 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 entrada exatamente vazia retorna xlfeaClearCell ou xlfeaStoreString conforme EmptyStringMode
Uma fórmula que retorna uma cadeia de caracteres vazia, como ="", permanece uma fórmula e retorna xlfeaStoreFormula quando o formato de destino consegue representá-la
O texto da fórmula pode incluir ou omitir um sinal de igualdade inicial
A atribuição de uma cadeia de caracteres exatamente vazia por meio da propriedade Value normal da célula do XLS clássico ou do XLSX agora aplica esse modo diretamente: o padrão remove qualquer valor ou fórmula existente, enquanto xlfesmPreserveString substitui o conteúdo da célula por uma cadeia de caracteres constante de comprimento zero
Null e Unassigned sempre limpam a célula em qualquer modo, enquanto uma fórmula real como ="" permanece uma fórmula com um resultado de cadeia de caracteres vazia armazenado ou calculado de forma independente
Os gravadores de linhas ou colunas de cadeias de caracteres e Variant do XLSX aplicam a mesma regra sem materializar lacunas limpas e mantêm o armazenamento empacotado sempre que os valores restantes são 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 entrada confiável, de modo que uma cadeia de caracteres vazia constante no nível do arquivo sobrevive mesmo quando a pasta de trabalho de destino mantém a política padrão de entrada do usuário
Símbolos desconhecidos e formatos de destino
Funções de usuário registradas no escopo da pasta de trabalho ou do processo e retornos de chamada OnUserFunction ou OnUserFunctionEx atribuídos contam como conhecidos durante a validação sem invocar um manipulador, enquanto chamadas não registradas mantêm o nome da função em Symbol
O modo estrito retorna xlfeaReject para funções ou nomes desconhecidos; a atribuição por meio da propriedade Formula normal da célula rejeita antes de alterar o valor, o cache de fórmulas ou as dependências
O modo de preservação retém o diagnóstico e armazena a fórmula por meio da API normal da célula; o XLS clássico serializa uma chamada desconhecida por meio de tokens de função de usuário de suplemento BIFF e mantém o texto de nomes desconhecidos ao salvar, reabrir e converter entre XLS e XLSX
O XLS clássico também compila fórmulas conhecidas por meio do gravador BIFF e retorna xlfeiTargetFormatUnsupported quando a expressão não pode ser representada, enquanto o XLSX aceita funções de fórmula modernas conhecidas com suporte em seu modelo de fórmulas
A validação do XLSX reconhece LAMBDA, itens chamáveis lexicais LET , nomes definidos que se referem a lambdas, espaços reservados de relatório, links de pastas de trabalho externas registrados 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 ainda rejeita 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 usuário, ou um nome desconhecido preservado, é avaliada como um erro Variant com o código $1D, o erro do Excel #NAME? ; o mesmo erro tipado se propaga pelas fórmulas dependentes e pela avaliação contextual
As funções internas conhecidas que não estão implementadas permanecem distintas de uma chamada desconhecida, enquanto registrar, substituir, remover ou limpar uma função de usuário no escopo da pasta 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;
TXLSFormulaSymbolIssueKind = (xlfsiUnknownFunction, xlfsiUnknownName,
xlfsiSyntaxError);
TXLSFormulaSymbolLocationKind = (xlfslCell, xlfslDefinedName);
TXLSFormulaSymbolIssue = record
Kind: TXLSFormulaSymbolIssueKind;
LocationKind: TXLSFormulaSymbolLocationKind;
Sheet: Integer;
Row: Integer;
Col: Integer;
DefinedNameIndex: Integer;
DefinedName: WideString;
Formula: WideString;
Symbol: WideString;
end;
TXLSWorkbook e TXLSXWorkbook oferecem as mesmas sobrecargas de auditoria em massa; cada problema identifica uma função desconhecida, um nome desconhecido ou um erro de sintaxe junto com um local de célula da planilha ou de um nome definido, a fórmula de origem e o símbolo não resolvidoLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), 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 examinar texto, de modo que um texto semelhante a função dentro de uma cadeia de caracteres não é relatado; a compilação do XLSX usa um cache local da operação com chave baseada no texto da fórmula resolvido, na planilha, na localidade, na geração dos nomes definidos, nas gerações dos registros de funções de usuário e na disponibilidade dos retornos de chamada
EntryCount informa as fórmulas auditadas, UniqueFormulaCount informa as fórmulas compiladas ou inspecionadas de forma independente e CacheHitCount informa as entradas repetidas atendidas pelo cache da operação
Sem mutação da planilha
A validação não cria nem edita uma célula, não altera valores em cache, não atualiza o grafo de dependências, não marca a pasta de trabalho como modificada e não invoca um manipulador de funções de usuário registrado
A validação direta permanece livre de mutações; a atribuição normal de fórmula aplica a mesma decisão internamente e só confirma depois que a validação e a preparação do formato de destino são 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