Version 1.0.0
@stackline/ssf
Format data using ECMA-376 spreadsheet Format Codes
Independent Stackline maintenance of ssf 0.11.2. The published license and original attribution are retained.
- npm 1.0.0
- License: Apache-2.0
- Node.js:
>=0.8
Installation
npm install --save-exact @stackline/ssf@1.0.0To keep the upstream import name:
npm install --save-exact ssf@npm:@stackline/ssf@1.0.0Usage and API
This is the README shipped with version 1.0.0. Retained upstream sections may describe older tooling, package names or browser compatibility. Use the exact scoped installation above, or the alias to preserve existing imports.
@stackline/ssf
Independently maintained Apache-2.0 fork of ssf@0.11.2. Original implementation, attribution and license are retained; this is not an official SheetJS release. The precise published source, git commit and SHA-512 integrity are recorded in UPSTREAM.json.
npm install @stackline/ssf
const library = require("@stackline/ssf");
Changes in 1.0.0
- Treat a dot in a date format as a literal separator unless followed by fractional-second zeros (upstream issues #96 and #97). Numeric decimals and ss.000 keep their original behavior.
- Remove the unused frac runtime dependency: the exact released source already contains the fraction algorithm and does not import frac or any runtime package.
- Keep ssf.js and ssf.flow.js aligned, retain the upstream formatting corpus, and use node:test without the obsolete development dependency tree.
Development and verification
Use Node.js 18 or newer for development (verified locally with Node 24). Run npm ci --ignore-scripts, npm run build, npm run lint, npm test, and npm run test:package.
lint is a JavaScript syntax check, not a claim of a full style/security analysis. All packages have no runtime npm dependencies. npm audit reports registry advisories only; absence of findings is not proof that all format parsing is safe.
1,438 passing tests, including the original formatting corpus; one existing upstream Thai-format test remains skipped.
Sources reviewed on 2026-09-27:
- https://github.com/SheetJS/ssf/issues/96
- https://github.com/SheetJS/ssf/issues/97
- https://git.sheetjs.com/sheetjs/sheetjs/issues
Publication is performed by the repository GitHub workflow; do not publish from a local checkout. This fork does not modify or publish @stackline/xlsx.
Original upstream documentation
The following retained documentation describes the original library and may use its original package name. For this fork install and import the scoped package shown above.
SheetJS SSF
ssf (SpreadSheet Format) is a pure JS library to format data using ECMA-376 spreadsheet format codes (used in popular spreadsheet software packages).
This is the community version. We also offer a pro version with additional features like international support as well as dedicated support.
Installation
With npm:
$ npm install ssf
In the browser:
<script src="ssf.js"></script>
The browser exposes a variable SSF
When installed globally, npm installs a script ssf that renders the format
string with the given arguments. Running the script with -h displays help.
The script will manipulate module.exports if available . This is not always
desirable. To prevent the behavior, define DO_NOT_EXPORT_SSF.
Usage
SSF.format(fmt, val, opts) formats val using the format fmt.
If fmt is a string, it will be parsed and evaluated. If fmt is a number,
the actual format will be the corresponding entry in the internal format table.
For a raw numeric format like 000, the value should be passed as a string.
Date arguments are interpreted in the local time of the JS client.
The options argument may contain the following keys:
| Option Name | Default | Description |
|---|---|---|
date1904 |
false | Use 1904 date system if true, 1900 system if false |
Manipulating the Internal Format Table
Binary spreadsheet formats store cell formats in a table and reference by index. This library uses a global table:
SSF._table is the underlying object, mapping numeric keys to format strings.
SSF.load(fmt:string, idx:?number):number assigns the format to the specified
index and returns the index. If the index is not specified, SSF will search the
space for an available format slot pick an unused slot. For compatibility with
the XLS and XLSB file formats, custom indices should be in the valid ranges
5-8, 23-26, 41-44, 63-66, 164-382 (see [MS-XLSB] 2.4.655 BrtFmt)
SSF.get_table() gets the internal format table (number to format mapping).
SSF.load_table(table) sets the internal format table.
Other Utilities
SSF.parse_date_code(val:number, opts:?any) parses val, returning an object:
type SSFDate = {
D:number; /* number of whole days since relevant epoch, 0 <= D */
y:number; /* integral year portion, epoch_year <= y */
m:number; /* integral month portion, 1 <= m <= 12 */
d:number; /* integral day portion, subject to gregorian YMD constraints */
q:number; /* integral day of week (0=Sunday .. 6=Saturday) 0 <= q <= 6 */
T:number; /* number of seconds since midnight, 0 <= T < 86400 */
H:number; /* integral number of hours since midnight, 0 <= H < 24 */
M:number; /* integral number of minutes since the last hour, 0 <= M < 60 */
S:number; /* integral number of seconds since the last minute, 0 <= S < 60 */
u:number; /* sub-second part of time, 0 <= u < 1 */
}
SSF.is_date(fmt:string):boolean returns true if fmt encodes a date format.
Examples
Related Packages
ssf-cli is a simple NodeJS command
line tool for formatting numbers.
License
Please consult the attached LICENSE file for details. All rights not explicitly granted by the Apache 2.0 license are reserved by the Original Author.
References
ECMA-376: Office Open XML File FormatsMS-XLS: Excel Binary File Format (.xls) Structure SpecificationMS-XLSB: Excel (.xlsb) Binary File Format
Badges
Published files and origin
- LICENSE
- NOTICE
- UPSTREAM.json
- README.md
- Package and archive metadata
- Full text documentation
- Exact npm archive
These documents were read from the existing npm 1.0.0 archive. Its SHA-512 matches the current registry integrity value. This documentation update does not publish a new package or establish a new provenance or immutable-release verification.
Archive integrity
sha512-8ybVxMXXbkYQ5KgmgIATAU2LZLH/uL8IFHRyzCK7qmf1yCuqxx5OHyzO4iZwZWz+PN/vISQdw6oOk2UsPYlqJw==