2026-05-18 Version 2.28.1
- Added convenience APIs to the classic XLS facade. IXLSRange now exposes read-only Width and WidthInPixels helpers plus SaveAsCSV(FileName); IXLSWorksheet and IXLSWorkbook now expose SaveAsCSV(FileName / Stream) overloads for the used range or active sheet; IXLSPageSetup now exposes Order, Draft, BlackAndWhite, PrintNotes, and read-only IsFitToPages. SETUP record save/open now preserves those print flags.
2026-05-18 Version 2.28.0
- Added RTF export on TXLSXWorkbook. New SaveAsRTF overloads (FileName / Stream x default-active-sheet / explicit SheetIndex) write the chosen sheet as an RTF 1.6 document containing a plain table. Column widths are derived from the sheet's ColWidth data (1 Excel character unit is approximated as 96 RTF twips); columns without explicit widths fall back to StandardWidth if set, otherwise to 809 twips (~8.43 chars). Per-cell bold (\\b), italic (\\i), and font size (\\fsN in half-points) are applied from the cell's FontIndex. Non-ASCII characters are encoded as signed-16-bit RTF \\uN? unicode escapes per RTF 1.6 §2.4.2, covering the full BMP range. Merged cells are not spanned — origin cells carry the content and non-origin cells within the range are emitted as empty cells. Default SheetIndex writes the active sheet; out-of-range returns -1. Empty sheets produce a minimal valid RTF document.
2026-05-18 Version 2.27.0
- Added HTML export on TXLSXWorkbook. New SaveAsHTML overloads (FileName / Stream x default-active-sheet / explicit SheetIndex) write the chosen sheet as a UTF-8 HTML document with a UTF-8 BOM. Output is a single
inside a minimal HTML page. Merged cells are expressed as colspan / rowspan attributes. Cell styling is emitted as inline CSS: font family, size (pt), bold (font-weight:bold), italic (font-style:italic), strikethrough (text-decoration:line-through), and explicit font color; solid-pattern fill foreground color as background-color; horizontal alignment (left / center / right / justify) and WrapText (white-space:pre-wrap). Date variant values render as 'yyyy-mm-dd hh:nn:ss'; rich-text cells flatten to their concatenated run text. Theme colors are silently skipped (no theme1.xml resolution in the simple HTML export). Default SheetIndex writes the active sheet; out-of-range returns -1.
2026-05-18 Version 2.26.0
- Added theme color + indexed color + tint/shade support on TXLSXFont, TXLSXFill, and TXLSXBorderEdge. Each color slot now carries three new fields beside the existing RGB Color: ColorTheme (Integer; -1 = unset; 0..11 = OOXML theme slot), ColorIndex (Integer; -1 = unset; 0..63 = OOXML legacy palette slot — pairs with Workbook.IndexedColor[N] and XlsxDefaultIndexedPalette), and TintAndShade (Double in [-1.0, 1.0]; only emitted with theme). TXLSXFill exposes Foreground / Background variants of all three. Writer priority: theme > indexed > rgb; the older "ColorIsAuto = True" path keeps suppressing the element entirely. SaveAs and Open round-trip the full and attribute sets on font / fill / border colors. Bookkeeping: TXLSXBorders.LookupOrAdd now compares all three new fields so theme-colored borders don't collide with rgb-colored entries in the pool.
2026-05-18 Version 2.25.0
- Added external workbook link round-trip on TXLSXWorkbook. New types: TXLSXExternalLink (Target URL + SheetNames list) + TXLSXExternalLinks collection. TXLSXWorkbook.ExternalLinks property exposes the collection; Add(Target) appends and returns a new link the caller fills out. SaveAs emits a workbook-level block in xl/workbook.xml, an externalLink rel in xl/_rels/workbook.xml.rels (tail of the rid range so existing rids stay stable), the xl/externalLinks/externalLink{N}.xml part per entry () and its sibling .rels file pointing at the remote workbook URL with TargetMode="External", plus matching ContentType Overrides. Open scans externalLink{N}.xml + .rels pairs starting at index 1 and stops at the first gap. The current release round-trips Target URL + SheetNames only; cached cell values inside are not preserved.
2026-05-18 Version 2.24.0
- Added composing border helper TXLSXRange.SetBorders. New TXLSXBorderEdgeKind enum (xlsxEdgeAll / Outline / Inside / InsideHorizontal / InsideVertical / Top / Bottom / Left / Right / DiagonalUp / DiagonalDown) selects which edges to write. SetBorders(Kind, Style, Color) / SetBorders(Kind, Style) (defaults to opaque black) iterates every cell in the range, computes the edge mask per cell position (corner cells get two outline edges, edge cells get one, interior cells get inside grid lines, etc.), composes Style + Color onto a clone of the cell's current border (so successive Outline + Inside calls stack instead of overwriting), then does a workbook-level lookup-or-add on Workbook.Borders and writes the resulting 1-based BorderIndex back on the cell. New TXLSXBorders.LookupOrAdd helper returns 0 for empty borders so the pool never bloats with no-op entries.
2026-05-18 Version 2.23.0
- Added CSV export overloads on TXLSXWorkbook. New entry points: SaveAsCSV(FileName) / SaveAsCSV(FileName, SheetIndex, Delimiter) / SaveAsCSV(Stream) / SaveAsCSV(Stream, SheetIndex, Delimiter) write the chosen sheet's populated extent as UTF-8 with leading BOM and CRLF line terminators. Default variants pick the active sheet and comma delimiter; the SheetIndex/Delimiter overload accepts any WideChar (commonly tab #9 for TSV). Field quoting follows RFC 4180 — values containing the delimiter, double quote, CR or LF are wrapped in quotes with embedded quotes doubled. Date values render as 'yyyy-mm-dd hh:nn:ss'; rich-text cells flatten to the concatenated run text; empty cells in the interior of the bounding rectangle render as bare delimiters and the row stops at the last populated column.
2026-05-18 Version 2.22.0
- Added workbook-level indexed color palette overrides on TXLSXWorkbook. New entry points: IndexedColor[Index: Integer]: LongWord (read/write, valid slots 0..63, ARGB LongWord), HasCustomIndexedColor(Index): Boolean (reports whether the caller has overridden a slot), CustomIndexedColorCount: Integer (number of overridden slots; 0 = palette emits as default), ResetIndexedColors: procedure (discard every override). The new XlsxDefaultIndexedPalette constant exposes the OOXML legacy ECMA-376 palette for slots 0..63. SaveAs emits with all 64 children only when at least one slot has been overridden; untouched slots fall back to the default palette so files re-saved without changes stay clean. Open parses the block and silently drops slots whose value matches the default so round-trips stay minimal. Out-of-range slot assignments (< 0 or > 63) are dropped instead of raising.
2026-05-18 Version 2.21.0
- Added six sheet-view display properties on TXLSXWorksheet. Zoom: Integer is the zoom percent shown in Excel's status bar (10..400, default 100; out-of-range assignments clamp on write). DisplayGridLines / DisplayZeros: Boolean (default True) hide cell grid lines or render zero-valued cells as empty when set False. DisplayRightToLeft: Boolean (default False) flips the sheet to RTL layout for Arabic / Hebrew / etc. StandardWidth / StandardHeight: Double set the default column width (Excel character units) / default row height (points); 0 = unset, in which case Excel applies its built-in 8.43 / 15 defaults. SaveAs emits and only when the values differ from the Excel defaults; Open parses them back. Existing freeze-pane + tab-selected handling on is unchanged and now shares a single emitter.
2026-05-17 Version 2.20.7
- Added TStream overloads on TXLSXWorkbook for in-memory serialization. New entry points: SaveAs(Stream: TStream) / SaveAs(Stream: TStream; FileFormat: TXLSXFileFormat) write the entire .xlsx package into the given stream starting at the current position; Open(Stream: TStream) reads it back. The caller owns the stream and must Free it. Useful for HTTP responses, blob storage, in-memory pipelines, and unit tests that bypass the local file system. The existing file-based SaveAs / Open overloads are unchanged and now delegate to the same internal write / read helpers.
2026-05-17 Version 2.20.6
- Added Hidden / Visible / Comment properties to TXLSXDefinedName. Hidden maps to the OOXML attribute (defaults False / Visible=True; True hides the name from Excel's Name Manager UI). Visible is a Boolean alias (inverse of Hidden) for clearer call-site code. Comment maps to . SaveAs emits both attributes when they differ from defaults; Open parses them back. SheetIndex (the existing Local scope binding via localSheetId) is unchanged.
2026-05-17 Version 2.20.5
- Added five more font traits to TXLSXFont. New TXLSXFontVertAlign enum (xlsxVertAlignBaseline / Superscript / Subscript) drives the existing Excel "Superscript" / "Subscript" font checkboxes via a single VertAlign property (mutually exclusive in the UI). New Boolean OutlineFont and Shadow properties for the matching Excel font effects. New Integer Family (OOXML font-family number: 1=Roman / 2=Swiss / 3=Modern / 4=Script / 5=Decorative; 0=unset) and CharSet (GDI charset number: 0=ANSI / 1=Default / 134=GB2312 / 136=ChineseBig5 / etc.; -1=unset). SaveAs emits the matching / / / / children inside ; Open parses them back. ColorIndex / ThemeColor / TintAndShade are deferred to the upcoming theme milestone.
2026-05-17 Version 2.20.4
- Added border diagonal direction toggles. TXLSXBorder now exposes DiagonalUp: Boolean and DiagonalDown: Boolean. The two flags share the existing Diagonal edge's Style and Color and pick which diagonal direction(s) Excel renders — up-only (bottom-left to top-right), down-only (top-left to bottom-right), or both. SaveAs emits diagonalUp / diagonalDown attributes on the element when set; Open parses them back. Previously the engine wrote one Diagonal edge with no direction control, so Excel never drew either diagonal line.
2026-05-17 Version 2.20.3
- Added workbook Date1904 toggle. TXLSXWorkbook now exposes a Date1904: Boolean property that selects between the Windows 1900 epoch (default; matches Excel for Windows) and the Mac 1904 epoch (Excel for Mac legacy). SaveAs emits in xl/workbook.xml when set; Open reads it back. The flag is metadata only — the engine does not transform stored serials; callers must set Date1904 before assigning TDateTime cell values so the round-trip lands on the right calendar.
2026-05-17 Version 2.20.2
- Added auto-filter per-column criteria support. New types: TXLSXAutoFilterOp enum (Equal / NotEqual / GreaterThan / LessThan / GreaterOrEqual / LessOrEqual), TXLSXAutoFilterColumn class (ColId + 1 or 2 criteria + AND/OR connector), TXLSXAutoFilterColumns collection. TXLSXWorksheet exposes AutoFilterColumns property and AddAutoFilterColumn(ColId, Op, Criteria) / AddAutoFilterColumn(ColId, Op1, Criteria1, Op2, Criteria2, AndConnector) / ClearAutoFilterColumns convenience methods. SaveAs expands the existing into a body of ... per column when criteria are set; Open parses the same structure back. Previously the engine only stored the autofilter range (sqref) and Excel showed empty filter dropdowns.
2026-05-17 Version 2.20.1
- Added manual page break support on TXLSXWorksheet. New entries: AddRowBreak(BeforeRow) / AddColBreak(BeforeCol) to insert a horizontal or vertical page break before a given row / column (Excel UI "Before" semantics — row N starts a new page). HasRowBreak / HasColBreak check; RemoveRowBreak / RemoveColBreak drop a single entry; ClearRowBreaks / ClearColBreaks / ClearAllPageBreaks bulk-clear. RowBreakCount / ColBreakCount + indexed RowBreaks(Index) / ColBreaks(Index) expose the stored 1-based "Before" indices for iteration. SaveAs emits / with children between and ; Open parses them back.
2026-05-17 Version 2.20.0
- Added sheet visibility (Hidden / VeryHidden), per-sheet selection and active-sheet tracking on TXLSXWorkbook / TXLSXSheets / TXLSXWorksheet. New types: TXLSXSheetVisibility enum (xlsxSheetVisible / xlsxSheetHidden / xlsxSheetVeryHidden). New TXLSXWorksheet properties: Visibility, Visible (Boolean alias), IsSelected (read-only). New TXLSXSheets members: ActiveIndex, Activate(Index), Move(FromIndex, ToIndex). New TXLSXWorkbook.ActiveSheet proxy. SaveAs emits on the workbook's sheet entries, when the active sheet is not the default 0, and tabSelected="1" on the active sheet's ; Open parses all three back into the new properties. The first added sheet becomes both visible and active by default so existing call sites continue to work.
2026-05-17 Version 2.19.2
- Added four more PageSetup attribute toggles on TXLSXWorksheet to round out the OOXML coverage: BlackAndWhite (B/W rendering), Draft (suppress graphics for faster preview), PrintNotes (print cell comments as displayed instead of hiding them), and PrintOverThenDown (left-to-right rows first instead of the default top-to-bottom columns first traversal). SaveAs emits the matching blackAndWhite / draft / cellComments / pageOrder attributes; Open parses them back. Defaults stay off so unchanged worksheets do not gain extra attributes.
2026-05-17 Version 2.19.1
- Added three-part header and footer convenience properties to TXLSXWorksheet. New entries: LeftHeader / CenterHeader / RightHeader and LeftFooter / CenterFooter / RightFooter. Each reads or writes the matching &L / &C / &R segment of the existing HeaderText / FooterText raw string; writing any one segment rebuilds the full raw form so the round-trip writer and reader keep working without changes.
- Added print-option toggles for sheet-level page output. New TXLSXWorksheet properties: CenterHorizontally, CenterVertically, PrintGridlines, PrintHeadings. SaveAs emits a element when any of the four is enabled; Open parses the same attributes back. Defaults stay off so unchanged worksheets do not gain an extra element.
- Added per-sheet PrintArea, PrintTitleRows and PrintTitleCols round-trip. These map to the OOXML built-in workbook-level _xlnm.Print_Area and _xlnm.Print_Titles defined names scoped via localSheetId. PrintArea takes a bare A1 reference (e.g. "$A$1:$D$10"); PrintTitleRows and PrintTitleCols take row-only or column-only references (e.g. "$1:$3" or "$A:$B") and combine into a single Print_Titles entry. The writer prepends the sheet name with proper quoting (single quotes around names that contain spaces or special chars); the reader strips the prefix and routes the entries back into the matching sheet so they do not leak into the user-facing TXLSXWorkbook.DefinedNames collection.
2026-05-17 Version 2.19.0
- Added row / column insert and delete operations with full sheet-wide shift on TXLSXWorksheet. New entries: InsertRows(BeforeRow, Count), DeleteRows(StartRow, Count), InsertCols(BeforeCol, Count), DeleteCols(StartCol, Count). InsertRows / InsertCols push existing rows / columns away from the cut by Count; DeleteRows / DeleteCols drop the [Start, Start+Count-1] band and pull everything past the cut back by Count.
- The shift applies across every piece of sheet geometry that depends on row / column position: cell anchors (Cells), merged-range corners (MergedCells — straddling ranges are clipped to the surviving edges and inside-only ranges are removed), the row / column metadata lists (FRowHeights / FColWidths / outline levels / hidden / collapsed), Hyperlink and Comment anchors (entries inside a deleted band are removed), FreezePane (FFreezeRow / FFreezeCol), AutoFilterRange, and the per-entry Range string on every ConditionalFormat, DataValidation, and Excel Table (an entry whose range falls entirely inside the cut is removed).
- New Delete(Index) members on the supporting collections so the shift logic can remove a single entry without a Clear: TXLSXHyperlinks, TXLSXComments, TXLSXConditionalFormats, TXLSXDataValidations, TXLSXTables.
- Out of scope in this release: Images and Charts are not shifted (their EMU pixel anchors decouple them from the cell grid and a faithful shift would require recomputing the EMU offsets); workbook-level DefinedNames formulas are not rewritten. Both are tracked for a follow-up release.
2026-05-17 Version 2.18.2
- Added AutoFit helpers for column widths and row heights. TXLSXWorksheet exposes AutoFitColumn(ACol) / AutoFitColumns(ColMin, ColMax) and AutoFitRow(ARow) / AutoFitRows(RowMin, RowMax); TXLSXRange exposes AutoFitColumns and AutoFitRows that forward to the worksheet over the range's bounds. Width is estimated in Excel character units (Calibri 11pt baseline; ASCII counts 1, CJK characters count 2) with a 1.20 px-per-char correction and 1.0 padding, clamped to [8.43, 255.0]. Row height defaults to 15 pt and grows by 12.75 pt per embedded newline in the cell text. Wide ranges (EntireRow / EntireColumn) are clamped to the last cell-bearing row / column on the worksheet so AutoFit does not iterate to the Excel grid limits.
2026-05-17 Version 2.18.1
- Added per-cell protection round-trip to the XLSX engine. TXLSXCell exposes new Locked: Boolean (default True) and FormulaHidden: Boolean (default False) convenience properties that mirror Excel's cell-protection model. They surface the pool index TXLSXCell.ProtectionIndex (1-based into the new workbook-level TXLSXProtections pool); writing the convenience property looks up or appends the (Locked, FormulaHidden) pair in the pool. Defaults (Locked=True, FormulaHidden=False) collapse to ProtectionIndex=0 so the pool stays empty for stock cells.
- Added TXLSXRange.SetLocked(ALocked) and TXLSXRange.SetFormulaHidden(AHidden) batch helpers so unlocking or hiding a whole range only does one pool lookup-or-add and applies the result to every cell in the rectangle.
- Added the matching writer / reader plumbing. SaveAs emits one cellXf with an inline child per workbook Protections entry (after the alignment block); Open parses back into Workbook.Protections and threads the new CellXfProtMap through ParseStylesXml and ParseWorksheetXml so per-cell ProtectionIndex round-trips alongside the existing font / fill / border / number-format / alignment indices.
2026-05-17 Version 2.18.0
- Added TXLSXRange object for multi-cell access and batch operations on TXLSXWorksheet. New entry points: Worksheet.Range['A1:C5'], Worksheet.RCRange[r1,c1,r2,c2], Worksheet.UsedRange, Worksheet.EntireRow(r), Worksheet.EntireColumn(c). The returned range exposes SetValue / SetFormula / Clear / ClearAll / Merge / Unmerge / Offset / Resize plus per-cell style index setters (SetFontIndex / SetFillIndex / SetBorderIndex / SetNumberFormatIndex / SetAlignmentIndex) and a SetNumberFormat(Fmt) convenience that looks up or appends the format string in the workbook pool. TXLSXRange objects are owned by the worksheet and released on worksheet destruction; callers do not free them.
- Added TXLSXCell.NumberFormat: WideString convenience that pairs with the existing NumberFormatIndex. Reading returns the format string from the workbook pool; writing looks up or adds the string and updates NumberFormatIndex transparently. Requires the cell to be attached to a workbook (the standard flow through TXLSXWorkbook.Sheets.Add(...).Cells[r, c]).
- Added cell -> sheet -> workbook back-references so each TXLSXCell can resolve its owning workbook without external bookkeeping. TXLSXSheets, TXLSXWorksheet, and TXLSXCells gained internal Owner references wired through their constructors; TXLSXCell exposes a read-only Workbook property and an internal SetWorkbook used by TXLSXCells.GetItem when auto-creating a cell on access.
2026-05-16 Version 2.17.42
- Fixed XLSX cell round-trip on reopen. Cells written by SaveAs were being dropped on Open, with HasCell(row, col) returning False and all cell-level state (value, formula, font index, fill index, border index, number format index) lost. The root cause was a spurious MoveToAttribute('r') call in the worksheet parser that flipped the reader's node type to attribute, which then made the subsequent IsEmptyElement check return True and shut off cell parsing for every element with an r="" attribute (i.e. every cell). Removing the unnecessary cursor move restores text, numeric, formula, and date cell round-trip together.
- Fixed XLSX style index restore on reopen. Custom font, fill, border, and number-format indices on cells were reading back as zero even after the matching pools (Workbook.Fonts/Fills/Borders/NumberFormats) round-tripped correctly. The cellXf parser tracked its position with a counter that only advanced on the end tag, but Excel commonly emits self-closing entries (no inner ), so the counter never moved past zero and every cellXf mapping clobbered the previous one. The parser now advances the counter on a self-closing too, so per-cell FontIndex / FillIndex / BorderIndex / NumberFormatIndex round-trip.
- Fixed XLSX date cell round-trip. Writing a TDateTime to TXLSXCell.Value used to route through the shared-string pool with t="s" because Delphi's VarIsNumeric() returns False for varDate; SaveAs now writes the date serial number into directly and applies the date cellXf, so date cells reopen as a varDate Variant instead of a localized string that the caller could not coerce back to TDateTime.
2026-05-16 Version 2.17.41
- Fixed "zlib stream does not support seeking" error raised when reopening .xlsx files that contain embedded images or a VBA project (.xlsm). The image-reload path and the VBA-payload reload path both routed the inflated entry stream through TMemoryStream.CopyFrom(Source, 0), which internally rewinds Source to derive the byte count; the rewind is not legal on a forward-only Deflate stream. Both call sites now use a chunked Read-until-EOF helper, so .xlsx files with images or macros round-trip through SaveAs/Open without raising.
2026-05-16 Version 2.17.40
- Added chart-sheet (full-page chart worksheet) support to the XLSX engine. TXLSXWorksheet exposes a new IsChartSheet flag plus a workbook-level Workbook.AddChartSheet(Name, ChartType, Title) helper that creates the sheet, flips the flag, and seeds Charts[0] with a sensible default anchor. SaveAs writes IsChartSheet sheets to xl/chartsheets/sheetN.xml with a dedicated rels file pointing at the shared drawing part, registers them as chartsheet content-types, and emits the chartsheet relationship in xl/_rels/workbook.xml.rels. Regular worksheets keep their existing xl/worksheets/sheetN.xml path. Open recognizes chartsheets via the relationship type but currently loads them as plain worksheets (their chart data still arrives via the shared chart parts).
2026-05-16 Version 2.17.39
- Added collapsed row / collapsed column round-trip for outline groups in the XLSX engine. TXLSXWorksheet exposes RowCollapsed[Row] and ColCollapsed[Col] Boolean properties along with SetRowCollapsed / SetColCollapsed / ClearRowCollapsed / ClearColCollapsed helpers. SaveAs emits collapsed="1" on the matching and entries; Open parses the attribute back. Together with the existing outlineLevel and hidden attributes, this lets the XLSX engine round-trip a fully collapsed grouping hierarchy.
2026-05-16 Version 2.17.38
- Added hidden row / hidden column round-trip to the XLSX engine. TXLSXWorksheet exposes RowHidden[Row] and ColHidden[Col] Boolean properties along with SetRowHidden / SetColHidden / ClearRowHidden / ClearColHidden helpers. SaveAs emits hidden="1" on the matching and entries; Open parses the attribute back into the worksheet so hidden rows / columns survive the round-trip without forcing a custom width or outline level.
2026-05-16 Version 2.17.37
- Added worksheet tab color round-trip to the XLSX engine. TXLSXWorksheet exposes TabColor (ARGB) and TabColorIsAuto properties. SaveAs emits a block as the first child of when the tab color is set; Open parses back into the worksheet so colored sheet tabs survive the round-trip. Default workbooks stay free of the extra block (TabColorIsAuto = True).
2026-05-16 Version 2.17.36
- Added cell alignment round-trip to the XLSX engine. New TXLSXHorizontalAlignment and TXLSXVerticalAlignment token enums, TXLSXAlignment class (Horizontal, Vertical, WrapText, ShrinkToFit, Indent, TextRotation), and a workbook-level TXLSXAlignments collection (Workbook.Alignments). TXLSXCell now carries an AlignmentIndex (1-based into Workbook.Alignments). SaveAs appends one cellXf with an inline child per workbook alignment entry; Open reads attributes back into Workbook.Alignments and maps the cellXf back to TXLSXCell.AlignmentIndex. ParseWorksheetXml and ParseStylesXml grew a CellXfAlignMap parameter to carry the mapping across the two phases.
2026-05-16 Version 2.17.35
- Added the AES encryption (ECMA-376 Standard Encryption) API surface to the XLSX engine. TXLSXWorkbook exposes SaveAsEncrypted(FileName, Password) / OpenEncrypted(FileName, Password) / CanReadEncrypted(FileName) plus a typed EXlsxEncryptionNotImplemented exception. CanReadEncrypted recognizes the Microsoft Compound File Binary magic bytes ($D0 $CF $11 $E0 $A1 $B1 $1A $E1) so callers can detect encrypted archives before deciding how to open them; OpenEncrypted transparently falls back to plain Open for unencrypted .xlsx files. The AES-128/256 + SHA + OLE Compound File pipeline itself is not yet wired up — both write and read of actually-encrypted archives raise the typed exception until the follow-up release lands the algorithm. The exception type is deliberately distinct so existing callers can catch it and fall back to Worksheet.Protect / Workbook.ProtectWorkbook for the visual lock.
2026-05-16 Version 2.17.34
- Performance: replaced the O(N^2) WideString concatenation that built each worksheet's cell rows with a TXLSWideStringBuilder. Large sheets (10k+ cells) now stay linear in memory and CPU on SaveAs. Added a new WriteWorksheetXmlStreaming helper and a TXLSXWorkbook.StreamingWrite opt-in flag — when enabled, SaveAs no longer holds every worksheet's XML in a sheetXmls cache at the same time; each worksheet is built, written, and dropped before moving to the next. sharedStrings.xml is emitted last so the streaming path still produces a fully-populated SST. Default behavior unchanged.
2026-05-16 Version 2.17.33
- Added cell-range operations to the XLSX engine. TXLSXWorksheet exposes ClearRange(R1, C1, R2, C2), CopyRange(SrcR1, SrcC1, SrcR2, SrcC2, DstR, DstC) for in-sheet copy, CopyRangeTo(... TargetSheet, DstR, DstC) for cross-sheet copy, and MoveRange(SrcR1, SrcC1, SrcR2, SrcC2, DstR, DstC) for cut-and-paste. Each operation duplicates the cell value, formula, four style indices, and any rich-text payload; MoveRange skips overlap with the destination so partial overlaps still preserve their copied values. TXLSXCells also gains a Remove(Row, Col) helper.
2026-05-16 Version 2.17.32
- Added internal hyperlink anchors to the XLSX engine. TXLSXHyperlink now carries a Location property (e.g. "Sheet2!A1") and an IsInternal helper; TXLSXHyperlinks exposes AddInternal, and TXLSXWorksheet adds three AddHyperlinkToCell overloads. SaveAs emits internal hyperlinks with the inline location="" attribute and skips the worksheet rels entry; Open recognizes location="" hyperlinks and routes them back through AddInternal. External URL hyperlinks continue to flow through the rels file unchanged.
2026-05-16 Version 2.17.31
- Added rich-text round-trip to the XLSX engine. New TXLSXRichTextRun class (per-run Name / Size / Bold / Italic / Strikethrough / Underline / Color) and TXLSXRichText container that exposes AddRun / AddRunText / Clear / PlainText. TXLSXCell now carries an owned RichText property; SaveAs writes the cell as a shared-string with multiple // runs and Open rebuilds the TXLSXRichText from the parsed SST entry, with the cell's Variant Value still surfacing the concatenated plain text for callers that ignore formatting.
2026-05-16 Version 2.17.30
- Added chart round-trip to the XLSX engine. New TXLSXChartType enum (column / bar / line / pie), TXLSXChartSeries (Name, CategoriesRange, ValuesRange), and TXLSXChart (ChartType, Title, axis titles, From/To anchor cells, Series) classes plus a per-worksheet TXLSXCharts collection (Worksheet.Charts). TXLSXWorksheet exposes AddChart(Type, Title, FromRow, FromCol, ToRow, ToCol). SaveAs emits xl/charts/chartN.xml (workbook-global numbering) and binds it to a twoCellAnchor / graphicFrame inside the shared xl/drawings/drawingN.xml; Open parses both the anchor and the chart definition back into the collection. Chart titles, axis titles, series names and source ranges round-trip.
2026-05-16 Version 2.17.29
- Fixed an EListError "Operation not allowed on sorted list" raised by SetColWidth, SetRowHeight, SetRowOutlineLevel, and SetColOutlineLevel. Each of those four TStringList fields was created with Sorted=True but written through the Values[Name] := X setter, which RAD Studio's RTL refuses on a sorted list. The lists are now created unsorted; lookups continue to go through IndexOfName, which is fine at typical per-sheet column / row counts.
2026-05-16 Version 2.17.28
- Fixed TZipArchive.Exists, which was a stub that always returned false. The XLSX Open path uses zip.Exists(...) to gate every part read, so every previously-claimed round-trip (cells, styles, comments, drawings, doc props, defined names, protection, VBA, etc.) silently dropped its content on read. Exists now delegates to the existing Fcd.Entries.Exists lookup, matching the OpenFile / CreateFile pattern.
2026-05-16 Version 2.17.27
- Added VBA project preservation to the XLSX engine. TXLSXWorkbook exposes a VbaProject byte payload plus LoadVbaProjectFromFile(FileName), ClearVbaProject, and HasVbaProject helpers. SaveAs writes the bytes to xl/vbaProject.bin, registers the .bin content-type, switches the workbook content-type to the macro-enabled variant, and adds a vbaProject relationship to the workbook rels file; Open reads xl/vbaProject.bin back into the property. The bytes are not parsed or modified, so existing .xlsm projects round-trip exactly. Note: macro-enabled workbooks must be saved with a .xlsm extension for Excel to enable macros.
2026-05-16 Version 2.17.26
- Added workbook and sheet protection to the XLSX engine. TXLSXWorksheet exposes Protect / Protect(Password) / UnProtect plus IsProtected and SheetProtectHash; TXLSXWorkbook adds ProtectWorkbook (with optional password, LockStructure, LockWindows flags) and UnProtectWorkbook plus IsWorkbookProtected / WorkbookProtectHash / LockStructure / LockWindows. SaveAs emits on each protected worksheet and on protected workbooks; Open parses both blocks back into the API. Passwords are stored as the standard 4-hex legacy hash for round-trip fidelity (the original plaintext is not recoverable).
2026-05-16 Version 2.17.25
- Added document-property round-trip to the XLSX engine. TXLSXWorkbook now exposes Title, Author, Subject, Keywords, Description, Category, LastModifiedBy, Created, Modified, Company, Application, and AppVersion properties. SaveAs emits docProps/core.xml and docProps/app.xml (and registers them in [Content_Types].xml + _rels/.rels) when any property is touched; Open parses both files back so authors, modification stamps, and application metadata survive a save-and-reopen.
2026-05-16 Version 2.17.24
- Added Excel-style table round-trip to the XLSX engine. New TXLSXTable class (Id, Name, DisplayName, Range, Columns, StyleName, ShowFirstColumn / ShowLastColumn / ShowRowStripes / ShowColumnStripes) and a per-worksheet TXLSXTables collection. TXLSXWorksheet exposes Tables plus AddTable(Name, Range, ColumnNames). SaveAs emits xl/tables/tableN.xml (workbook-global numbering), updates worksheet rels with table relationships, adds to the worksheet, and registers the table content-type. Open parses table relationships and tableN.xml back into the worksheet so styled table bands survive a save-and-reopen.
2026-05-16 Version 2.17.23
- Added auto-filter round-trip to the XLSX engine. TXLSXWorksheet exposes an AutoFilterRange property plus SetAutoFilter(Row1, Col1, Row2, Col2) / SetAutoFilter(Range) / ClearAutoFilter helpers. SaveAs emits after the merge-cells block when the range is non-empty; Open parses the ref back into the property so the filter band on a worksheet survives a save-and-reopen.
2026-05-16 Version 2.17.22
- Added page-setup round-trip to the XLSX engine. TXLSXWorksheet exposes Margin{Left,Right,Top,Bottom,Header,Footer}, PageLandscape, PaperSize, PageScale, FitToWidth, FitToHeight, HeaderText, and FooterText properties plus SetPageMargins(L, R, T, B[, H, F]) convenience overloads. SaveAs emits the corresponding , , and blocks between hyperlinks and drawings; Open parses them back. Default-only worksheets stay untouched (PageSetupTouched flag gates output).
2026-05-16 Version 2.17.21
- Added freeze-pane round-trip to the XLSX engine. TXLSXWorksheet exposes FreezePane(Col, Row) / UnfreezePane methods plus read-only FreezeCol and FreezeRow properties. SaveAs writes a / block before with the matching activePane and selection; Open parses back into the freeze position so frozen-top/left/corner layouts survive a save-and-reopen.
2026-05-16 Version 2.17.20
- Added row and column outline (grouping) levels to the XLSX engine. TXLSXWorksheet exposes RowOutlineLevel[Row] and ColOutlineLevel[Col] indexed properties plus SetRowOutlineLevel / HasRowOutlineLevel / ClearRowOutlineLevels and the matching column helpers. SaveAs emits outlineLevel attributes on entries and merged entries (combined with custom widths when present); Open parses both attributes back into the worksheet so grouped row/column hierarchies survive the round-trip.
2026-05-16 Version 2.17.19
- Added conditional formatting and data validation round-trip to the XLSX engine. New TXLSXCfOperator enum and TXLSXConditionalFormat class (Range, Op, Formula1, Formula2) plus a TXLSXConditionalFormats collection on each worksheet (Worksheet.ConditionalFormats). New TXLSXDataValidationType, TXLSXDvOperator, TXLSXDataValidation (Range, ValidationType, Op, Formula1, Formula2, AllowBlank, ShowInputMessage, ShowErrorMessage), and a TXLSXDataValidations collection (Worksheet.DataValidations) with an AddList(Range, Items) shortcut for the common dropdown case. TXLSXWorksheet exposes AddConditionalFormat and AddDataValidation / AddListValidation helpers. SaveAs writes blocks (with cfRule type="cellIs") and a block after sheetData; Open parses both blocks back into the collections.
2026-05-16 Version 2.17.18
- Added defined-name round-trip to the XLSX engine. New TXLSXDefinedName class (Name, Formula, SheetIndex) and a workbook-level TXLSXDefinedNames collection (Workbook.DefinedNames) with Add(Name, Formula[, SheetIndex]) overloads and IndexOfName lookup. SaveAs emits a block in xl/workbook.xml; entries with SheetIndex >= 0 carry a localSheetId attribute (sheet-scoped) and entries with SheetIndex = -1 are workbook-scoped. Open parses elements back into the collection so saved-and-reopened workbooks keep their named ranges intact.
2026-05-16 Version 2.17.17
- Added image round-trip to the XLSX engine. New TXLSXImageFormat enum (png, jpeg, gif, bmp), TXLSXImage class (Row/Col anchor, WidthEMU/HeightEMU, Format, Data), and a per-worksheet TXLSXImages collection. TXLSXWorksheet exposes Images plus AddImage(Row, Col, Data, Format) and AddImageFromFile(Row, Col, FileName) helpers. SaveAs writes the image bytes into xl/media/imageN., generates xl/drawings/drawingN.xml with a oneCellAnchor per image (and a matching _rels file), registers content types and worksheet/drawing relationships, and emits a reference inside the worksheet. Open parses drawingN.xml + drawing rels + media to round-trip images back into Worksheet.Images.
2026-05-16 Version 2.17.16
- Added custom number-format round-trip to the XLSX engine. New TXLSXNumberFormat class and a workbook-level TXLSXNumberFormats collection (Workbook.NumberFormats) deduplicate format codes via Add(FormatCode). TXLSXCell exposes a new NumberFormatIndex property; SaveAs emits a block in xl/styles.xml (custom ids starting at the OOXML-reserved base 164) and pairs each format with a dedicated cellXf, Open parses custom numFmts back and reverses the cellXf->numFmtId map into NumberFormatIndex on read. Precedence on conflict: FormatIndex > FontIndex > FillIndex > BorderIndex > NumberFormatIndex.
2026-05-16 Version 2.17.15
- Added cell-border round-trip to the XLSX engine. New TXLSXBorderStyle enum, TXLSXBorderEdge class (Style + Color + ColorIsAuto for each side), TXLSXBorder class with Left/Right/Top/Bottom/Diagonal edges plus SetAll(Style[, Color]) helpers, and a workbook-level TXLSXBorders collection (Workbook.Borders) with a Borders.AddBox(Style[, Color]) shortcut. TXLSXCell exposes a new BorderIndex property; SaveAs emits each border into xl/styles.xml and pairs it with a dedicated cellXf, Open parses borders back and translates the cellXf->borderId map into BorderIndex on read. Precedence remains FormatIndex > FontIndex > FillIndex > BorderIndex when several are set on the same cell.
2026-05-16 Version 2.17.14
- Added cell-fill round-trip to the XLSX engine. New TXLSXFillPattern enum and TXLSXFill class describe patternType, fgColor, and bgColor; the workbook-level TXLSXFills collection is reachable via Workbook.Fills, with a Fills.AddSolid(color) convenience for the common solid-color case. TXLSXCell exposes a new FillIndex property; SaveAs emits each fill into xl/styles.xml and pairs it with a dedicated cellXf, Open parses them back and reverses cell s attributes into FillIndex on read. FontIndex still takes precedence when both are set.
2026-05-16 Version 2.17.13
- Completed the XLSX font round-trip. Open now parses xl/styles.xml back into Workbook.Fonts and a cellXf->fontId table; each cell's s attribute is mapped back into TXLSXCell.FontIndex so saved-and-reopened workbooks preserve custom fonts (Name, Size, Bold, Italic, Strikethrough, Underline, Color).
2026-05-16 Version 2.17.12
- Added a TXLSXFont class plus a Workbook.Fonts collection so XLSX cells can pick a custom font. TXLSXCell carries a new FontIndex property; SaveAs emits the fonts list in xl/styles.xml and one cellXf per font, then references the matching cellXf from each cell's s attribute. Open round-trip of FontIndex is planned for the next release.
2026-05-16 Version 2.17.11
- Added row-height round-trip to the XLSX engine. TXLSXWorksheet exposes a RowHeight[Row] property plus SetRowHeight, HasRowHeight, and ClearRowHeights helpers. SaveAs writes the ht and customHeight="1" attributes on each with a customized height (including rows that only carry a height, with no cell data); Open reads the ht attribute back into the row-height map.
2026-05-16 Version 2.17.10
- Added column-width round-trip to the XLSX engine. TXLSXWorksheet exposes a ColWidth[Col] property along with SetColWidth, HasColWidth, and ClearColWidths helpers. SaveAs emits a block with one entry per customized column; Open replays entries back into the worksheet so unmodified widths fall back to the Excel default.
2026-05-16 Version 2.17.9
- Added cell-comment round-trip to the XLSX engine. TXLSXWorksheet exposes a Comments collection and AddComment(Row, Col, Text[, Author]) overloads. SaveAs emits xl/commentsN.xml (with deduplicated author list) and a companion xl/drawings/vmlDrawingN.vml so Excel can render the comment balloons; Open reads commentsN.xml back into the collection. Worksheet rels, content types, and wiring are handled automatically.
2026-05-16 Version 2.17.8
- Added hyperlink round-trip to the XLSX engine. TXLSXWorksheet exposes a Hyperlinks collection and AddHyperlink(Row, Col, Url[, Display[, Tooltip]]) overloads. SaveAs writes a block in each worksheet and emits a matching xl/worksheets/_rels/sheetN.xml.rels file with the external URL targets; Open reads the worksheet rels first to resolve entries into URLs in the collection.
2026-05-16 Version 2.17.7
- Added merged-cell round-trip to the XLSX engine. TXLSXWorksheet exposes a MergedCells collection and a MergeCells(R1, C1, R2, C2) convenience method that mirror the BIFF facade style. SaveAs emits a block after sheetData, and Open parses entries back into the collection.
2026-05-16 Version 2.17.6
- The XLSX engine now round-trips date values and formulas. TDateTime cell values are serialized as Excel serial numbers and tagged with a built-in date cellXf so Excel renders them as dates; on Open, cells whose style references the date cellXf are decoded back to TDateTime variants. TXLSXCell exposes a new Formula property; SaveAs writes the formula as a child element and Open parses text back into the cell.
2026-05-15 Version 2.17.5
- Added a styles.xml scaffold to the XLSX engine. SaveAs now emits a minimum-valid xl/styles.xml with default fonts, fills, borders, cellStyleXfs, and cellXfs entries, plus the corresponding content-type and workbook-relationship registrations. Cells carry a FormatIndex property and emit the s="N" cell attribute when non-zero, and Open reads s="N" back into FormatIndex. Concrete style descriptors (fonts, fills, borders, cellXfs as workbook-level collections) will be added in follow-up commits.
2026-05-15 Version 2.17.4
- Added shared strings (SST) support to the XLSX engine. SaveAs builds a deduplicated string table and emits xl/sharedStrings.xml, replacing inline string emission. Open reads xl/sharedStrings.xml first and resolves t="s" cell references through the SST. Inline string cells from third-party XLSX files are still accepted on Open.
2026-05-15 Version 2.17.3
- Replaced the cell record array on TXLSXWorksheet with TXLSXCell objects and a TXLSXCells collection. The cell-access call site now reads Worksheet.Cells.Item[Row, Col].Value, matching the IXLSCells / IXLSRange shape on the BIFF facade. Worksheet.Cells.HasCell / Cells.Count / Cells.CellByIndex / Cells.Clear are also available.
2026-05-15 Version 2.17.2
- Introduced the TXLSXSheets collection class on TXLSXWorkbook, mirroring the IXLSWorkSheets collection on the BIFF facade. Code now reads Workbook.Sheets.Add / Workbook.Sheets.Count / Workbook.Sheets[i] / Workbook.Sheets.IndexByName instead of the previous Workbook.AddSheet / Workbook.SheetCount / Workbook.Sheet[i] methods.
2026-05-15 Version 2.17.1
- Renamed TXLSXWorkbook.SaveToFile to SaveAs and TXLSXWorkbook.LoadFromFile to Open, matching the existing IXLSWorkBook naming style. Added file-format and password overloads so the XLSX facade reads the same way as the BIFF facade. AddSheet now offers a no-argument overload that generates a default sheet name.
2026-05-15 Version 2.17.0
- TXLSXWorkbook.SaveAs produces a minimum OOXML .xlsx archive with cell values (numbers, booleans, and inline strings). The archive contains content types, root relationships, workbook + relationships, and a worksheet per sheet.
- TXLSXWorkbook.Open reads back the minimum OOXML .xlsx archive — sheet names from xl/workbook.xml and cell values from xl/worksheets/sheetN.xml. Shared strings, styles, dates, and formulas are not yet supported.
- Added OOXML namespace, content-type, and relationship constants plus reference / parsing / escape helpers (XlsxColumnLabel, XlsxCellRef, XlsxColumnIndex, XlsxParseCellRef, XlsxParseRangeRef, XlsxEscapeText, XlsxEscapeAttr) for use by future XLSX features.
2026-05-15 Version 2.16.4
- The XLSX facade unit (lxHandleX) now defines its own workbook and worksheet types (TXLSXWorkbook, TXLSXWorksheet), independent of the BIFF facade. Save and load entry points are reserved; the OOXML wiring will be filled in a follow-up release.
- Added a developer reference topic for the new XLSX facade, describing how lxHandle and lxHandleX coexist and which helper units they share.
2026-05-15 Version 2.16.3
- Introduced a parallel facade unit (lxHandleX) that will host upcoming XLSX-specific workbook and worksheet methods. Existing user code that uses the base facade continues to work unchanged.
2026-05-15 Version 2.16.2
- Added internal AVL tree, column container, and row container helper units as foundational data structures for upcoming workbook subsystem improvements.
2026-05-15 Version 2.16.1
- Added internal XML reader/writer and ZIP archive utilities, along with caching and stream support modules. These are foundational components for upcoming XLSX file format support.
2026-05-15 Version 2.16.0
- Added internal cell style modules (color management, fonts, fills, borders, XF) and supporting hashtable / object-key list utilities. These modules are foundational pieces used by upcoming XLSX I/O and styling enhancements.
2026-05-15 Version 2.15.1
- Added internal RGB/HLS color conversion helpers used by upcoming styling and rendering improvements.
- Added internal high-performance string builder primitives (ANSI and Wide) used by upcoming XML and Excel I/O paths.
2026-05-14 Version 2.15.0
- Reworked the HtmlHelp reference into a web-ready structure with dedicated topic, asset, script, style, and source folders.
- Added a browser-friendly help home page and contents navigation page, with unified headers, topic shortcuts, and footers.