Classic XLS și XLSX expun același contract fără efecte secundare pentru clasificarea datelor introduse de formulă înainte ca apelantul să schimbe o celulă
Politică comună
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Classic IXLSWorkbook și TXLSWorkbook expun proprietatea împreună cu TXLSXWorkbook; XLSDefaultFormulaEntryPolicy golește intrarea goală și respinge funcțiile necunoscute și numele definite necunoscute
Proprietatea registrului de lucru este copiată prin valoare și validată atomic la atribuire, astfel încât valorile de enumerare nesuportate ridică EArgumentOutOfRangeException fără a schimba politica anterioară
Rezultatul validării
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue distinge lipsa de eroare, funcția necunoscută, numele necunoscut, eroarea de sintaxă, limitarea formatului-țintă și coordonatele de țintă invalide
Action selectează golirea celulei, stocarea șirului, stocarea formulei sau respingerea, în timp ce Symbol identifică o funcție sau un nume necunoscut când unul a fost recunoscut
Text gol și formule
O intrare exact goală returnează xlfeaClearCell sau xlfeaStoreString conform EmptyStringMode
O formulă care returnează un șir gol, precum ="", rămâne o formulă și returnează xlfeaStoreFormula atunci când formatul-țintă o poate reprezenta
Textul formulei poate include sau omite un semn de egalitate inițial
Atribuirea unui șir exact gol prin proprietatea obișnuită Value a celulei din Classic XLS sau XLSX aplică acum direct acest mod: implicit se elimină orice valoare sau formulă existentă, în timp ce xlfesmPreserveString înlocuiește conținutul celulei cu un șir constant de lungime zero
Null și Unassigned golesc întotdeauna celula în oricare dintre moduri, în timp ce o formulă reală precum ="" rămâne o formulă cu un rezultat de șir gol stocat sau calculat independent
Scriitorii de rânduri sau coloane XLSX pentru string și Variant aplică aceeași regulă fără a materializa găurile golite și păstrează stocarea compactă ori de câte ori valorile rămase pot fi reprezentate acolo
Cititorii nativi XLS, XLSX și ODS și convertoarele XLS-to-XLSX sau XLSX-to-XLS tratează valorile stocate ca date de încredere, astfel încât un șir constant gol la nivel de fișier supraviețuiește chiar și când registrul de lucru destinație păstrează politica implicită de introducere de către utilizator
Simboluri necunoscute și formate-țintă
Funcțiile de utilizator înregistrate la nivel de registru de lucru sau de proces și callback-urile atribuite OnUserFunction sau OnUserFunctionEx sunt considerate cunoscute în timpul validării fără a invoca un handler, în timp ce apelurile neînregistrate își păstrează numele funcției în Symbol
Modul strict returnează xlfeaReject pentru funcții sau nume necunoscute; atribuirea prin proprietatea obișnuită Formula a celulei respinge înainte de a schimba valoarea, cache-ul de formule sau dependențele
Modul de păstrare reține diagnosticul și stochează formula prin API-ul obișnuit al celulei; Classic XLS serializează un apel necunoscut prin token-uri BIFF de funcții de utilizator de tip add-in și păstrează textul numelui necunoscut la salvare, redeschidere și conversie XLS/XLSX
Classic XLS compilează în plus formulele cunoscute prin scriitorul BIFF și returnează xlfeiTargetFormatUnsupported când expresia nu poate fi reprezentată, în timp ce XLSX acceptă funcțiile de formule moderne cunoscute pe care le susține modelul său de formule
Validarea XLSX recunoaște LAMBDA, entitățile apelabile lexicale LET, numele definite care se referă la lambda-uri, placeholder-ele de raport, legăturile externe de registre de lucru înregistrate și referințele structurate calificate sau necalificate valide, inclusiv formele imbricate și de rând curent
Modul de compatibilitate poate păstra și referințe structurate externe nerezolvate pentru procesare ulterioară, în timp ce modul strict respinge în continuare numele de tabele nerezolvate
Calcul și audit în masă
O funcție necunoscută păstrată care rămâne netratată după distribuția către lambda-uri și funcții de utilizator, sau un nume necunoscut păstrat, se evaluează ca eroare Variant cu codul $1D, eroarea #NAME? din Excel; aceeași eroare tipizată se propagă prin formulele dependente și evaluarea contextuală
Funcțiile integrate cunoscute care nu sunt implementate rămân distincte de un apel necunoscut, în timp ce înregistrarea, înlocuirea, eliminarea sau curățarea unei funcții de utilizator la nivel de registru de lucru sau de proces și schimbarea formulei unui nume definit invalidează starea perimată de dependențe și calcul
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSWorkbook și TXLSXWorkbook furnizează aceleași supraîncărcări de audit în masă; fiecare problemă identifică o funcție necunoscută, un nume necunoscut sau o eroare de sintaxă împreună fie cu o locație de celulă a foii de lucru, fie cu o locație de nume definit, formula sursă și simbolul nerezolvat
Auditul parcurge arborii de formule analizați sau token-urile BIFF stocate în loc să scaneze text, astfel încât textul cu aspect de funcție dintr-un șir nu este raportat; compilarea XLSX folosește un cache local operației cu chei formate din textul de formulă rezolvat, foaia de lucru, setările regionale, generația numelor definite, generațiile registrului de funcții de utilizator și disponibilitatea callback-urilor
EntryCount raportează formulele auditate, UniqueFormulaCount formulele compilate sau inspectate independent, iar CacheHitCount intrările repetate deservite de cache-ul operației
Fără mutații ale foii de lucru
Validarea nu creează și nu editează o celulă, nu schimbă valorile din cache, nu actualizează graful de dependențe, nu marchează registrul de lucru ca dirty și nu invocă un handler de funcții de utilizator înregistrat
Validarea directă rămâne fără mutații; atribuirea obișnuită a formulei aplică intern aceeași decizie și se comite numai după ce validarea și pregătirea formatului-țintă reușesc
Exemplu 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);
Consultați și