ReoGrid ReoGrid Web

Release Notes

All notable changes to @reogrid/lite and @reogrid/pro.

Format follows Keep a Changelog; versioning follows Semantic Versioning.

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 / setColumnSummaryRight flip the toggle button to the leading edge of a group. The outline panel now reserves an "expand all" innermost slot, matching Excel.

+ Added

  • LoadXlsxOptions.chunkedfalse (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) on Worksheet, with undo/redo support.
  • "Expand all" outline level button (innermost slot of the outline panel).
  • AutoFitMode option ('fit' | 'expandOnly' | 'shrinkOnly') on autoFitColumns, autoFitRows, and the RowHandle / ColumnHandle autoFit({ mode }) overloads. Default 'fit' preserves existing behavior.
  • value accepted as alias for value1 on conditional format cellIs rules. value2 remains required for between / notBetween. If both value and value1 are provided, value1 wins.
  • 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-serif fallback so the italic / bold prefix 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/yy no 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 / bold prefix.
  • 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 cellIs rules (missing value1) 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=null closure 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.

v1.0.0

First stable release. The public API is now considered frozen under semver: any breaking change after 1.0.0 will require a major bump.

Highlights

  • Handle-based public API. All structural and styling operations go through chained handles (worksheet.row(i), worksheet.column('B'), worksheet.range('A1:C5').setBold(), worksheet.selection.range?.setStyle(...)) instead of flat top-level methods. This is the API users should build against going forward.
  • Internal Manager layering. Worksheet is now an entry point; state mutation lives in StyleOperations, SizingManager, VisibilityManager, and StructureManager.
  • Formula engine. Lexer → parser → evaluator → dependency graph + 32 built-in functions. Imported xlsx formulas are re-evaluated. 151 formula tests across tests/formula.spec.ts and tests/formula-ext.spec.ts.
  • Pluggable cell types. CellTypeHandler registry with 8 built-in types: checkbox, dropdown, button, progress, rating, sparkline (line / area), and hyperlink.
  • Conditional formatting (Pro). addConditionalFormat, removeConditionalFormat, clearConditionalFormats, getConditionalFormats.
  • Cell tooltips (Pro). setCellTooltip, showCellTooltip, hideCellTooltip, clearCellTooltip.
  • Browser printing (Pro). printWorksheet(...) standalone function. In Lite this is a console.warn stub for upgrade prompting.
  • xlsx round-trip. Import/export with cross-validation against the .NET ReoGrid edition.
  • Lite / Pro tier guards. Lite enforces 100 rows × 26 columns and stubs Pro-only methods at both the public-handle layer and the internal Manager chokepoint.
  • React and Vue wrappers. Published as separate entry points: @reogrid/lite/react, @reogrid/lite/vue, @reogrid/pro/react, @reogrid/pro/vue.

+ Added

  • worksheet.reset(options?) — wipe the worksheet back to a blank state in-place. Clears values, styles, cell types, header dropdowns, conditional formats, cell protection, borders, merges, hidden rows/columns, outlines, frozen panes, custom row/column sizes, scroll, and selection; resets showGridLines to true. Optionally resizes the grid via options.rows / options.columns. CanvasWorksheet extends this to also clear images, the auto-filter, and tooltips. The xlsx importer now uses this as its single-shot pre-load reset.
  • worksheet.rows.setCount(count) and worksheet.columns.setCount(count) on RowCollection / ColumnCollection for single-axis resizing.
  • printWorksheet re-export from @reogrid/lite as a console.warn stub so the guard mechanism is uniform with PRO_METHODS.
  • PRO_MANAGER_METHODS + applyLiteWorksheetGuards close the Manager backdoor (structureManager.insertRows, visibilityManager.setRowHidden, …) so per-handle entry points cannot bypass tier guards.
  • yarn test:perf script and tests/**/*-benchmark.spec.ts naming convention so day-to-day yarn test stays fast while benchmarks remain opt-in.
  • ResizeObserver on the worksheet container so the canvas reacts to flex / sidebar / panel layout changes.
  • requestAnimationFrame-based render batching (Worksheet.scheduleRender).
  • bulkSetCells() API for fast bulk loading of large datasets.
  • Excel-style keyboard selection: anchor + focus model, Shift+click selection extension, direction-aware merge navigation, auto-scroll on keyboard / drag.
  • Auto-expanding cell editor with grid-snapped resize.
  • tsconfig.json stripInternal: true so @internal members no longer leak into published .d.ts.

~ Changed

  • Breaking: worksheet.setRowCount(n) and worksheet.setColumnCount(n) removed. Use worksheet.rows.setCount(n) / worksheet.columns.setCount(n), or worksheet.setGridSize(rows, cols) for atomic both-axes resize.
  • Breaking: worksheet.rows / worksheet.columns now refer to the RowCollection / ColumnCollection handles. The numeric counts moved to worksheet.rowCount / worksheet.columnCount.
  • Breaking: worksheet.selection is now a thin SelectionHandle exposing bounds / isEmpty / activeCell / range / moveTo only. Style and value operations on the current selection should go through worksheet.selection.range?.setBold() instead of delegators on the handle itself.
  • Breaking: Flat setSelection*Bold/Italic/Style/... methods removed in favour of the handle API (worksheet.range(...).setBold()).
  • KeyboardController now listens on the worksheet container, not on window, so multiple grid instances on the same page do not cross-fire keyboard events.
  • CellEditor inline textarea now uses position: absolute relative to the worksheet container instead of position: fixed, fixing misalignment inside CSS transform ancestors, modal dialogs, and iframes.
  • Merged cell rendering now draws content from the topmost-leftmost still-visible cell when the merge anchor has scrolled out of view.

🐛 Fixed

  • COUNT(1, 1/0, 2) and similar — errors in direct arguments now propagate (matches Excel semantics). Errors inside range arguments remain ignored.
  • #REF! correctly cached after row/column delete (was previously surfacing as #NAME? because EXCEL_ERROR_LITERALS was not consulted in the evaluator's name node).
  • bulkSetCells initial render path on big-data demo.
  • Editor backgrounds now respect cell backgroundColor.
  • Various double-click and edit-commit edge cases in the pointer / editor interaction.

Removed

  • Legacy flat setSelection* API surface (use the handle API).
  • worksheet.setRowCount / setColumnCount (use collection setCount).

! Known issues

  • worksheet.columnWidths / rowHeights arrays are still mutable via JS array indexing (not enforced by readonly).
  • React <Reogrid> ignores options prop changes after mount (use key to force remount).
  • Auto-fit is O(rows) per column.
  • devicePixelRatio is read once per resize() and is not updated on monitor change.

For the raw changelog and earlier history, see the @reogrid/lite package on npm.

Stay Updated

Be first to know — get updates as they ship

Get notified of new releases, features, and announcements.
No spam — just updates that matter.