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.
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_csv
2, and prints to terminal:
// @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 SheetJSreadFile
3 method. -
The
--allow-write
option must be specified to allow the program to write files to the filesystem with the SheetJSwriteFile
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
This demo was last tested in the following deployments:
Architecture | Deno | Date |
---|---|---|
darwin-x64 | 1.43.6 | 2024-05-28 |
darwin-arm | 1.43.6 | 2024-05-23 |
win10-x64 | 1.41.3 | 2024-03-24 |
win11-x64 | 1.43.6 | 2024-05-25 |
win11-arm | 2.0.3 | 2024-10-25 |
linux-x64 | 1.41.3 | 2024-03-18 |
linux-arm | 1.43.6 | 2024-05-25 |
Deno on Windows on ARM uses the X64 compatibility layer. It does not generate a native ARM64 binary!
-
Install Deno.6
-
Download the test file https://docs.sheetjs.com/pres.numbers:
curl -o pres.numbers https://docs.sheetjs.com/pres.numbers
- 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:
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
- 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
-
See "Permissions list" in the official Deno documentation ↩
-
The official instructions cover most platforms. Deno does not provide official Linux ARM64 builds, but there are unofficial community builds. ↩