Klasický XLS a XLSX sprístupňujú rovnakú zmluvu bez vedľajších účinkov na klasifikáciu zadávaných vzorcov predtým, než volajúci zmení bunku
Spoločné zásady
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Klasické IXLSWorkbook a TXLSWorkbook sprístupňujú túto vlastnosť spolu s TXLSXWorkbook; XLSDefaultFormulaEntryPolicy vymaže prázdny vstup a odmietne neznáme funkcie a neznáme definované názvy
Vlastnosť zošita sa kopíruje hodnotou a pri priradení sa atomovo validuje, takže nepodporované hodnoty výčtu vyvolajú EArgumentOutOfRangeException bez zmeny predchádzajúcich zásad
Výsledok validácie
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue rozlišuje absenciu chyby, neznámu funkciu, neznámy názov, syntaktickú chybu, obmedzenie cieľového formátu a neplatné cieľové súradnice
Action volí vymazanie bunky, uloženie reťazca, uloženie vzorca alebo odmietnutie, pričom Symbol identifikuje neznámu funkciu či názov, ak bol niektorý rozpoznaný
Prázdny text a vzorce
Presne prázdny vstup vráti xlfeaClearCell alebo xlfeaStoreString podľa EmptyStringMode
Vzorec vrátiaci prázdny reťazec, napríklad ="", zostáva vzorcom a vráti xlfeaStoreFormula, ak ho cieľový formát dokáže reprezentovať
Text vzorca môže obsahovať jednu úvodnú rovná sa alebo ju vynechať
Priradenie presne prázdneho reťazca prostredníctvom bežnej vlastnosti Value bunky klasického XLS alebo XLSX teraz použije tento režim priamo: predvolené nastavenie odstráni akúkoľvek existujúcu hodnotu či vzorec, zatiaľ čo xlfesmPreserveString nahradí obsah bunky konštantným reťazcom nulovej dĺžky
Null a Unassigned v oboch režimoch bunku vždy vymažú, zatiaľ čo skutočný vzorec ako ="" zostáva vzorcom s nezávisle uloženým alebo vypočítaným výsledkom prázdneho reťazca
Zapisovače riadkov či stĺpcov reťazcov a Variant v XLSX použijú toto isté pravidlo bez materializácie vymazaných medzier a zachovajú zhustené úložisko, pokiaľ sa zostávajúce hodnoty dajú v ňom reprezentovať
Natívne čítačky XLS, XLSX a ODS a prevodníky z XLS do XLSX a z XLSX do XLS považujú uložené hodnoty za dôveryhodný vstup, takže konštantný prázdny reťazec na úrovni súboru prežije, aj keď cieľový zošit zachováva predvolené zásady používateľského zadávania
Neznáme symboly a cieľové formáty
Zaregistrované používateľské funkcie v rámci zošita alebo procesu a priradené spätné volania OnUserFunction či OnUserFunctionEx sa počas validácie považujú za známe bez vyvolania obslužnej rutiny, zatiaľ čo nezaregistrované volania ponechávajú názov funkcie v Symbol
Prísny režim vráti xlfeaReject pre neznáme funkcie či názvy; priradenie prostredníctvom bežnej vlastnosti Formula bunky odmietne vstup skôr, než zmení hodnotu, medzipamäť vzorcov alebo závislosti
Režim zachovania ponechá diagnostiku a uloží vzorec prostredníctvom bežného rozhrania API buniek; klasický XLS serializuje neznáme volanie prostredníctvom tokenov používateľských funkcií doplnkov BIFF a zachováva text neznámych názvov pri ukladaní, opätovnom otvorení a konverzii XLS/XLSX
Klasický XLS navyše kompiluje známe vzorce prostredníctvom zapisovača BIFF a vráti xlfeiTargetFormatUnsupported, ak sa výraz nedá reprezentovať, zatiaľ čo XLSX prijíma známe moderné funkcie vzorcov podporované svojím modelom vzorcov
Validácia XLSX rozpozná LAMBDA, lexikálne volateľné prvky LET, definované názvy odkazujúce na lambdy, zástupné symboly zostáv, zaregistrované externé odkazy na zošity a platné kvalifikované či nekvalifikované štruktúrované odkazy vrátane vnorených foriem a foriem aktuálneho riadku
Režim kompatibility môže tiež ponechať nevyriešené externé štruktúrované odkazy na neskoršie spracovanie, zatiaľ čo prísny režim nevyriešené názvy tabuliek naďalej odmieta
Výpočet a hromadný audit
Zachovaná neznáma funkcia, ktorá po dispečovaní na lambdy a používateľské funkcie zostane neobslúžená, alebo zachované neznáme meno sa vyhodnotí ako chyba Variant s kódom $1D, teda ako chyba aplikácie Excel #NAME?; tá istá typovaná chyba sa šíri cez závislé vzorce a kontextové vyhodnocovanie
Známe vstavané funkcie, ktoré nie sú implementované, zostávajú odlíšiteľné od neznámeho volania, zatiaľ čo registrácia, nahradenie, odstránenie či vymazanie používateľskej funkcie v rámci zošita alebo procesu a zmena vzorca definovaného mena zneplatnia zastaraný stav závislostí a výpočtov
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSWorkbook a TXLSXWorkbook poskytujú rovnaké preťaženia hromadného auditu; každý problém identifikuje neznámu funkciu, neznámy názov alebo syntaktickú chybu spolu s umiestnením bunky hárku či definovaného mena, zdrojovým vzorcom a nevyriešeným symbolom
Audit prechádza parsované stromy vzorcov alebo uložené tokeny BIFF namiesto skenovania textu, takže text podobný funkcii vnútri reťazca sa nehlási; kompilácia XLSX používa medzipamäť lokálnu pre operáciu, ktorej kľúč tvoria rozpoznaný text vzorca, hárok, národné prostredie, generácia definovaných mien, generácie registrov používateľských funkcií a dostupnosť spätných volaní
EntryCount hlási počet auditovaných vzorcov, UniqueFormulaCount počet vzorcov nezávisle skompilovaných či preskúmaných a CacheHitCount počet opakovaných položiek obslúžených medzipamäťou operácie
Žiadna mutácia hárku
Validácia nevytvára ani neupravuje bunku, nemení hodnoty v medzipamäti, neaktualizuje graf závislostí, neoznačí zošit ako zmenený a nevyvolá zaregistrovanú obslužnú rutinu používateľskej funkcie
Priama validácia zostáva bez mutácií; bežné priradenie vzorca použije rovnaké rozhodnutie interne a potvrdí ho až po úspešnej validácii a príprave cieľového formátu
Príklad pre 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);
Pozri tiež