Interfejs API bezpośredniego czytnika i zapisywania
TXLSDirectReader i TXLSDirectWriter przetwarzają pakiety XLSX bez utrzymywania kompletnej siatki arkusza w pamięci, dlatego wywołania API opisujące arkusz muszą być wykonywane przed odpowiednią fazą strumieniowania lub w jej trakcie
Cykl życia zapisywania i wartości komórek
TXLSDirectWriter.BeginFile lub BeginStream rozpoczyna pakiet, metody arkusza definiują po jednym arkuszu, a Finish zatwierdza końcowy pakiet
| Scalar cells | WriteString, WriteRichString, WriteNumber, WriteBoolean, WriteDateTimei WriteError |
| Formula cells | WriteFormula, WriteFormulaNumber, WriteFormulaString, WriteFormulaBoolean, WriteFormulaDateTimei WriteFormulaError przyjmują wyniki w pamięci podręcznej dostarczone przez wywołującego |
| Shared strings | UseSharedStrings włącza deduplikację ciągów na poziomie pakietu |
| Statistics | CellCount raportuje liczbę wyemitowanych komórek |
| Panes | FreezePanes(ColSplit, RowSplit) zapisuje podział zablokowany w podanej kolumnie i wierszu (numerowanych od 1) |
Wiersze i kolumny są jednobazowe w publicznej powierzchni zapisywania i muszą być dostarczane w kolejności arkusza do przodu
Cykl życia łatki arkusza
BeginPatch podmienia jeden arkusz lub wstawia nowy arkusz, zachowując nietknięte części pakietu. Nieudana inicjalizacja natychmiast zwalnia archiwum źródłowe i strumień źródłowy — także przy brakującym arkuszu, brakującej wymaganej części pakietu, nieprawidłowym archiwum albo porażce utworzenia celu. Pliki źródłowe i tymczasowe rejestracje należące do wywołującego pozostają jego odpowiedzialnością; zwolnione uchwyty pozwalają te źródła usunąć albo zwolnić
Close i zniszczenie zwalniają uchwyty źródeł nawet wtedy, gdy nie ma aktywnego celu albo finalizacja łatki zgłosi wyjątek. Nieudana podmiana celu zachowuje swoją wystawioną zawartość do wglądu, a pisarz po nieudanej inicjalizacji może rozpocząć kolejną łatkę lub zwykłą operację plikową
Style wielokrotnego użytku
AddCellStyle rejestruje niezmienny uchwyt stylu na poziomie pakietu, a CloneCellStyle tworzy nowy uchwyt bez przechowywania wierszy arkusza
Nazwy zdefiniowane i hiperłącza
AddDefinedName, AddLocalDefinedName, AddDefinedRangei AddLocalDefinedRange dodają nazwy skoroszytu lub arkusza przed finalizacją pakietu
AddHyperlink, AddHyperlinkRange, AddInternalHyperlinki AddInternalHyperlinkRange emitują zewnętrzne relacje lub wewnętrzne lokalizacje arkusza dla jednej komórki lub zakresu
Walidacja danych
AddDataValidation i AddDataValidationSqRef udostępniają pełną powierzchnię reguł, natomiast AddListValidation, AddWholeNumberValidation, AddDecimalValidation, AddDateValidation, AddTimeValidation, AddTextLengthValidationi AddCustomValidation zapewniają wpisane pomocniki
Formatowanie warunkowe
AddConditionalFormat, AddConditionalFormatExpression, AddConditionalFormatContainsText, AddConditionalFormatNotContainsText, AddConditionalFormatBeginsWith, AddConditionalFormatEndsWith, AddConditionalFormatTop10, AddConditionalFormatAboveAverage, AddConditionalFormatDuplicateValues, AddConditionalFormatUniqueValues, AddConditionalFormatContainsBlanks, AddConditionalFormatNotContainsBlanks, AddConditionalFormatContainsErrorsi AddConditionalFormatNotContainsErrors dodają reguły skalarne
AddConditionalFormatDataBar, AddConditionalFormatColorScale2, AddConditionalFormatColorScale3i AddConditionalFormatIconSet dodają reguły wizualne; ClearConditionalFormats usuwa oczekujące reguły dla bieżącego arkusza
Autofiltr i tabele
AddAutoFilterValue, AddAutoFilterDateGroupi AddAutoFilterSortCondition konfigurują filtr arkusza
AddTable tworzy część tabeli, a AddTableFilterValue, AddTableFilterDateGroupi AddTableSortCondition konfigurują jej stan filtru i sortowania
Ochrona i podziały stron
ProtectSheet, UnprotectSheet, AddProtectedRangei ClearProtectedRanges konfigurują ochronę arkusza; ProtectWorkbook i UnprotectWorkbook konfigurują blokady struktury i okien skoroszytu
AddHorizontalPageBreak i AddVerticalPageBreak emitują ręczne podziały stron dla bieżącego arkusza
Diagnostyka pamięci bezpośredniego czytnika
TXLSDirectReader.SharedStringMemoryLimit ogranicza pamięć zdekodowanych współdzielonych ciągów, SharedStringsOnDisk raportuje migrację do tymczasowej pamięci indeksowanej, SharedStringCount raportuje liczbę załadowanych wpisów, a ParallelDiag udostępnia ograniczoną diagnostykę równoległego analizatora
Projekcja czytnika i stan formuł
FirstRow, LastRow, IncludeColumni ClearColumnProjection przekazują wybór wierszy oraz kolumn (numerowanych od 1) do analizatora arkusza jeszcze przed alokacją wartości, formuł czy tekstu sformatowanego
IncludeFormulaText ma domyślnie wartość true; jego wyłączenie zachowuje wartości z pamięci podręcznej, współrzędne, style i HasFormula , podczas gdy FormulaTextAvailable przyjmuje false, a Formula pozostaje puste
Kursor wierszy
TXLSRowCursor.Open przyjmuje pliki lub strumienie XLS, XLSX, XLSM, ODS, CSV i TSV; autodetekcja ZIP odróżnia pakiety ODS od skoroszytów Open XML, zanim zostanie otwarty arkusz
SelectSheet i SelectSheetByName wybierają arkusz; SheetCount, SheetNames, SheetIndex, RowIndexi Eof udostępniają stan przechodzenia, a SharedStringMemoryLimit stosuje tę samą ograniczoną politykę współdzielonych ciągów co bezpośredni czytnik
FirstRow, LastRow, IncludeColumni ClearColumnProjection stosują te same jednobazowe filtry we wszystkich formatach kursora; opcje przekazane przy otwarciu nie mogą się zmienić między FindFirst a EOF, ale stają się znowu modyfikowalne po EOF, wyborze arkusza lub zamknięciu
Każdy TXLSRowCursorCell raportuje HasFormula niezależnie od FormulaTextAvailable; klasyczny XLS ujawnia obecność formuły i wyniki z pamięci podręcznej bez rozdawania niedostępnego tekstu tokenów, a IncludeFormulaText może wytłumić tekst formuł XLSX i ODS przed akumulacją
Przechodzenie ODS trzyma jeden fizyczny szablon wiersza, przycina powtarzane bloki wierszy do żądanego przedziału, przeskakuje bezpośrednio między wybranymi kolumnami wewnątrz powtarzanych obszarów, przechodzi przez pokryte komórki bez zwracania ich jako wartości i raportuje nieprawidłowe lub ograniczone siatką liczby powtórzeń przez OnSkippedRecord
State rozróżnia xrcsClosed, xrcsBeforeFirst, xrcsActive, xrcsEof, xrcsCancelledi xrcsFaulted; Cancel jest idempotentny, unieważnia bieżący wiersz i zwalnia strumień aktywnego arkusza, zachowując źródło, dzięki czemu jawny wybór arkusza może rozpocząć nowy przebieg
Przeciążenie strumieniowe domyślnie przyjmuje xsoBorrowed, przywraca początkową pozycję wywołującego przy zamknięciu i akceptuje xsoOwned , aby przekazać własność po udanym otwarciu; nieudane otwarcia nigdy nie konsumują własności wywołującego
CurrentRowView pożycza tablicę bieżącego wiersza bez kopiowania i sprawdza generację przy każdym dostępie; przejście dalej, wybór arkusza, anulowanie, zamknięcie lub zniszczenie kursora unieważnia widok i przy późniejszym dostępie zgłasza EXLSRowCursorViewInvalidated on later access
PeakRowBufferedBytes to monotoniczne oszacowanie od ostatniego Open — ilości rekordów komórek, zarządzanych payloadów, tekstu sformatowanego i danych zaplecza formatów utrzymywanych dla jednego logicznego wiersza; służy diagnostyce regresji ograniczonej pamięci, a nie dokładnej księgowości sterty
SheetPassesStarted liczy udane starty zaplecza arkusza; podejrzenie nazw arkuszy albo pominięcie arkusza przez fasadę callbacków nie otwiera części arkusza
Adapter callbacków Forward
TXLSForwardReader deleguje dekodowanie XLS, XLSX, ODS, CSV i TSV do TXLSRowCursor, zamienia każdą komórkę bieżącego wiersza na callback OnCell i zachowuje te same kontrakty granic wierszy, projekcji kolumn, stanu formuł, tekstu sformatowanego, haseł, pominiętych rekordów, pozycji strumienia i ograniczonego bufora
PeakRowBufferedBytes i SheetPassesStarted udostępniają współdzieloną diagnostykę kursora na powierzchni callbacków, przy czym klasyczny XLS dodatkowo utrzymuje ClassicBytesRead i ClassicPeakBufferedBytes
Zdarzenia czytnika i typy rekordów
Czytnik i kursor wierszy udostępniają opcjonalne callbacki oraz proste rekordy, wszystkie zadeklarowane w lxDirectRead. Każdy callback ma ten sam kształt: rekord opisuje jeden element strumienia, a ustawienie Abort zatrzymuje skanowanie (zdarzenia arkuszy przyjmują dodatkowo SkipSheet)
| Cells | OnCell (typ TXLSDirectCellEvent) dostarcza po jednym TXLSDirectCell na komórkę, której Kind (TXLSDirectCellKind: xdkEmpty, xdkNumber, xdkString, xdkBoolean, xdkDate, xdkError) wybiera wypełnione pole wartości; tekst sformatowany podróżuje jako TXLSDirectRichText trzymający wpisy TXLSDirectRichTextRun , każdy z TXLSDirectRichColor (typ TXLSDirectRichColorKind), TXLSDirectRichUnderlinei TXLSDirectRichVertAlign, plus opcjonalnymi danymi TXLSDirectPhoneticProperties i TXLSDirectPhoneticRun data |
| Sheet framing | OnSheet (TXLSDirectSheetEvent) może pominąć cały arkusz przed analizą jego komórek; OnSkippedRecord (TXLSDirectSkippedEvent) raportuje zniekształconą lub uciętą zawartość z identyfikatorem rekordu i powodem |
| Sheet layout | OnDimension, OnSheetFormat, OnColumn, OnRow, OnMergei OnPane dostarczają rekordy TXLSDirectDimension, TXLSDirectSheetFormat, TXLSDirectColumn, TXLSDirectRow, TXLSDirectMergei TXLSDirectPane ; stan paneli używa TXLSDirectPaneState (xdpsSplit, xdpsFrozen, xdpsFrozenSplit, xdpsUnknown) |
| Cursor state | TXLSRowCursor.State to TXLSRowCursorState (xrcsClosed, xrcsBeforeFirst, xrcsActive, xrcsEof, xrcsCancelled, xrcsFaulted); przeciążenie strumieniowe Open przyjmuje TXLSStreamOwnership (domyślniexsoBorrowed , xsoOwned przekazuje własność), a CurrentRowView zwraca pożyczony widok IXLSRowCursorView , którego właściwość Valid strzeże dostępu, a ValueByCol czyta jedną komórkę pożyczonego wiersza bez kopiowania; widok unieważnia się, gdy kursor przechodzi dalej |
Typy parametrów i stylów writera
Typowane pomocniki writera (lxDirectWrite) przyjmują rekordy i wyliczenia, więc wywołania pozostają bez alokacji: WriteRichString przyjmuje TXLSDirectRichText; AddCellStyle buduje styl na poziomie pakietu z TXLSDirectCellStyle , którego wyrównanie (TXLSDirectHorizontalAlignment, TXLSDirectVerticalAlignment), podkreślenie (TXLSDirectUnderline), deseń wypełnienia (TXLSDirectFillPattern) i boki obramowania (TXLSDirectStyleBorder z TXLSDirectBorderSide) odzwierciedlają model stylów OOXML. Formatowanie warunkowe przekazuje TXLSDirectConditionalFormat z TXLSDirectCfKind / TXLSDirectCfOperator / TXLSDirectCfValue / TXLSDirectCfValueKind i TXLSDirectIconSetType, walidacja danych — TXLSDirectDataValidation, tabele — TXLSDirectTable, hiperłącza — TXLSDirectHyperlink, nazwy zdefiniowane — TXLSDirectDefinedName, style różnicowe — TXLSDirectDxfStyle, komentarze — TXLSDirectComment, obrazy — TXLSDirectImage z TXLSDirectImageFormat, wykresy — TXLSDirectChart z TXLSDirectChartSeries i TXLSDirectChartType, scalenia — TXLSDirectMergeRange, chronione zakresy — TXLSDirectProtectedRange, ochrona arkusza — zestaw TXLSDirectSheetProtectionOptions z TXLSDirectSheetProtectionOption, stan sortowania autofiltra — TXLSDirectSortState, opcje kolumn — TXLSDirectColumnOption, a geometria strony — rekord TXLSDirectPageMargins record
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 pobiera wiersze z aplikacji: dostawca zapisuje komórki wiersza wprost przez writer i zostawia Eof = Falsealbo deklaruje wyczerpanie danych przez Eof = True , przerywając pętlę. Pomocniki konwertują między współrzędnymi i pierwotnymi wartościami ochrony: XLSDirectColName renderuje kolumnę numerowaną od zera jako litery A1, XLSDirectParseRef analizuje odwołanie do komórki A1, a XLSDirectPasswordHash oblicza starszy hasz hasła, który zapisują rekordy ochrony arkusza