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í
| AllowExternalReferences | Vý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 |
| AllowUnsafeFormulaCallbacks | Vý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 |
| CancelFlag | Volitelný logický ukazatel kontrolovaný před vyhodnocením i po něm |
| MaxFormulaLength | Výchozí hodnota je 8192 jednotek kódu UTF-16 |
| MaxEvaluationSteps | Výchozí hodnota je 1,000,000 vyhodnocení syntaktických položek |
| MaxRecursionDepth | Výchozí hodnota je 256 vnořených vyhodnocení vzorců |
| MaxArrayBytes | Vý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é