Changelog
v2.1.0 (2026-04-28)
Section titled “v2.1.0 (2026-04-28)”What’s changed
Section titled “What’s changed”New features
Section titled “New features”- Named styles: JSF
namedStylesrecords are now emitted ascellStyleXfsandcellStylesentries, withextendsStylereferences preserved asxfIdon cell formats.
Bug fixes
Section titled “Bug fixes”- Defined names: drop values that would trigger Excel’s Removed Records: Named range repair
dialog (parse errors, unqualified refs, missing-sheet refs, spill/implicit-intersection
operators, bracketed UI-dialect structured refs, empty values), and match a defined name’s
scopeto sheet names case-insensitively. - Tables: stop emitting
<autoFilter>(which added unwanted filter dropdowns) and thetotalsRowCount="0"default, and honor the JSF table’s ownstyleinstead of hardcodingTableStyleMedium2. Table names that parse as cell references (e.g.T1,R1C1) are now prefixed with_to avoid Excel rejecting them with a repair dialog. - Error cells: emit
xl/richData/*parts andxl/metadata.xmlentries to back thevmattributes on rich-value error cells (#SPILL!,#CALC!,#FIELD!,#UNKNOWN!). - Comments: preserve significant whitespace in
sharedStrings.xml<t>elements viaxml:space="preserve", drop the (incorrect)countattribute on<sst>, and stop emitting VML drawing shapes for threaded-comment replies (Excel emits one shape per thread root only). When multiple root threads share a cell, combine them into a single legacy<comment>(Excel’s legacy schema keys by ref, and emitting one entry per thread triggered a Removed Records: Comments repair). Strip the trailingZfrom threaded-commentdTtimestamps to match Excel’s native emission. - Pivot caches: in
<sharedItems>, omitcontainsSemiMixedTypes="0"when blanks coexist with typed values (Excel rejects this combination, triggering a Repaired Records: PivotTable report from pivotCacheDefinition repair) and tightencontainsNonDate="0"emission to pure-date fields without blanks. Preserve the trailingZonmaxDatewheneverminDateand the item values carry it, removing the asymmetric output on Z-suffixed date inputs. - Formulas:
normalizeExpressionno longer throws on formulas containing unknown function names; the call is passed through unchanged so the rest of the formula still gets normalized. - Cell IDs:
parseCellIdnow correctly handles 3-letter columns (AAA..XFD) and rejects malformed inputs. - Worksheet XML: emit
legacyDrawingbeforetableParts, per OOXML schema. - Theme defaults: updated the built-in default theme name and colour palette to match the current Office defaults.
- CLI: more accurate validation error messages.
Dependency updates
Section titled “Dependency updates”- Colour utilities extracted to the new
@jsfkit/utils. @borgar/fxbumped to 5.0.4 for upstream bugfixes.numfmtadded as a runtime dependency (used to format pivot cache date bounds).- Routine updates to ESLint, Vitest, and GitHub Actions; transitive bumps for security advisories.
v2.0.0 (2026-03-30)
Section titled “v2.0.0 (2026-03-30)”What’s changed
Section titled “What’s changed”New features
Section titled “New features”- Pivot table support: pivot tables are now written to XLSX output, enabling full round-trip of pivot tables including layout, fields, cache definitions, cache records, conditional formats, filters, and extension data.
- Theme and colour support: colours are now fully supported as structured objects with multiple colour models (sRGB, theme, preset) and transforms, rather than plain hex strings. Theme fonts are also supported.
- Text rotation: cell alignment now includes
textRotationin the XLSX output.
Bug fixes
Section titled “Bug fixes”- Fixed a crash when normalising table column formulas that contained unknown or unsupported functions.
- Fixed row style assignment not being applied correctly.
- Fixed
showGridLines: falsenot being persisted on sheet views.
Breaking changes
Section titled “Breaking changes”This release tracks @jsfkit/types v2.0.0,
which introduced breaking changes to the colour model (colours are now objects rather than
"#rrggbb" strings) and moved showGridLines into WorksheetView. Update your JSF data
accordingly.
Dependency updates
Section titled “Dependency updates”Routine updates to ESLint, its plugins, and Vitest.
v1.3.3 (2026-03-10)
Section titled “v1.3.3 (2026-03-10)”- Added: JSF → Excel → JSF roundtripping tests for all eligible fixtures
- Fix: Additive default properties in XML generation
- Fix: threadedComments2 URI for hyperlinks in comments
- Fix: veryHidden sheet state preserved
v1.3.2 (2026-03-04)
Section titled “v1.3.2 (2026-03-04)”- Fix:
workbook>bookViews>workbookViewdefault of no activeTab property does not result in aworkbookView[activeTab="0"]element - Fix column width discrepancy due to no
baseColWidth="10"value for JSF workbooks without defaults - Added: CLI tool exposing toXlsx, usage:
jsf2xlsx input.json -o output.xlsx
v1.3.1 (2026-03-02)
Section titled “v1.3.1 (2026-03-02)”- Row styles included in OOXML
- Default colWidth converted from PixelValue to character col width
- Default (CellStyle = normal) font chosen from 0th style[] in JSF
v1.3.0 (2026-02-18)
Section titled “v1.3.0 (2026-02-18)”- Update dependencies
- Drop
assertdependency in favor of lightweightasserthelper - Add support for data tables
v1.2.0 (2026-02-09)
Section titled “v1.2.0 (2026-02-09)”- Output cell comments and notes
- Update dependencies
v1.1.0 (2026-01-16)
Section titled “v1.1.0 (2026-01-16)”- Export workbook and worksheet views
- Fix incorrect worksheet dimension ref
- Use
package.jsonfiles prop instead of.npmignore - Add default cell format when JSF has no styles
- Test converted files open in Excel successfully
- Remove unused code
- Move JSZip to dev dependencies
- Fix export compatibility issues
- Switch to using npm for package management
- Fix
charEscaperegex to only escape chars < 32 - Convert JSF col widths from pixels to points
- Update dependencies
v1.0.1 (2025-11-27)
Section titled “v1.0.1 (2025-11-27)”- Fix
.npmignoreissues
v1.0.0 (2025-11-26)
Section titled “v1.0.0 (2025-11-26)”- Initial release after the switch from CSF to JSF