Skip to main content


Package tarballs are available on is the URL for version 0.20.3

Bun support is considered experimental.

Great open source software grows with user tests and reports. Any issues should be reported to the Bun project for further diagnosis.


Tarballs can be directly installed with bun install:

bun rm xlsx
bun install

Watch the repo or subscribe to the RSS feed to be notified when new versions are released!


For general stability, "vendoring" modules is the recommended approach:

  1. Remove any existing dependency on a project named xlsx:
bun rm xlsx
  1. Download the tarball (xlsx-0.20.3.tgz) for the desired version. The current version is available at

  1. Create a vendor subfolder at the root of your project and move the tarball to that folder. Add it to your project repository.

  2. Install the tarball:

bun install file:vendor/xlsx-0.20.3.tgz

The package will be installed and accessible as xlsx.


The package supports CommonJS require and ESM import module systems.

It is strongly recommended to use CommonJS in Bun.

CommonJS require

By default, the module supports require and it will automatically add support for streams and file system access:

const { readFile } = require("xlsx");
const wb = readFile("pres.numbers"); // works!

In the BunJS REPL, require incorrectly loads the ESM build.

ESM import

When importing the library using ESM import statements, the native NodeJS modules are not loaded. They must be added manually:

import * as XLSX from 'xlsx';

/* load 'fs' for readFile and writeFile support */
import * as fs from 'fs';

/* load 'stream' for stream support */
import { Readable } from 'stream';;

/* load the codepage support library for extended support with older formats */
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';


For server-side scripts, bun build can pre-optimize dependencies. The Bun builder requires a proper package.json that includes the SheetJS dependency.

Tested Deployments

This demo was last tested in the following deployments:

  1. Create a new project:
mkdir sheetjs-bun-dle
cd sheetjs-bun-dle
echo "{}" > package.json

In PowerShell, the redirect will add the UTF16LE BOM. Bun does not currently support the encoding. The file must be resaved in UTF8 (without BOM) or ASCII.

  1. Install the SheetJS package tarball:
bun install
  1. Save the following script to SheetJSBun.js:
import * as XLSX from 'xlsx';
import * as fs from 'fs';

/* fetch JSON data and parse */
const url = "";
const raw_data = await (await fetch(url)).json();

/* filter for the Presidents */
const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));

/* sort by first presidential term */
prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start);
prez.sort((l,r) => l.start.localeCompare(r.start));

/* flatten objects */
const rows = => ({
name: + " " +,

/* generate worksheet and workbook */
const worksheet = XLSX.utils.json_to_sheet(rows);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");

/* fix headers */
XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

/* calculate column width */
const max_width = rows.reduce((w, r) => Math.max(w,, 10);
worksheet["!cols"] = [ { wch: max_width } ];

/* create an XLSX file and try to save to Presidents.xlsx */
XLSX.writeFile(workbook, "Presidents.xlsx");
  1. Bundle the script with bun build:
bun build --target=bun SheetJSBun.js --outfile=app.js

This procedure will generate app.js.

  1. Remove the module artifacts and original script:
rm package.json bun.lockb SheetJSBun.js
rm -rf ./node_modules

PowerShell does not support rm -rf. Instead, each file must be removed:

Windows Powershell commands
rm package.json
rm bun.lockb
rm SheetJSBun.js
rm .\\node_modules -r -fo

At this point, app.js will be the only file in the project folder.

  1. Run the script:
bun app.js

If the script succeeded, the file Presidents.xlsx will be created. That file can be opened in a spreadsheet editor.