Hárky Classic XLS a XLSX sprístupňujú rovnaké API len na čítanie na vyhodnocovanie textu vzorca, ako keby bol zadaný vo zvolenom riadku a stĺpci indexovanom od jednotky
Jednorazové vyhodnotenie
function EvaluateFormulaAt(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEvaluationResult; overload;
function EvaluateFormulaAt(Row, Col: Integer;
const Formula: WideString;
ReferenceStyle: TXLSFormulaReferenceStyle;
const Options: TXLSFormulaEvaluationOptions): TXLSFormulaEvaluationResult; overload;
Hárok dodáva kontext lokálnych názvov, nekvalifikovaných odkazov, tabuliek a externých odkazov bez zmeny aktívneho hárku, výberu, modelu buniek, medzipamäti vzorcov, stavu neaktuálnosti ani grafu závislostí
xlfrsA1 zachováva absolútne a zmiešané odkazy a pritom rozpoznáva relatívne odkazy od cieľovej bunky; xlfrsR1C1 rozpoznáva relatívne posuny priamo z tohto cieľa
Typované výsledky
TXLSFormulaEvaluationResult vracia Status, pôvodnú typovanú Value, IsVolatile a stabilný záznam Issue obsahujúci stav, natívny kód a správu
Hodnoty vzorcov, ako sú #DIV/0!, #REF!, prázdne reťazce, polia, logické hodnoty a dátumy, ostanú odlíšiteľnými hodnotami; zlyhania parsovania, nepodporované funkcie, cyklické odkazy, zamietnuté externé odkazy, zamietnuté nebezpečné spätné volania, zrušenie, neplatné argumenty, nedostupné hárky a vyčerpanie prostriedkov používajú explicitné stavy API
Opakovane použiteľné nemenné šablóny
function CreateFormulaEvaluationTemplate(Row, Col: Integer;
const Formula: WideString;
ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
Šablóna raz skompiluje vzorec v jeho ukotvení a sprístupňuje EvaluateAt a EvaluateAtWithOptions na opakované vyhodnocovanie v rôznych cieľových bunkách
Bežné vzorce A1 a R1C1 znovu používajú skompilovaný strom priamo; štruktúrované odkazy A1, ktorých význam závisí od riadku cieľovej tabuľky, sa rozpoznajú a skompilujú pre tento cieľový kontext
Šablóny si neuchovávajú zapisovateľný stav hárku, bezpečne hlásia xlfeWorksheetUnavailable po zničení zošita a vracajú sa k prekompilovaniu s vedomím kontextu, keď zmeny zošita urobia pôvodný skompilovaný kontext zastaraným
Možnosti prostriedkov, externých odkazov a spätných volaní
| AllowExternalReferences | Predvolená hodnota je true, ale povoľuje len explicitne zaregistrované ciele pracovného priestoru alebo medzipamäte lokálne k súboru a nikdy nevykonáva implicitný prístup k súborom alebo sieti |
| AllowUnsafeFormulaCallbacks | Predvolená hodnota je false a zablokuje nebezpečné názvy funkcií skôr, než sa dostanú k registru používateľských funkcií alebo spätnému volaniu, ešte pred vyhodnotením akéhokoľvek argumentu; zamietnutie vracia xlfeUnsafeFunctionDenied |
| CancelFlag | Voliteľný logický ukazovateľ kontrolovaný pred vyhodnotením aj po ňom |
| MaxFormulaLength | Predvolená hodnota je 8192 jednotiek kódu UTF-16 |
| MaxEvaluationSteps | Predvolená hodnota je 1,000,000 vyhodnotení syntaktických položiek |
| MaxRecursionDepth | Predvolená hodnota je 256 vnorených vyhodnotení vzorcov |
| MaxArrayBytes | Predvolená hodnota je 64 MiB pre generované dátové časti polí |
Nulové alebo záporné maximum zakáže tento limit na volanie; politika pamäti polí pre celý zošit stále platí a dosiahnutie povoleného limitu vráti xlfeResourceLimit po uvoľnení dočasného stavu vyhodnotenia
Preťaženie prijímajúce explicitné voľby považuje AllowUnsafeFormulaCallbacks za záväzné pre dané volanie; predvolené jednorazové aj šablónové vyhodnotenie dedí vlastnosť zošita rovnakého názvu
Príklad pre Delphi
Template := Sheet.CreateFormulaEvaluationTemplate(2, 2,
'=R[-1]C[-1]+1', xlfrsR1C1);
Result := Template.EvaluateAt(2, 2);
if Result.Status = xlfeOk then
UseValue(Result.Value);
Options := XLSDefaultFormulaEvaluationOptions;
Options.MaxEvaluationSteps := 10000;
Result := Template.EvaluateAtWithOptions(20, 4, Options);
Príklad pre C++Builder
Lxcalc::_di_IXLSFormulaEvaluationTemplate evalTemplate =
sheet->CreateFormulaEvaluationTemplate(1, 1,
WideString(L"=ROW()+COLUMN()"), Lxcalc::xlfrsA1);
Lxcalc::TXLSFormulaEvaluationResult result =
evalTemplate->EvaluateAt(7, 8);
Pozri tiež