v1.1.0
Maintenance release focused on xlsx I/O fidelity and load performance, plus outline read/write parity with the .NET edition. No breaking public-API changes.
✨ Highlights
- ▸ xlsx import is ~40% faster on large files. A 1945×503 sheet with ~440k cells now loads in 3.7 s instead of 6.2 s.
- ▸ Optional chunked async load (
LoadXlsxOptions.chunked) for snappier UI on big files — first paint at ~40 ms instead of one multi-second freeze. Default remains synchronous. - ▸ xlsx outline round-trip. Outline level, hidden, collapsed state, and summary direction (above/below, left/right) now read and write, matching the .NET edition.
- ▸ ReoGrid JSON file format. Native lossless serialization covering cells, styles, number formats, rich text, merges, borders, sizes/visibility, freeze, conditional formats, outlines, filter, cell types, protection, and alternate rows.
- ▸ Outline summary direction.
setRowSummaryBelow/setColumnSummaryRightflip the toggle button to the leading edge of a group. The outline panel now reserves an "expand all" innermost slot, matching Excel.
+ Added
- ▸
LoadXlsxOptions.chunked—false(default, sync),true(chunked with default batch size), or{ batchSize }for explicit control.await ws.loadFromFile(file, { chunked: true }). - ▸
Worksheet.loadCellsAsync(cells, { batchSize })— chunked async variant that yields between batches and renders progressively. Default batch size 5000 cells. - ▸ ReoGrid JSON read/write APIs (writer + reader).
- ▸ xlsx read/write support for row and column outlines: level, hidden, collapsed, and summary direction.
- ▸
setRowSummaryBelow(value)/setColumnSummaryRight(value)onWorksheet, with undo/redo support. - ▸ "Expand all" outline level button (innermost slot of the outline panel).
- ▸
AutoFitModeoption ('fit'|'expandOnly'|'shrinkOnly') onautoFitColumns,autoFitRows, and theRowHandle/ColumnHandleautoFit({ mode })overloads. Default'fit'preserves existing behavior. - ▸
valueaccepted as alias forvalue1on conditional formatcellIsrules.value2remains required forbetween/notBetween. If bothvalueandvalue1are provided,value1wins. - ▸ xlsx import now resolves theme colors and tint on cell fills.
- ▸ xlsx import now reads dxf fills expressed via
<bgColor>(in addition to<fgColor>), so conditional format fills written by Excel come through correctly. - ▸ Code runner demo page.
~ Changed
- ▸ xlsx import now applies outlines and conditional formats before the async cell ingest, so the first paint shows the correct collapsed state instead of expanding then snapping.
- ▸ Canvas font strings always include a generic
sans-seriffallback so theitalic/boldprefix survives when the named family isn't installed (e.g. xlsx files referencing "Aptos Narrow" on machines without Office).
🐛 Fixed
- ▸ Borders no longer rendered for cells in hidden rows or columns. Previously, a left border on column A would still paint as a vertical line at the row-header boundary when columns A-J were hidden by a collapsed outline group. Matches .NET behavior.
- ▸ xlsx import: bold defined via cellXf/font on plain shared strings now renders correctly. Previously every plain shared string was flagged as rich text and the renderer ignored the cell-level style.
- ▸ Number format conditional sections (
[=0],[<>N],[<N],[<=N],[>N],[>=N]) now evaluate independent of value type. Format codes like[=0]"-";m/d/yyno longer always pick the first section. - ▸ Excel serial date epoch off-by-one corrected. Serial 45658 now resolves to 2025-01-01 as expected.
- ▸ xlsx import now resolves theme colors, tint, and dxf fills expressed via
<bgColor>— all common in Excel-saved files. - ▸ Multi-word font families (e.g. "Aptos Narrow") on the plain-text render path are no longer double-quoted, which previously caused Canvas 2D to silently drop the
italic/boldprefix. - ▸ Column header labels are now skipped for hidden columns. Collapsing an outline group no longer causes header letters to overprint at the next visible column.
- ▸ Outline toggle buttons and bracket lines for groups hidden by a collapsed parent are now skipped — the inner toggle no longer paints on top of the outer toggle row.
- ▸ Adding partially-overlapping outline groups now throws a clear error. Outline groups must form a strict tree; previously crossings produced visible-but-unclickable inner toggles.
- ▸ Outline corner-area level-button hit test now aligns with the renderer when both row and column outline panels are present.
- ▸ Malformed conditional format
cellIsrules (missingvalue1) no longer crash the render loop; the rule simply returns no-match. - ▸ Playground demo: opening an xlsx file on the first click now works (the toolbar previously held a stale
worksheet=nullclosure until a re-render).
⚡ Performance
- ▸ xlsx end-to-end load time on a 1945×503 / ~440k-cell test file: 6.2 s → 3.9 s (-37%) in node. Improvements span the parser, the cell-extraction walk, the worksheet bulk-load path, and the formula engine's initial rebuild.
- ▸ Lazy row auto-fit on import: only viewport-visible rows are measured up front, additional rows are measured once on first scroll into view. Skips ~1M useless cell visits on Book1-class sheets.
- ▸ Optional chunked ingest (
{ chunked: true }) collapses the user-visible "stuck" window from one multi-second freeze to 16-30 ms slices.