Dokumentace HotXLS

Kontextové vyhodnocování vzorců

Listy Classic XLS a XLSX zpřístupňují stejné API jen pro čtení pro vyhodnocování textu vzorce, jako by byl zadán ve zvoleném řádku a sloupci indexovaném od jedničky

Jednorázové vyhodnocení

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;
List dodává kontext lokálních názvů, nekvalifikovaných odkazů, tabulek a externích odkazů beze změny aktivního listu, výběru, modelu buněk, mezipaměti vzorců, stavu neaktuálnosti ani grafu závislostí
xlfrsA1 zachovává absolutní a smíšené odkazy a přitom rozpoznává relativní odkazy od cílové buňky; xlfrsR1C1 rozpoznává relativní posuny přímo z tohoto cíle

Typované výsledky

TXLSFormulaEvaluationResult vrací Status, původní typovanou Value, IsVolatile a stabilní záznam Issue obsahující stav, nativní kód a zprávu
Hodnoty vzorců, jako jsou #DIV/0!, #REF!, prázdné řetězce, pole, logické hodnoty a data, zůstávají odlišitelnými hodnotami; selhání parsování, nepodporované funkce, cyklické odkazy, zamítnuté externí odkazy, zamítnutá nebezpečná zpětná volání, zrušení, neplatné argumenty, nedostupné listy a vyčerpání prostředků používají explicitní stavy API
TXLSFormulaEvaluationStatus = (xlfeOk, xlfeInvalidArgument,
  xlfeWorksheetUnavailable, xlfeParseError, xlfeUnsupportedFunction,
  xlfeCircularReference, xlfeExternalReferenceDenied, xlfeCancelled,
  xlfeResourceLimit, xlfeFailed, xlfeUnsafeFunctionDenied);

TXLSFormulaEvaluationIssue = record
  Status: TXLSFormulaEvaluationStatus;
  NativeCode: Integer;
  Message: WideString;
end;
    

Znovupoužitelné neměnné šablony

function CreateFormulaEvaluationTemplate(Row, Col: Integer;
  const Formula: WideString;
  ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
Šablona jednou zkompiluje vzorec v jeho ukotvení a zpřístupňuje EvaluateAt a EvaluateAtWithOptions pro opakované vyhodnocování v různých cílových buňkách
Běžné vzorce A1 a R1C1 znovu používají zkompilovaný strom přímo; strukturované odkazy A1, jejichž význam závisí na řádku cílové tabulky, se rozpoznají a zkompilují pro tento cílový kontext
Šablony si neuchovávají zapisovatelný stav listu, bezpečně hlásí xlfeWorksheetUnavailable po zničení sešitu a vrací se k překompilování s vědomím kontextu, když změny sešitu učiní původní zkompilovaný kontext zastaralým

Možnosti prostředků, externích odkazů a zpětných volání

AllowExternalReferencesVýchozí hodnota je true, ale povoluje pouze explicitně zaregistrované cíle pracovního prostoru nebo mezipaměti lokální k souboru a nikdy neprovádí implicitní přístup k souborům nebo síti
AllowUnsafeFormulaCallbacksVýchozí hodnota je false a zablokuje nebezpečné názvy funkcí dříve, než se dostanou k registru uživatelských funkcí nebo zpětnému volání, ještě před vyhodnocením jakéhokoli argumentu; zamítnutí vrací xlfeUnsafeFunctionDenied
CancelFlagVolitelný logický ukazatel kontrolovaný před vyhodnocením i po něm
MaxFormulaLengthVýchozí hodnota je 8192 jednotek kódu UTF-16
MaxEvaluationStepsVýchozí hodnota je 1,000,000 vyhodnocení syntaktických položek
MaxRecursionDepthVýchozí hodnota je 256 vnořených vyhodnocení vzorců
MaxArrayBytesVýchozí hodnota je 64 MiB pro generované datové části polí
Nulové nebo záporné maximum zakáže tento limit na volání; politika paměti polí pro celý sešit stále platí a dosažení povoleného limitu vrátí xlfeResourceLimit po uvolnění dočasného stavu vyhodnocení
Přetížení přijímající explicitní volby považuje AllowUnsafeFormulaCallbacks za závazné pro dané volání; výchozí jednorázové i šablonové vyhodnocení dědí vlastnost sešitu stejného názvu

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

Příklad pro C++Builder

Lxcalc::_di_IXLSFormulaEvaluationTemplate evalTemplate =
  sheet->CreateFormulaEvaluationTemplate(1, 1,
    WideString(L"=ROW()+COLUMN()"), Lxcalc::xlfrsA1);

Lxcalc::TXLSFormulaEvaluationResult result =
  evalTemplate->EvaluateAt(7, 8);

Viz také

Metoda TXLSWorksheet.Calculate
Metoda IXLSWorkbook.Calculate
Výpočetní stroj Excelu