Dokumentácia HotXLS

Kontextové vyhodnocovanie vzorcov

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í

AllowExternalReferencesPredvolená 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
AllowUnsafeFormulaCallbacksPredvolená 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
CancelFlagVoliteľný logický ukazovateľ kontrolovaný pred vyhodnotením aj po ňom
MaxFormulaLengthPredvolená hodnota je 8192 jednotiek kódu UTF-16
MaxEvaluationStepsPredvolená hodnota je 1,000,000 vyhodnotení syntaktických položiek
MaxRecursionDepthPredvolená hodnota je 256 vnorených vyhodnotení vzorcov
MaxArrayBytesPredvolená 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ž

Metóda TXLSWorksheet.Calculate
Metóda IXLSWorkbook.Calculate
Výpočtový engine Excelu