docs.sheetjs.com/docz/docs/03-demos/20-cli/13-denosea.md

5.4 KiB

title pagination_prev pagination_next sidebar_custom_props
Deno SEA demos/desktop/index demos/data/index
summary
Deno Standalone Binaries

import current from '/version.js'; import CodeBlock from '@theme/CodeBlock';

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.

:::info pass

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.

:::

:::caution 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-${current}/package/types/index.d.ts" import * as XLSX from 'https://cdn.sheetjs.com/xlsx-${current}/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:

{\ // @deno-types="https://cdn.sheetjs.com/xlsx-${current}/package/types/index.d.ts" import * as XLSX from 'https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs'; import * as cptable from 'https://cdn.sheetjs.com/xlsx-${current}/package/dist/cpexcel.full.mjs'; XLSX.set_cptable(cptable); \n\ /* Deno.args[0] is the first argument to the script */ const filename = Deno.args[0]; \n\ /* read file */ const wb = XLSX.readFile(filename); \n\ /* generate CSV of first sheet */ const ws = wb.Sheets[wb.SheetNames[0]]; const csv = XLSX.utils.sheet_to_csv(ws); \n\ /* 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

:::note Tested Deployments

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
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

:::

:::caution pass

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:

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

:::info pass

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)

:::info pass

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

:::