Documentazione HotXLS

Criteri di validazione dell'immissione delle formule

XLS classico e XLSX espongono lo stesso contratto privo di effetti collaterali per classificare l'input delle formule prima che il chiamante modifichi una cella

Criteri condivisi

TXLSFormulaEmptyStringMode =
  (xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
  (xlfusmReject, xlfusmPreserve);

TXLSFormulaEntryPolicy = record
  EmptyStringMode: TXLSFormulaEmptyStringMode;
  UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
  UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Classic IXLSWorkbook e TXLSWorkbook classici espongono la proprietà insieme a TXLSXWorkbook; XLSDefaultFormulaEntryPolicy cancella l'input vuoto e rifiuta le funzioni sconosciute e i nomi definiti sconosciuti
La proprietà del workbook viene copiata per valore e validata in modo atomico al momento dell'assegnazione, così che i valori di enumerazione non supportati generano EArgumentOutOfRangeException senza modificare i criteri precedenti

Risultato della validazione

function ValidateFormulaEntry(Row, Col: Integer;
  const Formula: WideString): TXLSFormulaEntryValidationResult;

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue distingue assenza di errore, funzione sconosciuta, nome sconosciuto, errore di sintassi, limitazione del formato di destinazione e coordinate di destinazione non valide
Action seleziona cancella cella, memorizza stringa, memorizza formula o rifiuta, mentre Symbol identifica una funzione o un nome sconosciuto quando uno è stato riconosciuto

Testo vuoto e formule

Un input esattamente vuoto restituisce xlfeaClearCell oppure xlfeaStoreString in base a EmptyStringMode
Una formula che restituisce una stringa vuota, ad esempio ="", rimane una formula e restituisce xlfeaStoreFormula quando il formato di destinazione può rappresentarla
Il testo della formula può includere o omettere un segno di uguale iniziale
L'assegnazione di una stringa esattamente vuota attraverso la normale proprietà Value delle celle XLS classico o XLSX ora applica direttamente questa modalità: l'impostazione predefinita rimuove qualsiasi valore o formula esistente, mentre xlfesmPreserveString sostituisce il contenuto della cella con una stringa costante di lunghezza zero
Null e Unassigned cancellano sempre la cella in entrambe le modalità, mentre una formula reale come ="" rimane una formula con un risultato di stringa vuota archiviato o calcolato in modo indipendente
I writer di righe o colonne per stringhe e Variant di XLSX applicano la stessa regola senza materializzare i buchi cancellati e conservano l'archiviazione compressa finché i valori rimanenti sono rappresentabili in quella forma
I reader nativi XLS, XLSX e ODS e i convertitori da XLS a XLSX o da XLSX a XLS trattano i valori archiviati come input affidabile, così che una stringa vuota costante a livello di file sopravvive anche quando il workbook di destinazione mantiene i criteri predefiniti per l'immissione utente

Simboli sconosciuti e formati di destinazione

Le funzioni utente registrate a livello di workbook o di processo e i callback OnUserFunction o OnUserFunctionEx assegnati contano come noti durante la validazione senza invocare un gestore, mentre le chiamate non registrate conservano il nome della funzione in Symbol
La modalità rigorosa restituisce xlfeaReject per funzioni o nomi sconosciuti; l'assegnazione attraverso la normale proprietà Formula della cella rifiuta prima di modificare il valore, la cache delle formule o le dipendenze
La modalità di conservazione mantiene la diagnostica e archivia la formula attraverso la normale API delle celle; XLS classico serializza una chiamata sconosciuta tramite token di funzioni utente per componenti aggiuntivi BIFF e conserva il testo dei nomi sconosciuti attraverso salvataggio, riapertura e conversione XLS/XLSX
XLS classico inoltre compila le formule note attraverso il writer BIFF e restituisce xlfeiTargetFormatUnsupported quando l'espressione non può essere rappresentata, mentre XLSX accetta le funzioni di formula moderne note supportate dal suo modello di formule
La validazione XLSX riconosce LAMBDA, i chiamabili lessicali LET , i nomi definiti che fanno riferimento a lambda, i segnaposto dei report, i collegamenti a workbook esterni registrati e i riferimenti strutturati qualificati o non qualificati validi, incluse le forme annidate e della riga corrente
La modalità di compatibilità può inoltre conservare i riferimenti strutturati esterni non risolti per un'elaborazione successiva, mentre la modalità rigorosa rifiuta comunque i nomi di tabella non risolti

Calcolo e audit collettivo

Una funzione sconosciuta conservata che rimane non gestita dopo il dispatch verso lambda e funzioni utente, o un nome sconosciuto conservato, viene valutata come errore Variant con codice $1D, l'errore Excel #NAME? ; lo stesso errore tipizzato si propaga attraverso le formule dipendenti e la valutazione contestuale
Le funzioni integrate note che non sono implementate restano distinte da una chiamata sconosciuta, mentre la registrazione, la sostituzione, la rimozione o la cancellazione di una funzione utente a livello di workbook o di processo e la modifica della formula di un nome definito invalidano lo stato obsoleto di dipendenze e calcolo
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 forniscono gli stessi overload di audit collettivo; ogni problema identifica una funzione sconosciuta, un nome sconosciuto o un errore di sintassi insieme a una posizione di cella del foglio di lavoro o di un nome definito, la formula di origine e il simbolo non risoltoLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), la formula di origine e il simbolo non risolto
L'audit attraversa gli alberi delle formule analizzati o i token BIFF archiviati invece di scansionare il testo, così che un testo simile a una funzione all'interno di una stringa non viene segnalato; la compilazione XLSX usa una cache locale all'operazione con chiave basata su testo della formula risolto, foglio di lavoro, impostazioni locali, generazione dei nomi definiti, generazioni dei registri delle funzioni utente e disponibilità dei callback
EntryCount riporta le formule verificate, UniqueFormulaCount riporta le formule compilate o ispezionate in modo indipendente e CacheHitCount riporta le voci ripetute servite dalla cache dell'operazione

Nessuna mutazione del foglio di lavoro

La validazione non crea né modifica una cella, non cambia i valori nella cache, non aggiorna il grafo delle dipendenze, non contrassegna il workbook come modificato e non invoca un gestore di funzioni utente registrato
La validazione diretta resta priva di mutazioni; l'assegnazione normale della formula applica la stessa decisione internamente ed effettua il commit solo dopo che validazione e preparazione del formato di destinazione sono riuscite

Esempio 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);

Vedere anche

Valutazione contestuale delle formule
Motore di calcolo Excel
Membri API aggiuntivi XLS classici
Membri avanzati dell'API XLSX