Direct-Reader- und Direct-Writer-API
TXLSDirectReader und TXLSDirectWriter verarbeiten XLSX-Pakete, ohne ein vollständiges Arbeitsblattraster im Speicher zu halten — API-Aufrufe, die ein Blatt beschreiben, müssen also vor oder während der entsprechenden Streaming-Phase erfolgen
Writer-Lebenszyklus und Zellwerte
TXLSDirectWriter.BeginFile oder BeginStream startet ein Paket, die Sheet-Methoden definieren je ein Arbeitsblatt, und Finish commitet das finale Paket
| Scalar cells | WriteString, WriteRichString, WriteNumber, WriteBoolean, WriteDateTimeund WriteError |
| Formula cells | WriteFormula, WriteFormulaNumber, WriteFormulaString, WriteFormulaBoolean, WriteFormulaDateTimeund WriteFormulaError nehmen zwischengespeicherte Ergebnisse des Aufrufers entgegen |
| Shared strings | UseSharedStrings aktiviert die paketweite Zeichenfolgen-Deduplizierung |
| Statistics | CellCount meldet die Anzahl der ausgegebenen Zellen |
| Panes | FreezePanes(ColSplit, RowSplit) schreibt eine Fixierung an der gegebenen 1-basierten Spalte und Zeile |
Zeilen und Spalten sind in der öffentlichen Writer-Oberfläche 1-basiert und müssen in Vorwärts-Arbeitsblattreihenfolge geliefert werden
Lebenszyklus des Worksheet-Patch
BeginPatch ersetzt ein Arbeitsblatt oder fügt ein neues ein, während unberührte Paketteile erhalten bleiben. Eine fehlgeschlagene Initialisierung gibt das Quellarchiv und den Quell-Stream sofort frei — etwa bei einem fehlenden Arbeitsblatt, einem fehlenden erforderlichen Paketteil, einem ungültigen Archiv oder einem Fehler beim Anlegen des Ziels. Quelldateien und temporäre Registrierungen im Besitz des Aufrufers bleiben in dessen Verantwortung; die freigegebenen Handles erlauben es, diese Quellen zu entfernen oder freizugeben
Close und die Zerstörung geben Quell-Handles frei, selbst wenn kein aktives Ziel existiert oder die Patch-Finalisierung eine Exception auslöst. Eine erfolglose Zielersetzung behält ihre zwischengestellte Ausgabe zur Inspektion, und der Writer kann nach einem Initialisierungsfehler einen weiteren Patch oder eine gewöhnliche Dateioperation starten
Wiederverwendbare Styles
AddCellStyle registriert ein unveränderliches Style-Handle auf Paketebene, und CloneCellStyle leitet ein neues Handle ab, ohne Arbeitsblattzeilen vorzuhalten
Definierte Namen und Hyperlinks
AddDefinedName, AddLocalDefinedName, AddDefinedRangeund AddLocalDefinedRange fügen arbeitsmappen- oder blattlokale Namen hinzu, bevor das Paket finalisiert wird
AddHyperlink, AddHyperlinkRange, AddInternalHyperlinkund AddInternalHyperlinkRange geben externe Beziehungen oder interne Blattziele für eine Zelle oder einen Bereich aus
Datenüberprüfung
AddDataValidation und AddDataValidationSqRef legen die vollständige Regelfläche offen, während AddListValidation, AddWholeNumberValidation, AddDecimalValidation, AddDateValidation, AddTimeValidation, AddTextLengthValidationund AddCustomValidation typisierte Helfer bereitstellen
Bedingte Formatierung
AddConditionalFormat, AddConditionalFormatExpression, AddConditionalFormatContainsText, AddConditionalFormatNotContainsText, AddConditionalFormatBeginsWith, AddConditionalFormatEndsWith, AddConditionalFormatTop10, AddConditionalFormatAboveAverage, AddConditionalFormatDuplicateValues, AddConditionalFormatUniqueValues, AddConditionalFormatContainsBlanks, AddConditionalFormatNotContainsBlanks, AddConditionalFormatContainsErrorsund AddConditionalFormatNotContainsErrors fügen skalare Regeln hinzu
AddConditionalFormatDataBar, AddConditionalFormatColorScale2, AddConditionalFormatColorScale3und AddConditionalFormatIconSet fügen visuelle Regeln hinzu; ClearConditionalFormats entfernt schwebende Regeln des aktuellen Blatts
AutoFilter und Tabellen
AddAutoFilterValue, AddAutoFilterDateGroupund AddAutoFilterSortCondition konfigurieren den Arbeitsblattfilter
AddTable erstellt einen Tabellenteil, und AddTableFilterValue, AddTableFilterDateGroupsowie AddTableSortCondition konfigurieren seinen Filter- und Sortierzustand
Schutz und Seitenumbrüche
ProtectSheet, UnprotectSheet, AddProtectedRangeund ClearProtectedRanges konfigurieren den Arbeitsblattschutz; ProtectWorkbook und UnprotectWorkbook konfigurieren Arbeitsmappenstruktur- und Fenstersperren
AddHorizontalPageBreak und AddVerticalPageBreak geben manuelle Seitenumbrüche für das aktuelle Arbeitsblatt aus
Speicherdiagnose des Direkt-Readers
TXLSDirectReader.SharedStringMemoryLimit begrenzt den Speicher dekodierter gemeinsamer Zeichenfolgen, SharedStringsOnDisk meldet die Migration in temporären indizierten Speicher, SharedStringCount meldet die Anzahl der geladenen Einträge, und ParallelDiag legt begrenzte Diagnosen der Parallel-Parser offen
Reader-Projektion und Formelzustand
FirstRow, LastRow, IncludeColumnund ClearColumnProjection schieben Zeilen- und 1-basierte Spaltenauswahl in den Arbeitsblatt-Parser, bevor Werte, Formeln oder Rich Text alloziert werden
IncludeFormulaText steht standardmäßig auf true; schaltet man es ab, bleiben zwischengespeicherte Werte, Koordinaten, Styles und HasFormula erhalten, während FormulaTextAvailable false wird und Formula leer bleibt
Zeilencursor
TXLSRowCursor.Open akzeptiert XLS-, XLSX-, XLSM-, ODS-, CSV- und TSV-Dateien oder -Streams; die ZIP-Erkennung unterscheidet ODS-Pakete von Open-XML-Arbeitsmappen, bevor ein Blatt geöffnet wird
SelectSheet und SelectSheetByName wählen ein Arbeitsblatt; SheetCount, SheetNames, SheetIndex, RowIndexund Eof legen den Traversierungszustand offen, während SharedStringMemoryLimit dieselbe begrenzte Shared-String-Richtlinie wie der Direkt-Reader anwendet
FirstRow, LastRow, IncludeColumnund ClearColumnProjection verwenden dieselben 1-basierten Filter über alle Cursor-Formate; Pass-Optionen können zwischen FindFirst und EOF nicht geändert werden, sind nach EOF, Blattwahl oder Schließen aber wieder änderbar
Jede TXLSRowCursorCell meldet HasFormula unabhängig von FormulaTextAvailable; klassisches XLS legt Formelpräsenz und zwischengespeicherte Ergebnisse offen, ohne nicht verfügbaren Token-Text zu behaupten, während IncludeFormulaText XLSX- und ODS-Formeltext schon vor der Akkumulation unterdrücken kann
Die ODS-Traversierung hält eine physische Zeilenvorlage, schneidet wiederholte Zeilenblöcke auf das angeforderte Intervall zurecht, springt innerhalb wiederholter Spannen direkt zwischen ausgewählten Spalten, läuft über abgedeckte Zellen hinweg, ohne sie als Werte zu liefern, und meldet ungültige oder rasterbedingte Wiederholungszählen über OnSkippedRecord
State unterscheidet xrcsClosed, xrcsBeforeFirst, xrcsActive, xrcsEof, xrcsCancelledund xrcsFaulted; Cancel ist idempotent, invalidiert die aktuelle Zeile und gibt den aktiven Arbeitsblatt-Stream frei, wahrt dabei die Quelle, sodass eine explizite Blattwahl einen neuen Durchlauf starten kann
Die Stream-Überladung steht standardmäßig auf xsoBorrowed, stellt die ursprüngliche Position des Aufrufers beim Schließen wieder her und akzeptiert xsoOwned , um nach erfolgreichem Öffnen die Ownership zu übertragen; fehlgeschlagene Öffnungen verbrauchen niemals die Ownership des Aufrufers
CurrentRowView leiht das aktuelle Zeilenarray, ohne es zu kopieren, und prüft vor jedem Zugriff eine Generation; Weiterbewegen, Auswählen, Abbrechen, Schließen oder Zerstören des Cursors invalidiert die Ansicht und löst bei späterem Zugriff EXLSRowCursorViewInvalidated aus
PeakRowBufferedBytes ist eine monotone Schätzung seit dem letzten Open über die Zelldatensätze, verwalteten Payloads, Rich Text und Format-Backend-Daten, die für eine logische Zeile vorgehalten werden; gedacht für Diagnosen zu begrenztem Speicher, nicht als exakte Heap-Bilanz
SheetPassesStarted zählt erfolgreiche Arbeitsblatt-Backend-Starts; das Einsehen von Blattnamen oder das Überspringen eines Blatts über die Callback-Fassade öffnet den Arbeitsblatt-Part nicht
Forward-Callback-Adapter
TXLSForwardReader delegiert das Dekodieren von XLS, XLSX, ODS, CSV und TSV an TXLSRowCursor, wandelt jede Zelle der aktuellen Zeile in einen OnCell -Callback um und bewahrt dieselben Verträge für Zeilengrenzen, Spaltenprojektion, Formelzustand, Rich Text, Passwort, übersprungene Datensätze, Streamposition und begrenzte Puffer
PeakRowBufferedBytes und SheetPassesStarted legen die gemeinsamen Cursor-Diagnosen auf der Callback-Oberfläche offen, während klassisches XLS zusätzlich ClassicBytesRead und ClassicPeakBufferedBytes
Reader-Ereignisse und Datensatztypen
Reader und Zeilencursor legen optionale Callbacks und plain records offen, alle deklariert in lxDirectRead. Jeder Callback folgt derselben Form: Der Datensatz beschreibt ein gestreamtes Element, und das Setzen von Abort stoppt den Scan (Sheet-Ereignisse akzeptieren zusätzlich SkipSheet)
| Cells | OnCell (Typ TXLSDirectCellEvent) liefert je Zelle ein TXLSDirectCell , dessen Kind (TXLSDirectCellKind: xdkEmpty, xdkNumber, xdkString, xdkBoolean, xdkDate, xdkError) das befüllte Wertfeld wählt; Rich Text reist als TXLSDirectRichText mit TXLSDirectRichTextRun -Einträgen, je eines mit einem TXLSDirectRichColor (Art TXLSDirectRichColorKind), TXLSDirectRichUnderlineund TXLSDirectRichVertAlign, plus optionalen TXLSDirectPhoneticProperties - und TXLSDirectPhoneticRun -Daten |
| Sheet framing | OnSheet (TXLSDirectSheetEvent) kann ein ganzes Arbeitsblatt überspringen, bevor seine Zellen geparst werden; OnSkippedRecord (TXLSDirectSkippedEvent) meldet fehlerhafte oder abgeschnittene Inhalte mit Datensatz-ID und Grund |
| Sheet layout | OnDimension, OnSheetFormat, OnColumn, OnRow, OnMergeund OnPane liefern TXLSDirectDimension-, TXLSDirectSheetFormat-, TXLSDirectColumn-, TXLSDirectRow-, TXLSDirectMerge- und TXLSDirectPane -Datensätze; der Fensterzustand verwendet TXLSDirectPaneState (xdpsSplit, xdpsFrozen, xdpsFrozenSplit, xdpsUnknown) |
| Cursor state | TXLSRowCursor.State ist ein TXLSRowCursorState (xrcsClosed, xrcsBeforeFirst, xrcsActive, xrcsEof, xrcsCancelled, xrcsFaulted); die Stream-Überladung von Open nimmt ein TXLSStreamOwnership (StandardxsoBorrowed , xsoOwned zum Übertragen der Ownership), und CurrentRowView liefert eine geliehene IXLSRowCursorView -Ansicht, deren Valid -Eigenschaft den Zugriff bewacht und deren ValueByCol eine Zelle der geliehenen Zeile ohne Kopieren liest; die Ansicht invalidiert, wenn der Cursor weiterläuft |
Writer-Parameter- und Style-Typen
Die typisierten Helfer des Writers (lxDirectWrite) nehmen Datensätze und Enums entgegen, damit Aufrufe allokationsfrei bleiben: WriteRichString nimmt ein TXLSDirectRichText; AddCellStyle baut einen paketweiten Style aus einem TXLSDirectCellStyle , dessen Ausrichtung (TXLSDirectHorizontalAlignment, TXLSDirectVerticalAlignment), Unterstreichung (TXLSDirectUnderline), Füllmuster (TXLSDirectFillPattern) und Rahmenkanten (TXLSDirectStyleBorder mit TXLSDirectBorderSide) das OOXML-Style-Modell spiegeln. Bedingte Formate übergeben ein TXLSDirectConditionalFormat mit TXLSDirectCfKind / TXLSDirectCfOperator / TXLSDirectCfValue / TXLSDirectCfValueKind und TXLSDirectIconSetType, Datenüberprüfung ein TXLSDirectDataValidation, Tabellen ein TXLSDirectTable, Hyperlinks einen TXLSDirectHyperlink, definierte Namen einen TXLSDirectDefinedName, differential Styles einen TXLSDirectDxfStyle, Kommentare einen TXLSDirectComment, Bilder ein TXLSDirectImage mit TXLSDirectImageFormat, Diagramme einen TXLSDirectChart mit TXLSDirectChartSeries und TXLSDirectChartType, Verbunde einen TXLSDirectMergeRange, geschützte Bereiche einen TXLSDirectProtectedRange, den Blattschutz ein TXLSDirectSheetProtectionOptions -Set aus TXLSDirectSheetProtectionOption, den AutoFilter-Sortierzustand einen TXLSDirectSortState, Spaltenoptionen eine TXLSDirectColumnOptionund die Seitengeometrie einen TXLSDirectPageMargins -Datensatz
TXLSDirectNeedRow = procedure(Sender: TObject; RowIndex: Integer;
var Eof: Boolean) of object;
function XLSDirectColName(Col: Integer): WideString;
function XLSDirectParseRef(const Ref: WideString;
out Col, Row: Integer): Boolean;
function XLSDirectPasswordHash(const Password: WideString): WideString;
OnNeedRow zieht Zeilen aus der Anwendung: Der Lieferant schreibt die Zellen der Zeile direkt durch den Writer und lässt Eof = False, oder meldet Erschöpfung mit Eof = True , um die Schleife zu beenden. Die Helfer konvertieren zwischen Koordinaten und Schutz-Primitiven: XLSDirectColName rendert eine nullbasierte Spalte als ihre A1-Buchstaben, XLSDirectParseRef parst eine A1-Zellreferenz, und XLSDirectPasswordHash berechnet den Legacy-Passwort-Hash, den die Blattschutz-Datensätze speichern