Berechnungs- und Konvertierungstreue
Berechnete Arrays kombinieren Auswahl-, Sortier-, Lookup-, Matrix- und Umformungsfunktionen, mit automatischem XLSX-Spill-Besitz, expliziten CSE-Zielen und begrenzten Auswertungsressourcen
Dynamische Arrays und explizite CSE-Arrays
Weisen Sie einen Array-produzierenden Ausdruck einer einzigen TXLSXCell.Formula zu und rufen Sie TXLSXWorkbook.Recalculate auf; das Ergebnis besitzt einen rechteckigen Spill mit Anker in dieser Zelle, einschließlich Formeln wie SEQUENCE(3,2), A1:A3*10, Array-Konstanten und Array-wertiger LET-Ergebnisse
Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)'; Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)'; Workbook.Recalculate;
Die Neuberechnung vergrößert oder verkleinert das Ergebnis, räumt nur veraltete Nachfolgezellen ab, die dem Anker gehören, und baut Abhängigkeiten neu auf, wenn sich die Ausdehnung ändert; Referenzen auf neu entstandene Nachfolgezellen und der A1#-Spill-Operator nutzen die aktuelle Ausdehnung
Vorhandene Werte, Formeln, Rich Text, andere Arrays, verbundene Bereiche, Tabellen und Arbeitsblattgrenzen blockieren einen Spill und erzeugen #SPILL!; Stile auf ansonsten leeren Zellen bleiben nutzbar, und das Räumen eines Hindernisses lässt die nächste Neuberechnung den Anker erneut versuchen
Das Bearbeiten einer Nachfolgezelle mit einem Wert oder Rich Text löst diese Zelle vom Anker, sodass die nächste Berechnung die Bearbeitung als Hindernis erhält; das Entfernen oder Leeren des Ankers gibt seine eigenen Nachfolgezellen frei, während ConvertFormulasToValues deren berechnete Werte als gewöhnliche Zellen behält
Das XLSX-Speichern zeichnet die aktuelle Array-Ausdehnung und Metadaten auf, und das Laden stellt den Besitz vorhandener gecachter Nachfolgezellen vor der Neuberechnung wieder her; Array-Formeln mit Fehlern behalten ihre Ausdehnung, solange die Fehler einzelne Elemente betreffen
SetArrayFormula bleibt der explizite Einstiegspunkt für CSE mit festem Bereich in beiden Arbeitsmappen-Engines; rohe Bereichsarithmetik wertet elementweise innerhalb dieses Bereichs aus, während gewöhnliche skalare Formeln die implizite Schnittmenge beibehalten
Der unäre @-Operator schneidet eine Referenz mit der Formelzelle und nimmt das erste Element eines berechneten Arrays; SINGLE und ANCHORARRAY sind akzeptierte Speicher-Aliase für implizite Schnittmenge und Spill-Referenzen
MAP akzeptiert mehrere Eingabearrays und eine passende LAMBDA-Parameterliste, propagiert Elementfehler und weist verschachtelte Array-Ergebnisse mit #CALC! zurück; FILTER akzeptiert berechnete Arrays sowie Zeilen- oder Spaltenmasken, einschließlich Fehlerpropagation und einem leeren #CALC!-Ergebnis, wenn kein Fallback geliefert wird
Dynamische Spill-Veränderung läuft serial, auch wenn mehrere Berechnungsthreads konfiguriert sind; die Stabilisierung der Ausdehnung ist auf 32 Durchläufe begrenzt, und dynamische Arrays in zirkulären iterativen Berechnungen werden zurückgewiesen statt als skalare Ergebnisse behandelt zu werden
INDEX akzeptiert Referenzen, Array-Konstanten und berechnete Arrays; wenn beide Selektoren skalar sind, liefern positive Zeilen- und Spaltenselektoren einen Wert, ein Nullselektor liefert die gewählte Zeile oder Spalte, und zwei Nullselektoren liefern das vollständige Array; eine Referenzquelle mit skalaren Selektoren behält Referenzverhalten für Verbraucher wie ROW und ISREF
Zeilen- und Spaltenselektoren können auch Arrays sein, einschließlich Konstanten, berechneter Vektoren, Bereichswerten und LET-Bindungen; entgegengesetzte Zeilen- und Spaltenorientierungen broadcasten zu einem rechteckigen Kreuzprodukt, während übereinstimmende Orientierungen Paarpositionen wählen; Singleton-Dimensionen broadcasten, und fehlende Positionen in ungleichen Dimensionen liefern einzelne #N/A-Werte
Wenn einer der Selektoren ein Array ist, wählt null oder ein weggelassener Selektor das erste Mitglied dieser Achse, statt eine ganze Zeile oder Spalte zu expandieren; fraktionale Selektoren truncate Richtung null, negative Selektoren liefern einzelne #VALUE!-Werte vor dem Truncieren, und Selektoren jenseits der Quellgrenzen liefern einzelne #REF!-Werte; gewählte Strings, Boolean-Werte und typisierte Fehler behalten ihre Typen
SORT und UNIQUE akzeptieren Bereiche, Konstanten und berechnete Arrays, einschließlich verschachtelter FILTER-, SEQUENCE- und LET-Ergebnisse; Zeilen- und Spaltenorientierung, auf- oder absteigende Sortierung, Reihenfolge nach erstem Vorkommen und Deduplizierung auf genau einmal folgen für jede Quellform demselben Kontrakt
Arbeitsmappen-eigene Namen können Referenz-, Skalar- oder berechnete Array-Quellen liefern; ISREF(INDEX(...)) unterscheidet ein echtes Referenzergebnis von einem benannten berechneten Wert; skalare INDEX-Selektoren und numerische SORT-Optionen truncieren fraktionale Werte, und optionale Boolean-Argumente weisen Text außer TRUE oder FALSE zurück
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;
Dieses Selektorbeispiel spillt {1,3;7,9} in ein Zweimal-zwei-Ergebnis; INDEX(SEQUENCE(3,3),{1;3},{1;3}) liefert stattdessen die Paarspalte {1;9}; Array-Selektoren erzeugen Werte, selbst wenn die Quelle eine Referenz ist, während skalare Referenzselektoren die Referenzidentität erhalten
Diese Ausdrücke können in XLSX spillen und ihre Größe ändern oder innerhalb eines expliziten CSE-Ziels ausgewertet werden; Fehler aus Array-Quellen bleiben typisiert, und ein leeres Exactly-once-Ergebnis liefert #CALC!; Selektorausgaben zählen gegen das Auswertungsschritt-Budget, und die kombinierten Quell-, Selektor- und Ergebnis-Matrix-Payloads werden gegen das Array-Speicherbudget geprüft
INDEX akzeptiert ein explizites viertes area_num-Argument von 1 für eine berechnete Quelle, und Zeilen-, Spalten- und Bereichsselektoren können zusammen über eine unterstützte Referenzvereinigung auf demselben Blatt broadcasten; echte Multi-Area-Referenzen behalten ihre Identität über lokale definierte Namen und LET, während skalares CHOOSE die gewählte Referenz behält, einschließlich einer Wahl auf einem anderen Blatt; Selektor-Array-Ergebnisse sind Werte statt verschachtelter Referenzarrays; siehe INDEX-Bereichsauswahl und Referenzidentität für Null-, Fehl-, Koercions- und Fehlerregeln
Für die eigenständige Berechnung akzeptiert TXLSCalculator.OnGetSpillRange einen TXLSGetSpillRange-Callback, der die aktuellen inklusiven Grenzen eines Ankers auflöst; arbeitsmappenbasierte Auswerter installieren diesen Callback automatisch
TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer; var LastRow, LastCol: Integer): Integer of object;
lxNormalizeStorageFormula normalisiert die verfasste Formelsyntax für OOXML, lxTryStorageFormulaOperators übersetzt Spill- und Implizite-Schnittmenge-Operatoren, und lxApplyXlfnPrefix setzt die erforderlichen Future-Function-Präfixe; geschützte Text- und Array-Zeilenseparatoren bleiben intakt, und das Zuweisen einer Formel behält den Text des Aufrufers im Speicher
Speichern ändert den verfassten In-Memory-Ausdruck nicht; das erneute Öffnen neu verfasster XLSX-Formeln liefert kanonische Speichersyntax mit Komma-Argumenten und ohne führendes =, konsistent mit nativen Excel-Imports; unverändertes importiertes Formel-XML behält seinen bestehenden Erhaltungspfad
Lookup-, Matrix- und Umformungskomposition
TRANSPOSE akzeptiert Referenzen, Konstanten und berechnete Arrays und erhält Text, Boolean-Werte und einzelne Fehler; leere Quellzellen werden numerische null
MMULT, MDETERM und MINVERSE akzeptieren berechnete Matrizen und verschachtelte Ausdrücke wie MMULT(MUNIT(2),SEQUENCE(2,2)); ihre Matrixeinträge müssen numerisch sein, mit Text, Boolean-Werten und Leeren zurückgewiesen statt koerziert, während Quellfehler ihre Fehlercodes behalten
CHOOSECOLS und CHOOSEROWS akzeptieren skalare oder eindimensionale Selektorvektoren, verketten Selektoren in Argumentreihenfolge, erhalten Duplikate und zählen negative Indizes vom Ende; fraktionale Selektoren truncieren Richtung null, null und außerhalb des Bereichs liegende Selektoren weisen zurück, und zweidimensionale Selektormatrizen werden nicht unterstützt
XLOOKUP, XMATCH und MATCH akzeptieren berechnete Lookup-Vektoren und Array-wertige Lookup-Anfragen; Schlüssel müssen in einer Zeile oder einer Spalte liegen, und XLOOKUP-Ergebnisarrays müssen zu dieser Lookup-Achse ausgerichtet sein
Ein skalares XLOOKUP kann eine gesamte passende Zeile oder Spalte zurückgeben, einschließlich typisierter Fehler; eine Array-wertige Lookup-Anfrage behält ihre eigene Form und nimmt die erste Komponente jedes passenden Slice- oder Fallback-Arrays
Exakte Lookup-Scans überspringen Fehler in der Schlüsselvektor-Suche; Boolean-, numerische und Textschlüssel bleiben unterscheidbar, während gewöhnliche skalare Referenzpfade ihr bestehendes Streaming- und Neuberechnungs-Cache-Verhalten behalten; binäre Suchmodi verlangen weiterhin korrekt sortierte Schlüssel
VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS und EXPAND akzeptieren berechnete Eingaben und typisiertes Padding; ein Ergebnis ohne Zeilen oder Spalten liefert #CALC!, und Wrapping verlangt eine eindimensionale Eingabe
Matrixarbeit, Lookup-Scans, Selektordurchlauf, Kopieren und Padding verbrauchen das Auswertungsschritt-Budget; gleichzeitig gehaltene Eingabe-, Arbeits- und Ausgabematrix-Payloads werden vor der Allokation gegen das konfigurierte Array-Speicherlimit geprüft
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;
Typisierte moderne Berechnungsfehler
#SPILL! und #CALC! bleiben durch Berechnung, Anzeige, Cache-Inspektion und XLSX-Neuöffnung hindurch typisierte Zellfehler; die XLSX-Ausgabe trägt ihre Rich-Value-Metadaten und behält gleichzeitig den standardmäßigen Cached-Error-Fallback für Leser bei, die diese Erweiterung nicht verstehen
Formeltext-Ergebnisse, einschließlich CSE- und dynamischer Array-Nachfolger, nutzen Literal-String-Caches, damit Excel sie vor der Neuberechnung anzeigen kann; reine Wertezellen verwenden weiterhin Shared Strings
Die moderne Rich-Error-Ausgabe enthält die Arbeitsmappenversion und Rich-Data-Berechnungsfeature-Deklarationen, die Excel zum Interpretieren dieser Caches vor der Neuberechnung benötigt; das emittierte calcId ist mindestens 191029, erhält höhere angeforderte Werte und ändert die In-Memory-CalcId-Property der Arbeitsmappe nicht
Importierte Zell- und Wertmetadaten, nicht verwandte Rich-Value-Strukturen und opake Buckets behalten ihre ursprünglichen Identitäten, wenn neue Fehler-Buckets angehängt werden; das Ersetzen einer Fehlerzelle räumt veraltete typisierte Fehlermetadaten beim Speichern weg
TXLSXRichErrorCodes ist der Integer-Array-Typ für dekodierte Rich-Error-Buckets; Anwendungscode liest typisierte Fehler aus dem Variant-Wert der Zelle
BIFF8 kann diese modernen Fehler und Spill-Operatoren nicht treu abbilden; der Classic-Serializer weist nicht unterstützte moderne Repräsentationen zurück, statt einen nicht verwandten Legacy-Fehlercode zu vergeben
Konvertierungs-Preflight
TXLSXWorkbook.GetConversionReport liefert einen aufruferbesessenen TXLSConversionReport, ohne neu zu berechnen oder die Arbeitsmappe zu ändern; die Typen sind in lxDiagnostics deklariert
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 oder xlsConversionExcelBinaryWorkbook |
| Fidelity | TXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped oder xlsConversionUnsupported |
| Issue | TXLSConversionIssue legt Feature, Fidelity, SheetIndex, SheetName, Location und Message offen; HasLoss umfasst degraded-, dropped- und unsupported-Einträge |
Der Bericht inventarisiert bekannte Formatverluste wie VBA, Schutz, Arbeitsmappen-Views, Verbindungen, Abfragetabellen, Kommentare, externe Links, XML-Maps, Tabellenstruktur, Filterkriterien, Zeichnungen, typisierte Fehlercaches, nicht unterstützte Validierungs- oder Formelsyntax, Array-Besitz und opake Erweiterungsteile; er beschreibt die implementierten Konvertierungspfade und zertifiziert nicht jedes Feature in jeder externen Anwendung
ODS erhält gewöhnliche Tabellenzellen, gecachte Formelergebnisse, unterstützten Annotationstext und -autoren, passwortfreien Arbeitsblattschutz und darstellbare Filter, verliert dabei aber das Excel-Tabellenobjekt, reichere Diagrammgeometrie oder nicht unterstützte Regelsemantik; eine opake OOXML-Erhaltungs-Payload wird als dropped gemeldet, wenn das Ziel sie nicht tragen kann
Die XLSX-Fassade meldet die BIFF8-Ausgabe als nicht unterstützt; verwenden Sie die Classic-Arbeitsmappen-API für unterstützte BIFF-Workflows; Version 2.384.93 ergänzt ein begrenztes XLSB-Werte-und-Stile-Backend, das nicht abgebildete Formeln, Feature-Objekte, Metadaten und Berechnungseinstellungen sowohl bei abgesichertem als auch bei ungesichertem Speichern zurückweist
Abgesichertes Speichern
Status := Workbook.SaveAsChecked(Stream, xlsxOpenDocumentSpreadsheet, False);
Datei- und Stream-Überladungen führen den Known-Loss-Preflight vor dem Schreiben aus; AllowLossy=False weist degradierte oder verworfene Features mit Konvertierungsdiagnosen zurück, während AllowLossy=True diese Verluste explizit akzeptiert und dennoch nicht unterstützte Konvertierungen zurückweist
Ein zurückgewiesener Preflight lässt Zielbytes und Streamposition unverändert; erfolgreiche Anforderungen nutzen die bestehende Speichertransaktion und liefern dieselben Statuskonventionen wie SaveAs
Gewöhnliches SaveAs bleibt mit seinem bestehenden Verhalten verfügbar; Anwendungen, die eine explizite Verlustentscheidung brauchen, sollten den Bericht prüfen und abgesichertes Speichern verwenden
Template-Formate
xlsxOpenXMLTemplate wählt makrofreies XLTX, während xlsxOpenXMLMacroEnabledTemplate XLTM wählt und ein vorhandenes VBA-Projekt erhält; das Format ist explizit und wird nicht aus einer Dateierweiterung oder importierten Vorlage abgeleitet
Makrofreies XLTX weist eine Arbeitsmappe mit VBA zurück, selbst wenn verlustbehaftetes abgesichertes Speichern aktiviert ist; ein XLTM-Paket darf ohne VBA-Projekt emittiert werden, und HotXLS erzeugt keinen VBA-Code
ODS-Validierungsformeln
Eigene Boolean-Validierung nutzt of:is-true-formula(...); unterstützte skalare Grenzen, Listenquellen, qualifizierte A1-Referenzen, Strings und Argumenttrenner übersetzen nach OpenFormula und basieren beim Import gegen die Validierungs-Basiszelladresse um
Nicht unterstützte strukturierte, externe oder dreidimensionale Validierungsausdrücke werden zusammen mit ihren Zellreferenzen weggelassen, um hängende Validierungsdefinitionen zu vermeiden; der Konvertierungs-Preflight meldet die weggelassenen Regeln
ODS-Annotationen, Schutz und Filter
Gewöhnliche Zellkommentare exportieren als OpenDocument-Annotationen mit ihrem Text und Autor, einschließlich leerer Notizen, Tabs, Leerzeichen und Zeilenumbrüche; Notizen auf ansonsten fehlenden Zellen und entfernten Koordinaten nutzen sparse wiederholte Zeilen- und Spaltenläufe, ohne Arbeitsblattzellen zu erzeugen
Ein Kommentar auf der Ankerzelle eines verbundenen Bereichs behält seine Adresse; eine Notiz auf einer überdeckten Zelle oder außerhalb des Arbeitsblattrasters wird als dropped gemeldet; Rich-Comment-Text wird zu seinem angezeigten Text reduziert, und Konvertierungsberichte identifizieren den Verlust von Run-Styling, eigenen Boxabmessungen und always-visible-Präsentation
Das OpenDocument-Schutzflag und unterstützte gesperrte oder entsperrte Zellstile bleiben erhalten; der verlustfreie Arbeitsblatt-Subset nutzt kein Passwort und keine Bearbeitungsbereichs-Ausnahmen und erlaubt nur die Auswahl gesperrter und entsperrter Zellen
Sheet.Protect; Sheet.SheetProtectionOptions := [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells]; Sheet.Range['B2:B100'].Locked := False;
Excel-Passworthashes, moderne Passworteinstellungen, Bearbeitungsbereiche und Aktionsberechtigungen außerhalb dieses Subsets werden als degraded gemeldet, während das Schutzflag bleibt; auch der breite Standard-Berechtigungssatz von Excel verlangt eine explizite Verlustentscheidung
Der OpenDocument-Import erhält das Schutzflag und Zellsperrstile; native Passworthashes werden nicht in Excel-Hashes konvertiert, und nicht abgebildete importierte Berechtigungsmetadaten bleiben ein benannter Verlust in späteren Konvertierungsberichten
Der AutoFilter-Export unterstützt sechs skalare Vergleichsoperatoren, bis zu zwei skalare Bedingungen pro Spalte, verbunden mit AND oder OR, und ein AND zwischen Spalten; unterstützte reine Wertauswahllisten und Leer-Auswahlen haben kein Zwei-Werte-Limit und bleiben native Filtermetadaten
Numerische skalare Kriterien nutzen invariante endliche Werte; Textauswahlen erhalten ihre literalen Zeichen einschließlich Wildcard-Zeichen innerhalb von Auswahllisten, während Wildcard-Ausdrücke in benutzerdefinierten Filtern, mehrdeutige Boolean-Kriterien, Datumsgruppen, dynamische Daten, Farb- und Symbolfilter keine unterstützte Äquivalentkonvertierung haben
Nicht unterstützte Filterausdrücke werden als vollständiger Ausdruck weggelassen, statt einzelne Bedingungen abzuschwächen; der Filterbereich bleibt, und der Konvertierungsbericht identifiziert die weggelassenen Kriterien
ODS-Stream-Speicherung stagt das fertige Paket in einer registrierten temporären Datei, bevor am ursprünglichen Zielort geschrieben wird; vorhandene Präfix-Bytes und absolute ZIP-Offsets bleiben erhalten, einschließlich Positionen jenseits des ursprünglichen Endes; Abbruch oder eine Progress-Callback-Exception vor dem Commit erhält Zielbytes, Größe und Position und gibt die temporäre Datei frei; die abschließende Schreibbenachrichtigung bleibt nicht abbrechbar
Der OpenDocument-Import unterstützt dieselben skalaren Konjunktionen und Textdisjunktionen oder Wertmengen pro Spalte; spaltenübergreifendes OR, reguläre Ausdrücke, groß-/kleinschreibungssensitive Vergleiche und nicht unterstützte native Filteroperatoren bleiben explizite importierte Verluste
TXLSXOdsImportLoss und TXLSXOdsImportLosses beschreiben die privaten Arbeitsblatt-Herkunftskategorien; Konvertierungsberichte nutzen ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria und ImportedOdsCommentFormatting; sie überleben das Kopieren von Arbeitsblättern und erscheinen sowohl für OpenDocument- als auch für Open-XML-Konvertierungsziele
Die Filterkonvertierung erhält Metadaten und bestehende Zeilensichtbarkeit, ohne Filter anzuwenden oder Zellen neu zu berechnen; native Anwendungen bleiben für ihr eigenes Filter- und Bearbeitungsverhalten verantwortlich
Verwandte Workflows
- Stabile Member und transaktionale lokale Pivot-Cache-Aktualisierung
- Vom Aufrufer gelieferte Abfragetabellen-Provider und transaktionale Aktualisierung
- Threaded Conversations in wiederholten Berichtsbändern
- Diagramm-Cache-Aktualisierung und zusammengeführte native Paginierung
- Arbeitsmappen-Deklarationen und Speichermethoden