Dokumentácia HotXLS

Zásady validácie zadávania vzorcov

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ž

Kontextové vyhodnocovanie vzorcov
Excel výpočtový engine
Ďalší klasickí členovia XLS API
Pokročilé členy API XLSX