Dokumentace HotXLS

Zásady validace zadávání vzorců

Klasický XLS a XLSX zpřístupňují stejnou smlouvu bez vedlejších účinků pro klasifikaci zadávaných vzorců předtím, než volající změní buňku

Společ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 zpřístupňují tuto vlastnost spolu s TXLSXWorkbook; XLSDefaultFormulaEntryPolicy vymaže prázdný vstup a odmítne neznámé funkce a neznámé definované názvy
Vlastnost sešitu se kopíruje hodnotou a při přiřazení se atomicky validuje, takže nepodporované hodnoty výčtu vyvolají EArgumentOutOfRangeException beze změny předchozích zásad

Výsledek validace

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

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue rozlišuje absenci chyby, neznámou funkci, neznámý název, syntaktickou chybu, omezení cílového formátu a neplatné cílové souřadnice
Action volí vymazání buňky, uložení řetězce, uložení vzorce nebo odmítnutí, přičemž Symbol identifikuje neznámou funkci či název, pokud byl některý rozpoznán

Prázdný text a vzorce

Přesně prázdný vstup vrátí xlfeaClearCell nebo xlfeaStoreString podle EmptyStringMode
Vzorec vracející prázdný řetězec, například ="", zůstává vzorcem a vrátí xlfeaStoreFormula, pokud jej cílový formát dokáže reprezentovat
Text vzorce může obsahovat jednu úvodní rovná se, nebo ji vynechat
Přiřazení přesně prázdného řetězce prostřednictvím běžné vlastnosti Value buňky klasického XLS nebo XLSX nyní použije tento režim přímo: výchozí nastavení odstraní jakoukoli existující hodnotu či vzorec, zatímco xlfesmPreserveString nahradí obsah buňky konstantním řetězcem nulové délky
Null a Unassigned v obou režimech buňku vždy vymažou, zatímco skutečný vzorec jako ="" zůstává vzorcem s nezávisle uloženým nebo vypočítaným výsledkem prázdného řetězce
Zapisovače řádků či sloupců řetězců a Variant v XLSX použijí stejné pravidlo bez materializace vymazaných mezer a zachovají zhuštěné úložiště, dokud lze zbývající hodnoty v něm reprezentovat
Nativní čtečky XLS, XLSX a ODS a převodníky z XLS do XLSX a z XLSX do XLS považují uložené hodnoty za důvěryhodný vstup, takže konstantní prázdný řetězec na úrovni souboru přežije, i když cílový sešit zachovává výchozí zásady uživatelského zadávání

Neznámé symboly a cílové formáty

Zaregistrované uživatelské funkce v rámci sešitu nebo procesu a přiřazená zpětná volání OnUserFunction či OnUserFunctionEx se při validaci považují za známá bez vyvolání obslužné rutiny, zatímco nezaregistrovaná volání ponechávají název funkce v Symbol
Přísný režim vrátí xlfeaReject pro neznámé funkce či názvy; přiřazení prostřednictvím běžné vlastnosti Formula buňky odmítne vstup dříve, než změní hodnotu, mezipaměť vzorců nebo závislosti
Režim zachování ponechá diagnostiku a uloží vzorec prostřednictvím běžného rozhraní API buněk; klasický XLS serializuje neznámé volání prostřednictvím tokenů uživatelských funkcí doplňků BIFF a zachovává text neznámých názvů při ukládání, opětovném otevření a převodu XLS/XLSX
Klasický XLS navíc kompiluje známé vzorce prostřednictvím zapisovače BIFF a vrátí xlfeiTargetFormatUnsupported, pokud výraz nelze reprezentovat, zatímco XLSX přijímá známé moderní funkce vzorců podporované svým modelem vzorců
Validace XLSX rozpozná LAMBDA, lexikální volatelné prvky LET, definované názvy odkazující na lambdy, zástupné symboly sestav, zaregistrované externí odkazy na sešity a platné kvalifikované či nekvalifikované strukturované odkazy, včetně vnořených forem a forem aktuálního řádku
Režim kompatibility může také ponechat nevyřešené externí strukturované odkazy pro pozdější zpracování, zatímco přísný režim nevyřešené názvy tabulek nadále odmítá

Výpočet a hromadný audit

Zachovaná neznámá funkce, která po dispečování na lambdy a uživatelské funkce zůstane neobsloužená, nebo zachovaný neznámý název se vyhodnotí jako chyba Variant s kódem $1D, tedy jako chyba aplikace Excel #NAME?; stejná typovaná chyba se šíří přes závislé vzorce a kontextové vyhodnocování
Známé vestavěné funkce, které nejsou implementovány, zůstávají odlišitelné od neznámého volání, zatímco registrace, nahrazení, odstranění či vymazání uživatelské funkce v rámci sešitu nebo procesu a změna vzorce definovaného názvu zneplatní zastaralý stav závislostí a výpočtů
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
  out AStats: TXLSFormulaSymbolAuditStats):
  TXLSFormulaSymbolIssues; overload;
TXLSWorkbook a TXLSXWorkbook poskytují stejná přetížení hromadného auditu; každý problém identifikuje neznámou funkci, neznámý název nebo syntaktickou chybu spolu s umístěním buňky listu či definovaného názvu, zdrojovým vzorcem a nevyřešeným symbolem
Audit prochází parsované stromy vzorců nebo uložené tokeny BIFF místo skenování textu, takže text podobný funkci uvnitř řetězce není hlášen; kompilace XLSX používá mezipaměť lokální pro operaci, jejíž klíč tvoří rozpoznaný text vzorce, list, národní prostředí, generace definovaných názvů, generace registrů uživatelských funkcí a dostupnost zpětných volání
EntryCount hlásí počet auditovaných vzorců, UniqueFormulaCount počet vzorců nezávisle zkompilovaných či prozkoumaných a CacheHitCount počet opakovaných položek obsloužených mezipamětí operace

Žádná mutace listu

Validace nevytváří ani neupravuje buňku, nemění hodnoty v mezipaměti, neaktualizuje graf závislostí, neoznačí sešit jako změněný a nevyvolá zaregistrovanou obslužnou rutinu uživatelské funkce
Přímá validace zůstává bez mutací; běžné přiřazení vzorce použije stejné rozhodnutí interně a potvrdí jej teprve po úspěšné validaci a přípravě cílového formátu

Příklad pro 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);

Viz také

Kontextové vyhodnocování vzorců
Výpočetní stroj aplikace Excel
Další členy klasického XLS API
Pokročilí členové API XLSX