HotXLS-documentatie

Excel-berekeningsengine

Overzicht

HotXLS bevat een ingebouwde engine voor het parseren en berekenen van formules; deze engine evalueert celformules programmatisch binnen uw proces, waardoor het niet nodig is om Excel of externe OLE-controllers aan te roepen om berekende werkmapwaarden te resolveren

Berekeningsuitvoering

Activeer voor het opslaan of exporteren een volledige herberekening van de werkmap met de hoofdwerkmapinterface

procedure Calculate;

De engine ondersteunt standaard wiskundige, datum-, logische, tekenreeks- en statistische functiefamilies; het lost celafhankelijkheden opeenvolgend op en volgt referentieketens om cirkelverwijzingen te voorkomen

Contextuele formule-evaluatie

TXLSWorksheet en TXLSXWorksheet stellen EvaluateFormulaAt beschikbaar om formuletekst te berekenen op een gekozen rij en kolom (1-based), zonder een tijdelijke cel weg te schrijven of de berekeningsstatus van de werkmap te veranderen

A1- en R1C1-referentiestijlen, lokale namen, structured references, formuleafhankelijkheden, array-roots, getypeerde Excel-foutwaarden, volatile-status, expliciete autorisatie van externe verwijzingen, annulering en stabiele foutcategorieën maken allemaal gebruik van de normale werkmapevaluator

CreateFormulaEvaluationTemplate compileert één keer een onveranderlijk anker en hergebruikt dat voor alle doelcellen; A1-structured references die van de doelrij afhangen worden per doelcontext opgelost, en limieten per aanroep begrenzen de formulelengte, het aantal syntaxitems, de recursiediepte en het aantal gegenereerde array-bytes

Zie Contextuele formule-evaluatie voor resultaattypen, standaardbudgetten, levensduurregels en Delphi- of C++Builder-voorbeelden

Array-operators

Rekenkundige operatoren, vergelijkingsoperatoren, concatenatie, unaire negatie en de procentoperator accepteren zowel berekende arrays als scalaire waarden

Een scalair wordt gebroadcast naar elk element, en een array van één rij of één kolom wordt gebroadcast langs een compatibele dimensie; incompatibele vormen geven #VALUE! terug

Fouten blijven behouden in hun eigen resultaatcel, dus één deling door nul of één ongeldig element gooit de berekende waarden van de overige cellen niet weg

COMBINA en PERMUTATIONA hanteren dezelfde scalaire en broadcast-arraysemantiek, met afgekapte niet-negatieve gehele argumenten en gecontroleerde overflow, terwijl MUNIT een compacte tweedimensionale Double-eenheidsmatrix teruggeeft

FormulaArrayMemoryLimit staat standaard op 64 MiB en begrenst de gegenereerde matrixpayloads; MUNIT valideert daarnaast de resterende spill-ruimte op het werkblad in plaats van een vast dimensieplafond op te leggen

Aanwezigheid van formules controleren

ISFORMULA(reference) controleert of een cel eigenaar is van een formule zonder de gerefereerde cel te berekenen, dus een formule blijft detecteerbaar wanneer het gecachte resultaat een fout of een lege tekenreeks is

Een rechthoekig bereik geeft een Booleaanse array met dezelfde vorm terug; leden van gedeelde formules en van klassieke of XLSX-matrixformules geven true terug, en bij een dynamische spill is alleen het anker een formulecel

Directe waarden en scalaire gedefinieerde namen geven #VALUE! terug, ongeldige verwijzingen behouden #REF!, en gegenereerde Booleaanse arrays worden begrensd door FormulaArrayMemoryLimit

XLSX schrijft _xlfn.ISFORMULA en herstelt de kale naam bij het openen, ODS gebruikt de standaardsyntax of:=ISFORMULA, en klassieke XLS-uitvoer wijst de niet-ondersteunde future function af voordat de gegevens worden weggeschreven

Moderne tekstfuncties

UNICHAR kapt numerieke invoer af richting nul en converteert geldige Unicode-scalarwaarden naar UTF-16, inclusief surrogate-paaruitvoer voor supplementary planes en alle private-use-bereiken

Nul en invoer buiten het bereik geven #VALUE! terug, terwijl geïsoleerde surrogate-codepoints en Unicode-noncharacters #N/A opleveren; bereikinvoer en gegenereerde arrays behouden deze fouten per element

