Changelog
v2.2.0 (2026-05-29)
Section titled “v2.2.0 (2026-05-29)”What’s changed
Section titled “What’s changed”New features
Section titled “New features”- Producer identity & recalc control:
toXlsxaccepts a third optionalToXlsxOptionsargument so a host application can identify itself in the produced workbook and tell Excel whether saved values are trustworthy:applicationandappVersionpopulate theApplication/AppVersionelements indocProps/app.xml(defaulting toGRID/16.0.300), andcalculated: falsewritesfullCalcOnLoad="1"on<calcPr>to force a recalculation on open. All three are optional, so existing call sites are unaffected. - Page margins: each sheet now emits
<pageMargins>, populated from the newWorksheet.pageMarginsfield when present and falling back to the canonical Excel defaults, to minimise round-trip diffs. - Pivot button styles: the
Style.pivotButtonfield is now emitted aspivotButton="1"on the corresponding cell format, round-tripping the filter-dropdown header styling on pivot row/column-label cells.
Bug fixes
Section titled “Bug fixes”- Fonts & styles: font records are now built self-contained from each style’s own
properties instead of inheriting silently from the Normal/parent font; a cell silent on
colorrenders black rather than Normal’s colour, a font’sschemeis emitted only when the typeface is the theme major/minor font, and a cell’s effective format is resolved correctly against covering column/row defaults (<c s>shadowing<col s>/<row s>). Row default style emission was also fixed. - Worksheet XML: skip empty
<row>placeholders for unpopulated rows, tighten the<dimension>ref to the populated-cell bounding box, and omit the defaultshowGridLines="1"from the fallback sheet view. - Tables: preserve
totalsRowShown=falsethrough the JSF → xlsx conversion. - Array formulas: stop emitting
cm="1"on legacy CSE array-formula cells. - Pivot tables & caches: always emit
baseField/baseItemdefaults on<dataField>, readhideValuesRowfrom the JSF instead of hard-coding it, emit post-2010showDataAsas an x14dataFieldextension, and emitnumFmtIdon a cache field even when it is the default0. Several XML-fidelity fixes reduce repair-dialog risk: scope the x14/xpdlxmlnsdeclarations to their<ext>roots, drop the unusedxmlns:xmdeclaration from the pivot table root, dropcount="0"from items-less<sharedItems>, and omit the defaultv="0"on<x>inside row/col items. Emit the Excel-2016 version markersminRefreshableVersion="3"andcreatedVersion="8"on pivots with row or column axis content (updatedVersion="8"is already emitted unconditionally) to match Excel’s baseline and close gratuitous resave diffs. - Styles XML: drop the empty
<numFmts count="0"/>element fromstyles.xml.
Dependency & tooling updates
Section titled “Dependency & tooling updates”@jsfkit/typespromoted from a dev dependency to a full dependency — the distributed type declarations import from it, so TypeScript consumers need it at runtime resolution.- Build switched from tsup to tsdown.
@jsfkit/typesand@borgar/xlsx-convertbumped to latest; TypeScript bumped to 6.0.3.- Routine docs dependency bumps, Dependabot config update, and transitive security bumps.
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