Motorul de calcul Excel
Prezentare generală
HotXLS include un motor integrat pentru analizarea și calcularea formulelor; acest motor evaluează formulele celulelor în mod programatic în interiorul procesului dumneavoastră, eliminând necesitatea de a apela Excel sau controlere OLE externe pentru a rezolva valorile calculate ale registrului de lucru
Execuția calculului
Înainte de salvare sau export, declanșați un recalcul complet al registrului de lucru folosind interfața principală a registrului
procedure Calculate;
Motorul suportă familiile standard de funcții matematice, de dată, logice, șir și statistice; rezolvă secvențial dependențele celulelor și urmărește lanțurile de referință pentru a preveni referințele circulare
Evaluarea contextuală a formulelor
TXLSWorksheet și TXLSXWorksheet expun EvaluateFormulaAt pentru a calcula textul unei formule într-un rând și o coloană alese (numerotare de la unu), fără a scrie o celulă temporară și fără a schimba starea de calcul a registrului de lucru
Stilurile de referință A1 și R1C1, numele locale, referințele structurate, dependențele formulelor, rădăcinile de matrice, valorile de eroare tipizate ale Excel, starea volatilă, autorizarea explicită a referințelor externe, anularea și categoriile stabile de eșec trec prin același evaluator normal al registrului de lucru
CreateFormulaEvaluationTemplate compilează o singură dată o ancoră imuabilă și o refolosește pentru toate celulele țintă; referințele structurate A1 sensibile la rândul țintă sunt rezolvate pentru fiecare context țintă, iar limitele per apel plafonează lungimea formulei, numărul de pași de elemente de sintaxă, adâncimea recursivității și octeții matricei generate
Consultați evaluarea contextuală a formulelor pentru tipurile de rezultat, bugetele implicite, regulile de durată de viață și exemplele Delphi sau C++Builder
Operatori de matrice
Operatorii aritmetici, de comparație, de concatenare, de negare unară și de procent acceptă atât matrice calculate, cât și valori scalare
Un scalar se propagă pe fiecare element, iar o matrice cu un rând sau o singură coloană se propagă pe dimensiunea compatibilă; formele incompatibile returnează #VALUE!
Erorile sunt păstrate în celulele lor individuale de rezultat, astfel încât o împărțire la zero sau un element invalid nu aruncă valorile calculate pentru restul celulelor
COMBINA și PERMUTATIONA partajează semantica scalară și de propagare a matricelor, cu argumente întregi nenegative trunchiate și overflow verificat, în timp ce MUNIT returnează o matrice identitate bidimensională compactă de tip Double
FormulaArrayMemoryLimit are implicit 64 MiB și plafonează sarcinile utile ale matricelor generate; MUNIT validează în plus zona de spill rămasă a foii de lucru, în loc să impună un plafon fix de dimensiune
Inspectarea prezenței formulelor
ISFORMULA(reference) verifică apartenența la o formulă fără a calcula celula referențiată, astfel încât o formulă rămâne detectabilă chiar dacă rezultatul ei din cache este o eroare sau un șir gol
Un interval dreptunghiular returnează o matrice booleană cu aceeași formă; membrii de formulă partajată și de formulă de matrice clasică sau XLSX returnează true, în timp ce doar ancora unui spill dinamic este o celulă cu formulă
Valorile directe și numele definite scalare returnează #VALUE!, referințele invalide păstrează #REF!, iar matricele booleene generate sunt limitate de FormulaArrayMemoryLimit
XLSX scrie _xlfn.ISFORMULA și restaurează numele simplu la deschidere, ODS folosește sintaxa standard of:=ISFORMULA, iar ieșirea Classic XLS respinge funcția viitoare nesuportată înainte de a comite datele
Funcții de text moderne
UNICHAR trunchiază intrările numerice spre zero și convertește valorile scalare Unicode valide în UTF-16, inclusiv perechi de surrogate pentru planurile suplimentare și toate intervalele private-use
Intrările zero și cele în afara intervalului returnează #VALUE!, în timp ce code points surrogate izolate și noncaracterele Unicode returnează #N/A; intrările de tip interval și matrice generată păstrează aceste erori per element
BAHTTEXT convertește numerele finite în text baht și satang thailandez, rotunjește valorile intermediare depărtându-se de zero la două zecimale, păstrează semnul negativ când magnitudinea rotunjită ajunge la zero și dezvoltă notația științifică fără a trece printr-un tip întreg
XLSX salvează UNICHAR ca _xlfn.UNICHAR și restaurează numele simplu la redeschidere; BAHTTEXT își păstrează identitatea standard de funcție și rămâne simplu în formulele XLS și XLSX
Regresie și predicție
LINEST și LOGEST acceptă una sau mai multe coloane sau rânduri predictor și returnează coeficienții în ordinea Excel, urmați de interceptul opțional
Când argumentul de statistici este true, ambele funcții returnează rezultatul complet pe cinci rânduri, care conține erorile coeficienților, statisticile de potrivire, statistica F, gradele de libertate, suma pătratelor regresiei și suma pătratelor reziduurilor
TREND și GROWTH folosesc același model multivariabil și păstrează forma de rând sau de coloană a noilor valori predictor furnizate
Recalcularea dependențelor în XLS clasic
TXLSWorkbook.Recalculate construiește un graf al dependențelor formulelor la primul apel și evaluează formulele în ordinea precedențelor, nu în ordinea fizică a celulelor
Apelurile ulterioare refolosesc graful și recalculează doar dependenții tranzitivi ai valorilor modificate, plus formulele volatile; editările de formule, numele, structura foilor de lucru și rescrierea referințelor invalidează și reconstruiesc graful în condiții de siguranță
Referințele circulare folosesc setările clasice ale registrului de lucru EnableIteration, MaxIterations și MaxIterationChange, în timp ce UseFullPrecision=False aplică precizia afișată a numărului asupra rezultatelor din cache și a calculelor din aval ale acestora
Dependențele numelor definite
Calculul incremental urmărește numele cu scop de registru de lucru și de foaie de lucru prin formule imbricate și referințe multi-zonă
Formulele de nume aciclice își aduc dependențele exacte de celule, în timp ce ciclurile recursive de nume revin în siguranță la recalculare volatilă
Tabele de date What-If
Atât foile de lucru XLS clasice, cât și cele XLSX moderne pot crea, calcula, citi, scrie, copia și ajusta structural tabele de date What-If cu o variabilă sau cu două variabile
function AddDataTable( const AResultRange, ARowInputCell, AColumnInputCell: WideString ): TXLSDataTable;
Intervalul rezultat conține doar celulele de ieșire calculate, în timp ce formulele și valorile de încercare folosesc celulele din jur, în același aranjament ca în Excel
- Tabel cu intrare pe coloană — lăsați
ARowInputCellgol, plasați o formulă sursă deasupra fiecărei coloane de rezultate și plasați valorile de încercare la stânga rândurilor de rezultate - Tabel cu intrare pe rând — lăsați
AColumnInputCellgol, plasați o formulă sursă la stânga fiecărui rând de rezultate și plasați valorile de încercare deasupra coloanelor de rezultate - Tabel cu două variabile — furnizați ambele celule de intrare, plasați formula sursă deasupra și la stânga intervalului de rezultate, valorile de încercare pentru intrarea pe rând deasupra rezultatelor, iar valorile de încercare pentru intrarea pe coloană la stânga
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;
Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;
Acest exemplu cu intrare pe coloană calculează 3, 5 și 7 în D2:D4; fiecare valoare de încercare este aplicată printr-un context de calcul izolat, deci formulele care ajung la B1 indirect, prin alte celule cu formule, sunt recalculate corect
AddDataTable returnează nil pentru un interval invalid, o referință de intrare invalidă sau atunci când ambele referințe de intrare sunt goale; colecția DataTables a foii de lucru expune definiția rezultată și marcajele ei de intrare șters
Ștergerea unei celule de intrare referențiate păstrează definiția tabelului și returnează #REF! pentru ieșirile acestuia, în acord cu semantica registrului de lucru stocat
Funcții definite de utilizator
Extindeți motorul de formule cu logică de afaceri personalizată; înregistrați propriile funcții folosind evenimentele de mai jos
Numele externe periculoase și cele în stil macro sunt refuzate înainte ca argumentele sau handlerele să ruleze, cu excepția cazului în care registrul de lucru sau o evaluare contextuală individuală activează explicit AllowUnsafeFormulaCallbacks
- Evenimentul OnUserFunction — Gestionați funcții de bază definite de utilizator
- Evenimentul OnUserFunctionEx — Rezolvați funcții complexe cu parametri de interval de celule
- Callback pentru funcții utilizator — Cerințe de semnătură pentru handlere externe