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 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.