Skip to main content


Due to the precarious nature of the Open Specifications Promise, it is very important to ensure code is cleanroom. Contribution Notes

File organization (click to show)

At a high level, the final script is a concatenation of the individual files in the bits folder. Running make should reproduce the final output on all platforms.


bitsraw source files that make up the final script
binserver-side bin scripts (xlsx.njs)
distdist files for web browsers and nonstandard JS environments
demosdemo projects for platforms like ExtendScript and Webpack
testsbrowser tests (run make ctest to rebuild)
typestypescript definitions and tests
miscmiscellaneous supporting scripts
test_filestest files (pulled from the test files repository)

After cloning the repo, running make help will display a list of commands.

OS-Specific Setup

The OSX/Linux workflow works in WSL. Initial setup is involved:

1) Install mercurial and subversion.

# Install support programs for the build and test commands
sudo add-apt-repository ppa:mercurial-ppa/releases
sudo apt-get update
sudo apt-get install mercurial subversion
sudo add-apt-repository --remove ppa:mercurial-ppa/releases

2) Install NodeJS

# Install bootstrap NodeJS and NPM within the WSL
curl -fsSL | sudo -E bash -
sudo apt-get install -y nodejs


# Switch to `n`-managed NodeJS
sudo npm i -g n
sudo n 16

3) follow to build and install a version of Git with OpenSSL:

# Git does not support OpenSSL out of the box, must do this
curl -LO
chmod +x

(instructions continued in the OSX/Linux part)


The xlsx.js and xlsx.mjs files are constructed from the files in the bits subdirectory. The build script (run make) will concatenate the individual bits to produce the scripts.

To produce the dist files, run make dist. The dist files are updated in each version release and should not be committed between versions.

A note on Older Versions

Some of the dependencies are wildly out of date. While SheetJS aims to run in older versions of NodeJS and browsers, some libraries have chosen to break backwards compatibility. The specific versions are used because they are known to work and known to produce consistent results.


The test_misc target runs the targeted feature tests. It should take 5-10 seconds to perform feature tests without testing against the full test battery. New features should be accompanied with tests for the relevant file formats.

For tests involving the read side, an appropriate feature test would involve reading an existing file and checking the resulting workbook object. If a parameter is involved, files should be read with different values to verify that the feature is working as expected.

For tests involving a new write feature which can already be parsed, appropriate feature tests would involve writing a workbook with the feature and then opening and verifying that the feature is preserved.

For tests involving a new write feature without an existing read ability, please add a feature test to the kitchen sink tests/write.js.