--- title: Command-Line Tools pagination_prev: demos/mobile/index pagination_next: demos/data/index sidebar_custom_props: cli: true --- import current from '/version.js'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; With the availability of JS engines and the success of server-side platforms, it is feasible to build command-line tools for various workflows. This demo covers a number of strategies for building standalone processors. The goal is to generate CSV output from an arbitrary spreadsheet file. ## NodeJS There are a few popular tools for compiling NodeJS scripts to CLI programs. The demo script presents a friendly command line interface including flags: ```bash $ ./xlsx-cli -h Usage: xlsx-cli [options] [sheetname] Options: -V, --version output the version number -f, --file use specified workbook -s, --sheet print specified sheet (default first sheet) ... ```
Tested Deployments (click to show) This demo was tested in the following deployments: **`pkg`** | Architecture | Version | Node Target | Date | |:-------------|:--------|:------------|:-----------| | `darwin-x64` | `5.8.1` | `18.5.0` | 2023-05-08 | | `darwin-arm` | `5.8.1` | `18.5.0` | 2023-06-05 | | `win32-x64` | `5.8.1` | `18.5.0` | 2023-05-08 | | `linux-x64` | `5.8.1` | `18.5.0` | 2023-05-08 | **`nexe`** | Architecture | Version | Node Target | Date | |:-------------|:-------------|:------------|:-----------| | `darwin-x64` | `4.0.0-rc.2` | `14.15.3` | 2023-05-08 | | `darwin-arm` | `4.0.0-rc.2` | `18.16.0` | 2023-06-05 | | `win32-x64` | `4.0.0-rc.2` | `14.15.3` | 2023-05-08 | | `linux-x64` | `4.0.0-rc.2` | `14.15.3` | 2023-05-08 | **`boxednode`** | Architecture | Version | Node Target | Date | |:-------------|:--------|:------------|:-----------| | `darwin-x64` | `2.0.1` | `20.1.0` | 2023-05-08 | | `darwin-arm` | `2.0.1` | `20.2.0` | 2023-06-05 | | `linux-x64` | `2.0.1` | `20.1.0` | 2023-05-08 |
0) Download the test file : ```bash curl -LO https://sheetjs.com/pres.numbers ``` 1) Download [`xlsx-cli.js`](pathname:///cli/xlsx-cli.js) ```bash curl -LO https://docs.sheetjs.com/cli/xlsx-cli.js ``` 2) Install the dependencies: {`\ npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz exit-on-epipe commander@2`} {`\ pnpm install https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz exit-on-epipe commander@2`} {`\ yarn add https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz exit-on-epipe commander@2`} 3) Follow tooling steps: Run `nexe` and manually specify NodeJS version 14.15.3 ```bash npx nexe -t 14.15.3 xlsx-cli.js ``` This generates `xlsx-cli` or `xlsx-cli.exe` depending on platform. :::caution When the demo was tested on `darwin-arm`, the `mac-arm64` pre-built package was missing. The package must be built from source: ```bash npx nexe xlsx-cli.js --build --python=$(which python3) --make="-j8" ``` ::: Run `pkg`: ```bash npx pkg xlsx-cli.js ``` This generates `xlsx-cli-linux`, `xlsx-cli-macos`, and `xlsx-cli-win.exe` . Run `boxednode`: ```bash npx boxednode@2.0.1 -s xlsx-cli.js -t xlsx-cli ``` 4) Run the generated program, passing `pres.numbers` as the argument. For example, `nexe` generates `xlsx-cli` in macOS so the command is: ```bash ./xlsx-cli pres.numbers ``` ## V8 The [V8](/docs/demos/engines/v8) demo covers standalone programs that embed the V8 engine. This demo uses the Rust integration to generate a command line tool.
Tested Deployments (click to show) This demo was last tested in the following deployments: | Architecture | V8 Version | Date | |:-------------|:-------------|:-----------| | `darwin-x64` | `11.4.183.2` | 2023-05-22 | | `darwin-mac` | `11.4.183.2` | 2023-05-22 | | `linux-x64` | `11.4.183.2` | 2023-05-23 | | `win32-x64` | `11.4.183.2` | 2023-05-23 |
0) Make a new folder for the project: ```bash mkdir sheetjs2csv cd sheetjs2csv ``` 1) Download the following scripts: - [`Cargo.toml`](pathname:///cli/Cargo.toml) - [`snapshot.rs`](pathname:///cli/snapshot.rs) - [`sheet2csv.rs`](pathname:///cli/sheet2csv.rs) ```bash curl -LO https://docs.sheetjs.com/cli/Cargo.toml curl -LO https://docs.sheetjs.com/cli/snapshot.rs curl -LO https://docs.sheetjs.com/cli/sheet2csv.rs ``` 2) Download the [standalone build](/docs/getting-started/installation/standalone): {`\ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} 3) Build the V8 snapshot: ```bash cargo build --bin snapshot cargo run --bin snapshot ``` 4) Build `sheet2csv` (`sheet2csv.exe` in Windows): ```bash cargo build --release --bin sheet2csv ``` 5) Download the test file : ```bash curl -LO https://sheetjs.com/pres.numbers ``` 6) Test the application: ```bash mv target/release/sheet2csv . ./sheet2csv pres.numbers ``` ```bash mv target/release/sheet2csv.exe . ./sheet2csv pres.numbers ``` ## Deno `deno compile` generates a standalone executable that includes the entire JS runtime as well as user JS code. When compiling, the `--allow-read` option must be specified to allow the script to read files from the filesystem with `Deno.readFileSync`. can be compiled and run from Deno.
Tested Deployments (click to show) This demo was last tested in the following deployments: | Architecture | Version | Date | |:-------------|:---------|:-----------| | `darwin-x64` | `1.33.2` | 2023-05-08 | | `darwin-arm` | `1.34.1` | 2023-06-05 | | `win32-x64` | `1.33.2` | 2023-05-08 | | `linux-x64` | `1.33.2` | 2023-05-08 |
0) Download the test file : ```bash curl -LO https://sheetjs.com/pres.numbers ``` 1) Test the script with `deno run`: ```bash deno run -r --allow-read https://docs.sheetjs.com/cli/sheet2csv.ts pres.numbers ``` If this worked, the program will print a CSV of the first worksheet. 2) Compile and run `sheet2csv`: ```bash deno compile -r --allow-read https://docs.sheetjs.com/cli/sheet2csv.ts ./sheet2csv pres.numbers ``` ## Dedicated Engines The following demos for JS engines produce standalone programs: - [Duktape](/docs/demos/engines/duktape) - [ChakraCore](/docs/demos/engines/chakra) - [QuickJS](/docs/demos/engines/quickjs) - [Goja](/docs/demos/engines/goja) - [JavaScriptCore](/docs/demos/engines/jsc)