Berekenings- en conversiegetrouwheid
Berekende arrays combineren functies voor selectie, sortering, opzoeken, matrixbewerking en herstructurering, met automatisch XLSX-spill-eigendom, expliciete CSE-bestemmingen en begrensde berekeningsresources
Dynamische arrays en expliciete CSE-arrays
Wijs een array-producerende expressie toe aan één TXLSXCell.Formula en roep TXLSXWorkbook.Recalculate aan; het resultaat krijgt een rechthoekige spill die op die cel verankerd is, inclusief formules zoals SEQUENCE(3,2), A1:A3*10, arrayconstanten en array-waardige LET-resultaten
Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)'; Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)'; Workbook.Recalculate;
Herberekening laat het resultaat groeien of krimpen, wist alleen verouderde volgcellen die de anker bezit en bouwt afhankelijkheden opnieuw op zodra de omvang verandert; verwijzingen naar nieuw gevormde volgcellen en de A1#-spill-operator gebruiken de huidige omvang
Bestaande waarden, formules, rich text, andere arrays, samengevoegde bereiken, tabellen en werkbladgrenzen blokkeren een spill en leveren #SPILL! op; opmaak op verder lege cellen blijft bruikbaar, en zodra de blokkade weg is probeert de volgende herberekening het anker opnieuw
Bewerk je een volgcel met een waarde of rich text, dan wordt die cel losgekoppeld van het anker zodat de volgende berekening de bewerking als blokkade respecteert; het anker verwijderen of leegmaken geeft zijn volgcellen vrij, terwijl ConvertFormulasToValues hun berekende waarden als gewone cellen laat staan
Het opslaan als XLSX registreert de huidige array-omvang en metadata, en het laden herstelt het eigendom van bestaande gecachte volgcellen vóór herberekening; arrayformules met fouten behouden hun omvang zolang de fouten bij afzonderlijke elementen horen
SetArrayFormula blijft in beide werkmapengines het expliciete ingangspunt voor CSE met vast bereik; rauwe bereik-rekensommen evalueren element voor element binnen dat bereik, terwijl gewone scalaire formules impliciete intersectie houden
De unaire @-operator intersecteert een verwijzing met de formulecel en pakt het eerste element van een berekende array; SINGLE en ANCHORARRAY worden geaccepteerd als opslagalias voor impliciete intersectie en spill-verwijzingen
MAP accepteert meerdere invoerarrays en een bijpassende LAMBDA-parameterlijst, propageert elementfouten en weigert geneste array-resultaten met #CALC!; FILTER accepteert berekende arrays en rij- of kolommaskers, inclusief foutpropagatie en een #CALC! bij een leeg resultaat wanneer er geen fallback is meegegeven
Muteren van dynamische spills verloopt seriematig, ook wanneer meerdere berekeningsthreads zijn geconfigureerd; het stabiliseren van de omvang is begrensd op 32 passes, en dynamische arrays in circulaire iteratieve berekeningen worden geweigerd in plaats van als scalaire resultaten behandeld te worden
INDEX accepteert verwijzingen, arrayconstanten en berekende arrays; wanneer beide selectors scalair zijn, geeft een positieve rij- en kolomselector één waarde, geeft een nulselector de gekozen rij of kolom, en geven twee nulselectors de volledige array; een referentiebron met scalaire selectors houdt referentiegedrag aan voor consumenten zoals ROW en ISREF
Rij- en kolomselectors mogen ook arrays zijn: constanten, berekende vectoren, bereikwaarden en LET-bindingen; tegenovergestelde rij- en kolomoriëntaties verspreiden naar een rechthoekig kruisproduct, terwijl gelijke oriëntaties gepaarde posities kiezen; singleton-dimensies verspreiden mee, en ontbrekende posities bij ongelijke dimensies geven individuele #N/A-waarden
Wanneer een van de selectors een array is, kiest nul of een weggelaten selector het eerste lid van die as in plaats van een hele rij of kolom uit te rollen; gebroken selectors kappen af richting nul, negatieve selectors geven individuele #VALUE!-waarden vóór het afkappen, en selectors voorbij de brongrenzen geven individuele #REF!-waarden; gekozen strings, Boolean-waarden en getypeerde fouten behouden hun type
SORT en UNIQUE accepteren bereiken, constanten en berekende arrays, inclusief geneste FILTER-, SEQUENCE- en LET-resultaten; rij- of kolomoriëntatie, oplopend of aflopend sorteren, volgorde van eerste voorkomen en deduplicatie op precies-eenmaal volgen voor elke bronvorm hetzelfde contract
Werkmapgedefinieerde namen kunnen referentie-, scalaire of berekende-array-bronnen leveren; ISREF(INDEX(...)) onderscheidt een echt referentieresultaat van een benoemde berekende waarde; scalaire INDEX-selectors en numerieke SORT-opties kappen gebroken waarden af, en optionele Boolean-argumenten weigeren tekst anders dan TRUE of FALSE
Sheet.Cells.Item[1, 6].Formula := 'SORT(UNIQUE(FILTER(A1:B5,A1:A5>1)),1,-1)'; Sheet.Cells.Item[1, 9].Formula := 'INDEX(SORT(UNIQUE(A1:B5)),0,2)'; Sheet.Cells.Item[1, 12].Formula := 'INDEX(SEQUENCE(2,3,10,2),2,3)'; Workbook.Recalculate;
Sheet.Cells.Item[1, 1].Formula := 'INDEX(SEQUENCE(3,3),{1;3},{1,3})';
Workbook.Recalculate;
Dit selectorvoorbeeld spilt {1,3;7,9} als een resultaat van twee bij twee; INDEX(SEQUENCE(3,3),{1;3},{1;3}) geeft in plaats daarvan de gepaarde kolom {1;9}; array-selectors leveren waarden op zelfs wanneer de bron een verwijzing is, terwijl scalaire referentieselectors de referentie-identiteit behouden
Deze expressies kunnen spillen en van grootte veranderen in XLSX of evalueren binnen een expliciete CSE-bestemming; fouten uit arraybronnen blijven getypeerd en een leeg precies-eenmaal-resultaat geeft #CALC!; selectoruitvoer verbruikt het evaluatiestappenbudget, en de gecombineerde payloads van bron, selectors en resultaatmatrix worden getoetst aan het array-geheugenbudget
INDEX accepteert voor een berekende bron een expliciet vierde area_num-argument van 1, en rij-, kolom- en gebiedsselectors kunnen samen verspreiden over een ondersteunde referentie-unie binnen hetzelfde blad; echte referenties met meerdere gebieden behouden hun identiteit via lokale gedefinieerde namen en LET, terwijl scalaire CHOOSE de gekozen verwijzing vasthoudt, ook een keuze op een ander blad; selector-array-resultaten zijn waarden en niet geneste referentie-arrays; zie INDEX-gebiedsselectie en referentie-identiteit voor de regels rond nul, ontbrekende waarden, conversie en fouten
Voor zelfstandige berekening accepteert TXLSCalculator.OnGetSpillRange een TXLSGetSpillRange-callback die de huidige inclusieve grenzen van een anker opzoekt; werkmapgestuurde evaluators installeren deze callback automatisch
TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer; var LastRow, LastCol: Integer): Integer of object;
lxNormalizeStorageFormula normaliseert geschreven formulesyntaxis voor OOXML, lxTryStorageFormulaOperators vertaalt spill- en impliciete-intersectie-operators, en lxApplyXlfnPrefix plaatst de vereiste future-function-prefixen; beveiligde tekst- en array-rij-scheidingstekens blijven intact, en het toewijzen van een formule behoudt de tekst van de aanroeper in het geheugen
Opslaan verandert de geschreven in-memory expressie niet; het heropenen van nieuw geschreven XLSX-formules geeft canonieke opslagsyntaxis met komma-argumenten en zonder voorloop-= terug, consistent met native Excel-imports; ongewijzigde geïmporteerde formule-XML behoudt zijn bestaande bewaarpad
Opzoeking, matrix en herstructurering combineren
TRANSPOSE accepteert verwijzingen, constanten en berekende arrays en behoudt daarbij tekst, Boolean-waarden en individuele fouten; lege broncellen worden numerieke nul
MMULT, MDETERM en MINVERSE accepteren berekende matrices en geneste expressies zoals MMULT(MUNIT(2),SEQUENCE(2,2)); hun matrixelementen moeten numeriek zijn, en tekst, Boolean-waarden en lege waarden worden geweigerd in plaats van geconverteerd, terwijl bronfouten hun foutcodes behouden
CHOOSECOLS en CHOOSEROWS accepteren scalaire of eendimensionale selectorvectoren, voegen selectors samen in argumentvolgorde, behouden duplicaten en tellen negatieve indices vanaf het einde; gebroken selectors kappen af richting nul, nul en buitenbereik-selectors worden geweigerd, en tweedimensionale selectormatrices worden niet ondersteund
XLOOKUP, XMATCH en MATCH accepteren berekende zoekvectoren en array-waardige opzoekvragen; sleutels moeten één rij of één kolom beslaan, en XLOOKUP-resultaatarrays moeten uitlijnen met die zoekas
Een scalaire XLOOKUP kan een hele matchende rij of kolom teruggeven, inclusief getypeerde fouten; een array-waardige opzoekvraag behoudt zijn eigen vorm en pakt van elke matchende plak of fallback-array het eerste element
Exact zoeken slaat foutitems in de sleutelvector over; Boolean-, numerieke en tekstsleutels blijven onderscheiden, terwijl gewone scalaire referentiepaden hun bestaande streaming- en herberekeningscachegedrag houden; binaire zoekmodi vereisen nog steeds correct gesorteerde sleutels
VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS en EXPAND accepteren berekende invoer en getypeerde opvulwaarden; een resultaat zonder rijen of kolommen geeft #CALC!, en wrappen vereist eendimensionale invoer
Matrixwerk, zoeken, doorkruisen van selectors, kopiëren en opvullen verbruiken het evaluatiestappenbudget; tegelijk vastgehouden invoer-, werk- en uitvoermatrixpayloads worden vóór toewijzing getoetst aan de geconfigureerde array-geheugenlimiet
Sheet.Cells.Item[1, 1].Formula := 'XLOOKUP({1;3},SEQUENCE(3),SEQUENCE(3,2))';
Sheet.Cells.Item[1, 4].Formula := 'CHOOSECOLS(SEQUENCE(2,3),{-1;1})';
Sheet.Cells.Item[1, 7].Formula := 'TRANSPOSE(UNIQUE({"A";"B";"A"}))';
Workbook.Recalculate;
Getypeerde moderne berekeningsfouten
#SPILL! en #CALC! blijven getypeerde celfouten door berekening, weergave, cache-inspectie en heropenen van XLSX; XLSX-uitvoer voert hun rich-value-metadata mee en houdt de standaard cached-error-fallback aan voor lezers die die extensie niet begrijpen
Formulettekstresultaten, inclusief CSE- en dynamische-array-volgcellen, gebruiken letterlijke stringcaches zodat Excel ze vóór herberekening kan tonen; gewone waardecellen blijven shared strings gebruiken
Moderne rich-error-uitvoer bevat de werkmapversie en de Rich Data-berekeningsfunctiedeclaraties die Excel nodig heeft om die caches vóór herberekening te interpreteren; de uitgezonden calcId is minstens 191029, waarbij hogere opgevraagde waarden behouden blijven zonder de in-memory CalcId-eigenschap van de werkmap te veranderen
Geïmporteerde cel- en waarde-metadata, niet-gerelateerde rich-value-structuren en ondoorzichtige buckets behouden hun oorspronkelijke identiteit wanneer nieuwe foutbuckets worden toegevoegd; het vervangen van een foutcel wist verouderde getypeerde foutmetadata bij het opslaan
TXLSXRichErrorCodes is het integer-array-type dat wordt gebruikt voor gedecodeerde rich-error-buckets; toepassingscode leest getypeerde fouten uit de Variant-waarde van de cel
BIFF8 kan deze moderne fouten en spill-operators niet getrouw representeren; de Classic-serialisator weigert niet-ondersteunde moderne representaties in plaats van een willekeurige legacy-foutcode toe te wijzen
Conversiepreflight
TXLSXWorkbook.GetConversionReport geeft een door de aanroeper beheerde TXLSConversionReport terug zonder te herberekenen of de werkmap te wijzigen; de typen zijn gedeclareerd in lxDiagnostics
Report := Workbook.GetConversionReport(xlsConversionOpenDocument);
try
for I := 0 to Report.Count - 1 do
InspectIssue(Report.Items[I]);
finally
Report.Free;
end;
| Target | xlsConversionOpenXmlWorkbook, xlsConversionOpenXmlTemplate, xlsConversionMacroEnabledTemplate, xlsConversionOpenDocument, xlsConversionExcel97Workbook, of xlsConversionExcelBinaryWorkbook |
| Fidelity | TXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped, of xlsConversionUnsupported |
| Issue | TXLSConversionIssue stelt Feature, Fidelity, SheetIndex, SheetName, Location en Message beschikbaar; HasLoss omvat verlaagde, verworpen en niet-ondersteunde items |
Het rapport inventariseert bekende verliespunten zoals VBA, beveiliging, werkmapweergaven, verbindingen, querytabellen, opmerkingen, externe koppelingen, XML-maps, tabelstructuur, filtercriteria, tekenobjecten, getypeerde foutcaches, niet-ondersteunde validatie- of formulesyntaxis, array-eigendom en ondoorzichtige extensieonderdelen; het beschrijft de geïmplementeerde conversiepaden en certificeert niet elke functie in elke externe toepassing
ODS behoudt gewone tabelcellen, gecachte formuleresultaten, ondersteunde annotatietekst en auteurs, werkbladbeveiliging zonder wachtwoord en representeerbare filters, maar verliest het Excel-tabelobject, uitgebreidere grafiekgeometrie of niet-ondersteunde regelsemantiek; een ondoorzichtige OOXML-bewaarpayload wordt als verworpen gerapporteerd wanneer het doel die niet kan meedragen
De XLSX-facade rapporteert BIFF8-uitvoer als niet-ondersteund; gebruik de Classic-werkmap-API voor ondersteunde BIFF-werkstromen; versie 2.384.93 voegt een begrensde XLSB-backend voor waarden en opmaak toe die niet-representeerbare formules, feature-objecten, metadata en berekeningsinstellingen weigert bij zowel gecontroleerd als ongecontroleerd opslaan
Gecontroleerd opslaan
Status := Workbook.SaveAsChecked(Stream, xlsxOpenDocumentSpreadsheet, False);
Bestands- en stream-overloads draaien de known-loss-preflight vóór het wegschrijven; AllowLossy=False weigert verlaagde of verworpen features met conversiediagnoses, terwijl AllowLossy=True die verliezen expliciet accepteert en niet-ondersteunde conversies alsnog weigert
Een geweigerde preflight laat doelbytes en streampositie onaangetast; geslaagde aanvragen gebruiken de bestaande opslagtransactie en geven dezelfde opslagstatusconventies terug als SaveAs
Gewone SaveAs blijft beschikbaar met zijn bestaande gedrag; toepassingen die een expliciete verliesbeslissing nodig hebben moeten het rapport inspecteren en gecontroleerd opslaan gebruiken
Sjabloonformaten
xlsxOpenXMLTemplate kiest macrovrije XLTX, terwijl xlsxOpenXMLMacroEnabledTemplate XLTM kiest en een bestaand VBA-project behoudt; het formaat is expliciet en wordt niet afgeleid uit een bestandsextensie of geïmporteerd sjabloon
Macro-vrije XLTX weigert een werkmap met VBA, zelfs wanneer verliesgevend gecontroleerd opslaan is ingeschakeld; een XLTM-pakket mag zonder VBA-project worden uitgegeven, en HotXLS maakt geen VBA-code
ODS-validatieformules
Aangepaste Boolean-validatie gebruikt of:is-true-formula(...); ondersteunde scalaire grenzen, lijstbronnen, gekwalificeerde A1-verwijzingen, strings en argumentscheidingstekens worden naar OpenFormula vertaald en bij import herbouwd rond het basisceladres van de validatie
Niet-ondersteunde gestructureerde, externe of driedimensionale validatie-expressies worden samen met hun celverwijzingen weggelaten, zodat er geen losse validatiedefinities achterblijven; de conversiepreflight rapporteert de weggelaten regels
ODS-annotaties, beveiliging en filters
Gewone celopmerkingen worden geëxporteerd als OpenDocument-annotaties met hun tekst en auteur, inclusief lege notities, tabs, spaties en regeleindeoms; notities op verder afwezige cellen en ver uiteengelegen coördinaten gebruiken schaarse herhaalde rij- en kolomreeksen zonder werkbladcellen aan te maken
Een opmerking op de ankercel van een samengevoegd bereik behoudt zijn adres; een notitie op een gedekte cel of buiten het werkbladraster wordt als verworpen gerapporteerd; rich commentaartekst wordt afgevlakt tot zijn weergegeven tekst, en conversierapporten benoemen het verlies van run-opmaak, aangepaste vakafmetingen en altijd-zichtbare presentatie
De OpenDocument-beveiligingsvlag en ondersteunde vergrendelde of ontgrendelde celstijlen blijven behouden; het verliesvrije werkbladsubset gebruikt geen wachtwoord of bewerkbare-bereik-uitzonderingen en staat alleen selectie van vergrendelde en ontgrendelde cellen toe
Sheet.Protect; Sheet.SheetProtectionOptions := [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells]; Sheet.Range['B2:B100'].Locked := False;
Excel-wachtwoordhashes, moderne wachtwoordinstellingen, bewerkbare bereiken en actierechten buiten dat subset worden als verlaagd gerapporteerd zolang de beveiligingsvlag behouden blijft; de brede standaardset Excel-rechten vereist ook een expliciete verliesbeslissing
OpenDocument-import behoudt de beveiligingsvlag en celvergrendelstijlen; native wachtwoordhashes worden niet naar Excel-hashes geconverteerd, en niet-representeerbare geïmporteerde rechtenmetadata blijft een benoemd verlies in latere conversierapporten
AutoFilter-export ondersteunt zes scalaire vergelijkingsoperators, tot twee scalaire voorwaarden per kolom verbonden met AND of OR, en een AND tussen kolommen; ondersteunde gewone waardeselectielijsten en lege selecties hebben geen limiet van twee waarden en blijven native filtermetadata
Numerieke scalaire criteria gebruiken landschaal-onafhankelijke eindige waarden; tekstselecties behouden hun letterlijke tekens, inclusief jokertekens binnen selectielijsten, terwijl jokerexpressies in aangepaste filters, dubbelzinnige Boolean-criteria, datumgroepen, dynamische datums, kleur- en pictogramfilters geen equivalente ondersteunde conversie hebben
Niet-ondersteunde filterexpressies worden als volledige expressie weggelaten in plaats van geselecteerde voorwaarden te verzwakken; het filterbereik blijft staan, en het conversierapport benoemt de weggelaten criteria
Het opslaan van ODS-streams zet het volledige pakket eerst in een geregistreerd tijdelijk bestand voordat het op de oorspronkelijke positie van de bestemming wordt weggeschreven; bestaande prefixbytes en absolute ZIP-offsets blijven behouden, inclusief posities voorbij het oorspronkelijke einde; annulering of een exception in een progress-callback vóór de commit behoudt doelbytes, grootte en positie en geeft het tijdelijke bestand vrij; de uiteindelijke schrijfmelding blijft niet-annuleerbaar
OpenDocument-import ondersteunt dezelfde scalaire samenstellingen en tekstdisjuncties of waardensets binnen dezelfde kolom; OR over kolommen, reguliere expressies, hoofdlettergevoelige vergelijkingen en niet-ondersteunde native filteroperators blijven expliciete geïmporteerde verliezen
TXLSXOdsImportLoss en TXLSXOdsImportLosses beschrijven de private categorieën voor werkbladprovenance; conversierapporten gebruiken ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria en ImportedOdsCommentFormatting; ze overleven het kopiëren van werkbladen en verschijnen bij zowel OpenDocument- als Open XML-conversiedoelen
Filterconversie behoudt metadata en bestaande rijzichtbaarheid zonder filters toe te passen of cellen te herberekenen; native toepassingen blijven verantwoordelijk voor hun eigen filter- en bewerkingsgedrag