Skip to main content

Deno SEA

Deno is a JavaScript runtime with support for compiling scripts into self-contained executables.

SheetJS is a JavaScript library for reading and writing data from spreadsheets.

This demo uses the Deno compiler and SheetJS to create a standalone CLI tool for parsing spreadsheets and generating CSV rows.

It is strongly recommended to install Deno on systems using SheetJS libraries in command-line tools. This workaround should only be considered if a standalone binary is considered desirable.

Deno support is considered experimental.

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

Integration Details

The SheetJS Deno module can be imported from Deno scripts.

deno compile generates a standalone executable that includes the entire JS runtime as well as user JS code.

Script Requirements

Scripts that exclusively use SheetJS libraries and Deno built-in modules can be bundled using deno compile. The ESM script should be imported directly:

// @deno-types="https://cdn.sheetjs.com/xlsx-0.20.3/package/types/index.d.ts"
import * as XLSX from 'https://cdn.sheetjs.com/xlsx-0.20.3/package/xlsx.mjs';

For example, the following script accepts one command line argument, parses the specified file using the SheetJS readFile method1, generates CSV text from the first worksheet using sheet_to_csv2, and prints to terminal:

sheet2csv.ts
// @deno-types="https://cdn.sheetjs.com/xlsx-0.20.3/package/types/index.d.ts"
import * as XLSX from 'https://cdn.sheetjs.com/xlsx-0.20.3/package/xlsx.mjs';
import * as cptable from 'https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/cpexcel.full.mjs';
XLSX.set_cptable(cptable);

/* Deno.args[0] is the first argument to the script */
const filename = Deno.args[0];

/* read file */
const wb = XLSX.readFile(filename);

/* generate CSV of first sheet */
const ws = wb.Sheets[wb.SheetNames[0]];
const csv = XLSX.utils.sheet_to_csv(ws);

/* print to terminal */
console.log(csv);

Deno Permissions

The same permissions that apply to normal Deno scripts apply to the compiler:

  • The --allow-read option must be specified to allow the program to read files from the filesystem with the SheetJS readFile 3 method.

  • The --allow-write option must be specified to allow the program to write files to the filesystem with the SheetJS writeFile 4 method.

  • The --allow-net option must be specified to allow the program to download and upload spreadsheets.

More flags can be found in the official permissions list5

Complete Example

Tested Deployments

This demo was last tested in the following deployments:

ArchitectureDenoDate
darwin-x641.43.62024-05-28
darwin-arm1.43.62024-05-23
win10-x641.41.32024-03-24
win11-x641.43.62024-05-25
win11-arm2.0.32024-10-25
linux-x641.41.32024-03-18
linux-arm1.43.62024-05-25

Deno on Windows on ARM uses the X64 compatibility layer. It does not generate a native ARM64 binary!

  1. Install Deno.6

  2. Download the test file https://docs.sheetjs.com/pres.numbers:

curl -o pres.numbers https://docs.sheetjs.com/pres.numbers
  1. Test the script with deno run:
deno run -r --allow-read https://docs.sheetjs.com/cli/sheet2csv.ts pres.numbers

The script should display CSV contents from the first sheet:

Expected Output
Name,Index
Bill Clinton,42
GeorgeW Bush,43
Barack Obama,44
Donald Trump,45
Joseph Biden,46

In newer versions of Deno, importing from a URL requires import permissions:

deno run -r --allow-read --allow-import https://docs.sheetjs.com/cli/sheet2csv.ts pres.numbers
  1. Compile and run sheet2csv:
deno compile -r --allow-read https://docs.sheetjs.com/cli/sheet2csv.ts
./sheet2csv pres.numbers

The program should display the same CSV contents as the script (from step 2)

In newer versions of Deno, importing from a URL requires import permissions:

deno compile -r --allow-read --allow-import https://docs.sheetjs.com/cli/sheet2csv.ts
./sheet2csv pres.numbers

Footnotes

  1. See readFile in "Reading Files"

  2. See sheet_to_csv in "CSV and Text"

  3. See readFile in "Reading Files"

  4. See writeFile in "Writing Files"

  5. See "Permissions list" in the official Deno documentation

  6. The official instructions cover most platforms. Deno does not provide official Linux ARM64 builds, but there are unofficial community builds.