BAHTTEXT converteert eindige getallen naar Thaise baht- en satang-tekst, rondt middelste waarden weg van nul af op twee decimalen, behoudt een minteken wanneer de afgeronde grootte nul wordt en schrijft wetenschappelijke notatie volledig uit zonder in te krimpen via een integer-type

XLSX slaat UNICHAR op als _xlfn.UNICHAR en herstelt de kale naam bij het opnieuw openen; BAHTTEXT gebruikt zijn standaard functie-identiteit en blijft kaal in XLS- en XLSX-formules

Regressie en voorspelling

LINEST en LOGEST accepteren een of meer voorspelkolommen of -rijen en geven coëfficiënten terug in Excel-volgorde, gevolgd door het optionele intercept

Als het statistiekargument true is, geven beide functies het volledige resultaat van vijf rijen terug met coëfficiëntfouten, fit-statistieken, de F-statistiek, vrijheidsgraden, de regressiekwadratensom en de residuele kwadratensom

TREND en GROWTH gebruiken hetzelfde multivariabele model en behouden de rij- of kolomvorm van de opgegeven nieuwe voorspelwaarden

Herberekening van afhankelijkheden in klassiek XLS

TXLSWorkbook.Recalculate bouwt bij de eerste aanroep een grafiek van formuleafhankelijkheden en evalueert formules in de volgorde van hun precedenten in plaats van in fysieke celvolgorde

Latere aanroepen hergebruiken de grafiek en herberekenen alleen de transitieve afhankelijken van gewijzigde waarden plus volatile formules; bewerkingen aan formules, namen, werkbladstructuur en herschreven verwijzingen maken de grafiek veilig ongeldig en bouwen die opnieuw op

Cirkelverwijzingen gebruiken de klassieke werkmapinstellingen EnableIteration, MaxIterations en MaxIterationChange, terwijl UseFullPrecision=False de weergegeven getalprecisie toepast op gecachte resultaten en de berekeningen daar stroomafwaarts

Afhankelijkheden van gedefinieerde namen

Incrementele berekening volgt namen met werkmap- of werkbladbereik door geneste formules en verwijzingen naar meerdere gebieden heen

Naamformules zonder cycli leveren hun exacte celafhankelijkheden aan, terwijl recursieve naamcycli veilig terugvallen op volatile herberekening

What-If-datatabellen

Zowel klassieke XLS- als moderne XLSX-werkbladen kunnen What-If-datatabellen met één of twee variabelen aanmaken, berekenen, lezen, schrijven, kopiëren en structureel aanpassen

function AddDataTable(
  const AResultRange, ARowInputCell, AColumnInputCell: WideString
): TXLSDataTable;

Het resultaatbereik bevat uitsluitend berekende uitvoercellen, terwijl formules en proefwaarden de omliggende cellen gebruiken, in dezelfde indeling als Excel

  • Tabel met kolominvoer — laat ARowInputCell leeg, zet een bronformule boven elke resultaatkolom en zet de proefwaarden links van de resultaatrijen
  • Tabel met rijinvoer — laat AColumnInputCell leeg, zet een bronformule links van elke resultaatrij en zet de proefwaarden boven de resultaatkolommen
  • Tabel met twee variabelen — geef beide invoercellen op, zet de bronformule boven en links van het resultaatbereik, de proefwaarden voor rijinvoer boven de resultaten en de proefwaarden voor kolominvoer links
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;

Dit voorbeeld met kolominvoer berekent 3, 5 en 7 in D2:D4; elke proefwaarde wordt toegepast via een geïsoleerde berekeningscontext, dus formules die indirect via andere formulecellen bij B1 uitkomen, worden correct herberekend

AddDataTable geeft nil terug bij een ongeldig bereik, een ongeldige invoerverwijzing of wanneer beide invoerverwijzingen leeg zijn; de collectie DataTables van het werkblad stelt de resulterende definitie en de bijbehorende deleted-input-vlaggen beschikbaar

Bij het verwijderen van een gerefereerde invoercel blijft de tabeldefinitie behouden en geven de uitvoeren #REF! terug, conform de opgeslagen werkmapsemantiek

Door de gebruiker gedefinieerde functies

Breid de formula-engine uit met aangepaste bedrijfslogica; registreer uw eigen functies met behulp van de onderstaande evenementen

Gevaarlijke externe en macro-achtige namen worden geweigerd voordat argumenten of handlers worden uitgevoerd, tenzij de werkmap of een individuele contextuele evaluatie expliciet AllowUnsafeFormulaCallbacks inschakelt