Foile de lucru Classic XLS și XLSX expun același API doar-citire pentru evaluarea textului unei formule ca și cum ar fi fost introdusă într-un rând și o coloană alese, cu indexare de la 1
Evaluare punctuală
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;
Foaia de lucru furnizează contextul de nume locale, referințe necalificate, tabel și legături externe, fără a schimba foaia activă, selecția, modelul de celule, cache-ul de formule, starea dirty sau graful de dependențe
xlfrsA1 păstrează referințele absolute și mixte în timp ce rezolvă referințele relative din celula-țintă; xlfrsR1C1 rezolvă deplasările relative direct din acea țintă
Rezultate tipizate
TXLSFormulaEvaluationResult returnează Status, Value tipizată originală, IsVolatile și o înregistrare Issue stabilă care conține starea, codul nativ și mesajul
Valorile de formule precum #DIV/0!, #REF!, șirurile goale, matricele, valorile booleene și datele rămân valori distincte; eșecurile de parsare, funcțiile nesuportate, referințele circulare, referințele externe refuzate, callback-urile nesigure refuzate, anularea, argumentele invalide, foile de lucru indisponibile și epuizarea resurselor folosesc stări API explicite
Șabloane imuabile reutilizabile
function CreateFormulaEvaluationTemplate(Row, Col: Integer;
const Formula: WideString;
ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
Un șablon compilează formula o singură dată la ancoră și expune EvaluateAt și EvaluateAtWithOptions pentru evaluări repetate în celule-țintă diferite
Formulele obișnuite A1 și R1C1 reutilizează direct arborele compilat; referințele structurate A1 al căror sens depinde de rândul tabelului-țintă sunt rezolvate și compilate pentru contextul respectiv al țintei
Șabloanele nu păstrează nicio stare inscriptibilă a foiței de lucru, raportează în siguranță xlfeWorksheetUnavailable după distrugerea registrului de lucru și revin la recompilare conștientă de context atunci când schimbările registrului de lucru fac contextul compilat original perimat
Opțiuni pentru resurse, referințe externe și callback-uri
| AllowExternalReferences | Implicit true, dar permite doar ținte din spațiul de lucru înregistrate explicit sau cache-uri locale fișierului și nu efectuează niciodată acces implicit la fișiere sau la rețea |
| AllowUnsafeFormulaCallbacks | Implicit false și blochează numele de funcții periculoase să ajungă la un registru de funcții utilizator sau la un callback înainte de evaluarea oricărui argument; refuzul returnează xlfeUnsafeFunctionDenied |
| CancelFlag | Pointer boolean opțional verificat înainte și după evaluare |
| MaxFormulaLength | Implicit 8192 unități de cod UTF-16 |
| MaxEvaluationSteps | Implicit 1,000,000 evaluări de elemente de sintaxă |
| MaxRecursionDepth | Implicit 256 evaluări de formule imbricate |
| MaxArrayBytes | Implicit 64 MiB pentru payload-urile de matrice generate |
Un maxim zero sau negativ dezactivează limita respectivă per apel; politica de memorie pentru matrice la nivel de registru de lucru continuă să se aplice, iar atingerea unei limite activate returnează xlfeResourceLimit după eliberarea stării temporare de evaluare
Supraîncărcarea care acceptă opțiuni explicite tratează AllowUnsafeFormulaCallbacks ca autoritar pentru acel apel; evaluarea punctuală implicită și cea a șablonului moștenesc proprietatea omonimă a registrului de lucru
Exemplu 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);
Exemplu C++Builder
Lxcalc::_di_IXLSFormulaEvaluationTemplate evalTemplate =
sheet->CreateFormulaEvaluationTemplate(1, 1,
WideString(L"=ROW()+COLUMN()"), Lxcalc::xlfrsA1);
Lxcalc::TXLSFormulaEvaluationResult result =
evalTemplate->EvaluateAt(7, 8);
Consultați și