forked from sheetjs/docs.sheetjs.com
		
	Demo refresh
This commit is contained in:
		
							parent
							
								
									d77a40c6bf
								
							
						
					
					
						commit
						8a65ff5698
					
				| @ -104,7 +104,7 @@ It should be injected at the top of relevant Razor component scripts: | ||||
| 
 | ||||
| When exporting a file with the SheetJS `writeFile` method[^2], browser APIs do | ||||
| not provide success or error feedback. As a result, this demo invokes functions | ||||
| using the `InvokeVoidAsync` static method[^3].  | ||||
| using the `InvokeVoidAsync` static method[^3]. | ||||
| 
 | ||||
| The following C# method will invoke the `export_method` method in the browser: | ||||
| 
 | ||||
|  | ||||
| @ -260,7 +260,7 @@ flowchart LR | ||||
|   linkStyle 1,2,3 color:blue,stroke:blue; | ||||
| ``` | ||||
| 
 | ||||
| Here is a sample method for exporting data from the UI5 `JSONModel` to XLSX:  | ||||
| Here is a sample method for exporting data from the UI5 `JSONModel` to XLSX: | ||||
| 
 | ||||
| ```js title="Fetch data from JSONModel and export to XLSX" | ||||
| /* get model data and export to XLSX */ | ||||
|  | ||||
| @ -26,8 +26,8 @@ This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Drash   | Deno   | Date       | | ||||
| |:--------|:-------|:-----------| | ||||
| | `2.8.1` | 1.44.1 | 2024-12-19 | | ||||
| | `2.8.1` | 2.1.4  | 2024-12-19 | | ||||
| | `2.8.1` | 1.46.0 | 2025-05-21 | | ||||
| | `2.8.1` | 2.3.3  | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -133,7 +133,7 @@ deno run --allow-net SheetJSDrash.ts | ||||
| Deno 2 requires the `--allow-import` entitlement: | ||||
| 
 | ||||
| ```bash | ||||
| deno run --allow-net --allow-write --allow-import SheetJSDenoDOM.ts | ||||
| deno run --allow-net --allow-write --allow-import SheetJSDrash.ts | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| @ -142,9 +142,10 @@ deno run --allow-net --allow-write --allow-import SheetJSDenoDOM.ts | ||||
| 
 | ||||
| 4) Open `http://localhost:7262/` in your browser. | ||||
| 
 | ||||
| Click "Choose File" and select `pres.numbers`.  Then click "Submit" | ||||
| Click "Choose File" and select `pres.numbers` from the Downloads folder. | ||||
| 
 | ||||
| The page should show the contents of the file as an HTML table. | ||||
| Click "Submit" to make a request to the Drash server. The response should show | ||||
| the contents of the file as an HTML table. | ||||
| 
 | ||||
| 5) Open `http://localhost:7262/export` in your browser. | ||||
| 
 | ||||
|  | ||||
| @ -23,9 +23,11 @@ The ["Complete Example"](#complete-example) section includes a complete server. | ||||
| 
 | ||||
| This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Platform       | HonoJS   | Date       | | ||||
| |:---------------|:---------|:-----------| | ||||
| | BunJS `1.1.40` | `4.6.14` | 2024-12-19 | | ||||
| | Platform       | HonoJS    | Date       | | ||||
| |:---------------|:----------|:-----------| | ||||
| | BunJS `1.2.13` | `2.7.8`   | 2025-05-21 | | ||||
| | BunJS `1.2.13` | `3.12.12` | 2025-05-21 | | ||||
| | BunJS `1.2.13` | `4.7.10`  | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -26,8 +26,8 @@ This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Platform       | ElysiaJS | Date       | | ||||
| |:---------------|:---------|:-----------| | ||||
| | BunJS `1.1.40` | `0.8.17` | 2024-12-19 | | ||||
| | BunJS `1.1.40` | `1.1.26` | 2024-12-19 | | ||||
| | BunJS `1.2.13` | `0.8.17` | 2025-05-21 | | ||||
| | BunJS `1.2.13` | `1.3.1`  | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -24,11 +24,12 @@ The ["Complete Example"](#complete-example) section includes a complete server. | ||||
| 
 | ||||
| This demo was tested in the following deployments: | ||||
| 
 | ||||
| | NestJS    | Date         | | ||||
| |:----------|:-------------| | ||||
| | `10.4.15` | `2024-12-22` | | ||||
| | `9.4.3`   | `2024-12-22` | | ||||
| | `8.4.7`   | `2024-12-22` | | ||||
| | NestJS    | Date       | | ||||
| |:----------|:-----------| | ||||
| | `11.1.1`  | 2025-05-21 | | ||||
| | `10.4.17` | 2025-05-21 | | ||||
| | `9.4.3`   | 2025-05-21 | | ||||
| | `8.4.7`   | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -130,12 +130,13 @@ This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Puppeteer | Date       | | ||||
| |:----------|:-----------| | ||||
| | `23.11.1` | 2024-12-31 | | ||||
| | `22.15.0` | 2024-12-31 | | ||||
| | `21.11.0` | 2024-12-31 | | ||||
| | `20.9.0`  | 2024-12-31 | | ||||
| | `15.5.0`  | 2024-12-31 | | ||||
| | `10.4.0`  | 2024-12-31 | | ||||
| | `24.9.0`  | 2025-05-21 | | ||||
| | `23.11.1` | 2025-05-21 | | ||||
| | `22.15.0` | 2025-05-21 | | ||||
| | `21.11.0` | 2025-05-21 | | ||||
| | `20.9.0`  | 2025-05-21 | | ||||
| | `15.5.0`  | 2025-05-21 | | ||||
| | `10.4.0`  | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -145,14 +146,14 @@ This demo was tested in the following deployments: | ||||
|   <TabItem value="nodejs" label="NodeJS"> | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz puppeteer@23.11.1`} | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz puppeteer@24.9.0`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem value="bunjs" label="BunJS"> | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| bun install https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz puppeteer@23.11.1`} | ||||
| bun install https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz puppeteer@24.9.0`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
|   </TabItem> | ||||
| @ -236,9 +237,9 @@ const { webkit } = require('playwright'); // import desired browser | ||||
| 
 | ||||
| This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Playwright | Date       | | ||||
| |:-----------|:-----------| | ||||
| | `1.49.1`   | 2024-12-31 | | ||||
| | Playwright | Browser     | Date       | | ||||
| |:-----------|:------------|:-----------| | ||||
| | `1.52.0`   | Webkit 18.4 | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -20,8 +20,8 @@ This demo was tested in the following environments: | ||||
| 
 | ||||
| | Browser      | Date       | | ||||
| |:-------------|:-----------| | ||||
| | Chromium 131 | 2024-12-31 | | ||||
| | Safari 18.2  | 2024-12-31 | | ||||
| | Chromium 136 | 2025-05-21 | | ||||
| | Safari 18.2  | 2025-05-21 | | ||||
| | Konqueror 22 | 2025-04-23 | | ||||
| 
 | ||||
| ::: | ||||
|  | ||||
| @ -19,8 +19,8 @@ This demo was tested in the following environments: | ||||
| 
 | ||||
| | Browser      | Date       | | ||||
| |:-------------|:-----------| | ||||
| | Chromium 131 | 2024-12-31 | | ||||
| | Safari 18.2  | 2024-12-31 | | ||||
| | Chromium 136 | 2025-05-21 | | ||||
| | Safari 18.2  | 2025-05-21 | | ||||
| | Konqueror 22 | 2025-04-23 | | ||||
| 
 | ||||
| ::: | ||||
|  | ||||
| @ -33,6 +33,9 @@ Content v1 (paired with VueJS 2.x and NuxtJS 2.x) | ||||
| The ["Nuxt Content v2"](#nuxt-content-v2) section explores "transformers" for | ||||
| NuxtJS Content v2 (paired with VueJS 3.x and NuxtJS 3.x) | ||||
| 
 | ||||
| The ["Nuxt Content v3"](#nuxt-content-v3) section explores raw ViteJS modules | ||||
| (paired with VueJS 3.x and NuxtJS 3.x) | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| This demo focuses on server-side processing with NuxtJS and VueJS. | ||||
| @ -918,7 +921,7 @@ export default defineNuxtConfig({ | ||||
| 
 | ||||
| 5) Create a new file `app.vue` with the following contents: | ||||
| 
 | ||||
| ```jsx title="app.vue (create new file)" | ||||
| ```html title="app.vue (create new file)" | ||||
| <script setup> | ||||
| import data from '../../pres.xlsx' | ||||
| </script> | ||||
|  | ||||
| @ -578,7 +578,7 @@ reconnect the device before trying again. | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| In some test runs, the app requested for local network access:  | ||||
| In some test runs, the app requested for local network access: | ||||
| 
 | ||||
| > "SheetJSRNFetch" would like to find and connect to devices on your local network. | ||||
| 
 | ||||
|  | ||||
| @ -530,7 +530,7 @@ error: Provisioning profile "iOS Team Provisioning Profile: com.sheetjs.cap" doe | ||||
| ``` | ||||
| 
 | ||||
| This error was resolved by manually selecting the device as the primary target | ||||
| in the Xcode workspace.  | ||||
| in the Xcode workspace. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -888,7 +888,7 @@ Tap "OK" to continue. | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| In some test runs, the app requested for local network access:  | ||||
| In some test runs, the app requested for local network access: | ||||
| 
 | ||||
| > "Sheetjs Flutter" would like to find and connect to devices on your local network. | ||||
| 
 | ||||
|  | ||||
| @ -176,7 +176,7 @@ The demo uses Lynx `<view/>` and `<text/>` elements to display tabular data: | ||||
|       {/* Map through each cell in the current row */} | ||||
|       {Array.isArray(row) && row.map((cell, cellIndex) => ( | ||||
|         {/* Cell with dynamic width based on content */} | ||||
|         <view  | ||||
|         <view | ||||
|           key={`cell-${rowIndex}-${cellIndex}`}  className="Cell" | ||||
|           style={{ width: `${widths[cellIndex]}px` }}> | ||||
|           {/* Display cell content as text */} | ||||
|  | ||||
| @ -119,14 +119,14 @@ input.click(); | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Architecture | NW.js    | Date       | Notes                | | ||||
| |:---------------|:-------------|:---------|:-----------|:---------------------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `0.94.0` | 2025-03-31 |                      | | ||||
| | macOS 14.5     | `darwin-arm` | `0.94.0` | 2025-03-30 |                      | | ||||
| | Windows 11     | `win11-x64`  | `0.94.0` | 2024-12-19 |                      | | ||||
| | Windows 11     | `win11-arm`  | `0.94.0` | 2025-02-23 |                      | | ||||
| | Linux (HoloOS) | `linux-x64`  | `0.89.0` | 2025-01-10 |                      | | ||||
| | Linux (Debian) | `linux-arm`  | `0.60.0` | 2025-02-16 | Unofficial build[^1] | | ||||
| | OS and Version | Architecture | NW.js     | Date       | Notes                | | ||||
| |:---------------|:-------------|:----------|:-----------|:---------------------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `0.94.0`  | 2025-03-31 |                      | | ||||
| | macOS 14.5     | `darwin-arm` | `0.94.0`  | 2025-03-30 |                      | | ||||
| | Windows 11     | `win11-x64`  | `0.100.0` | 2025-05-27 |                      | | ||||
| | Windows 11     | `win11-arm`  | `0.94.0`  | 2025-02-23 |                      | | ||||
| | Linux (HoloOS) | `linux-x64`  | `0.89.0`  | 2025-01-10 |                      | | ||||
| | Linux (Debian) | `linux-arm`  | `0.60.0`  | 2025-02-16 | Unofficial build[^1] | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -146,7 +146,7 @@ cd sheetjs-nwjs | ||||
|   "version": "0.0.0", | ||||
|   "main": "index.html", | ||||
|   "dependencies": { | ||||
|     "nw": "0.94.0", | ||||
|     "nw": "0.100.0", | ||||
|     "xlsx": "https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz" | ||||
|   } | ||||
| }`} | ||||
| @ -167,6 +167,22 @@ In the terminal window, the download can be performed with: | ||||
| curl -LO https://docs.sheetjs.com/nwjs/index.html | ||||
| ``` | ||||
| 
 | ||||
| :::note pass | ||||
| 
 | ||||
| In PowerShell, the command may fail with a parameter error: | ||||
| 
 | ||||
| ``` | ||||
| Invoke-WebRequest : A parameter cannot be found that matches parameter name 'L'. | ||||
| ``` | ||||
| 
 | ||||
| `curl.exe` must be invoked directly: | ||||
| 
 | ||||
| ```bash | ||||
| curl.exe -LO https://docs.sheetjs.com/nwjs/index.html | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 3) Install dependencies: | ||||
| 
 | ||||
| ```bash | ||||
| @ -208,15 +224,16 @@ Unfortunately `nw-builder` will not be able to build a standalone program. | ||||
| 5) To build a standalone app, run the builder: | ||||
| 
 | ||||
| ```bash | ||||
| npx -p nw-builder@4.11.6 nwbuild --mode=build --version=0.94.0 --glob=false --outDir=../out ./ | ||||
| npx -p nw-builder@4.11.6 nwbuild --mode=build --version=0.100.0 --glob=false --outDir=../out ./ | ||||
| ``` | ||||
| 
 | ||||
| This will generate the standalone app in the `..\out\` folder. | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| There is a regression in `nw-builder` version `4.12.0`. In local `win11-x64` | ||||
| testing, version `4.11.6` correctly generated the standalone application. | ||||
| There is a regression in `nw-builder` versions `4.12.0` and `4.13.14`. | ||||
| 
 | ||||
| In local `win11-x64` testing, `4.11.6` generates the standalone application. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -54,6 +54,21 @@ platform provides many native features out of the box. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Architecture | Wails     | Date       | | ||||
| |:---------------|:-------------|:----------|:-----------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `v2.10.1` | 2025-03-31 | | ||||
| | macOS 14.5     | `darwin-arm` | `v2.10.1` | 2025-03-30 | | ||||
| | Windows 11     | `win11-x64`  | `v2.10.1` | 2025-05-27 | | ||||
| | Windows 11     | `win11-arm`  | `v2.10`   | 2025-02-23 | | ||||
| | Linux (HoloOS) | `linux-x64`  | `v2.9.2`  | 2025-01-02 | | ||||
| | Linux (Debian) | `linux-arm`  | `v2.10`   | 2025-02-16 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| The [SheetJS NodeJS Module](/docs/getting-started/installation/nodejs) can be | ||||
| @ -291,21 +306,6 @@ async function exportFile(table_element) { | ||||
| 
 | ||||
| ## Complete Example | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Architecture | Wails     | Date       | | ||||
| |:---------------|:-------------|:----------|:-----------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `v2.10.1` | 2025-03-31 | | ||||
| | macOS 14.5     | `darwin-arm` | `v2.10.1` | 2025-03-30 | | ||||
| | Windows 11     | `win11-x64`  | `v2.9.2`  | 2024-12-21 | | ||||
| | Windows 11     | `win11-arm`  | `v2.10`   | 2025-02-23 | | ||||
| | Linux (HoloOS) | `linux-x64`  | `v2.9.2`  | 2025-01-02 | | ||||
| | Linux (Debian) | `linux-arm`  | `v2.10`   | 2025-02-16 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 0) Read the Wails "Getting Started" guide[^14] and install dependencies. | ||||
| 
 | ||||
| <details> | ||||
| @ -400,7 +400,11 @@ wails build | ||||
| 
 | ||||
| It will print the path to the generated program (typically in `build/bin/`). | ||||
| 
 | ||||
| 5) Run the generated application. | ||||
| 5) Run the generated application: | ||||
| 
 | ||||
| | Architecture | Command                                   | | ||||
| |:-------------|:------------------------------------------| | ||||
| | `win11-x64`  | `.\build\bin\sheetjs-wails.exe`           | | ||||
| 
 | ||||
| **Testing** | ||||
| 
 | ||||
|  | ||||
| @ -50,6 +50,21 @@ app to read and write workbooks. The app will look like the screenshots below: | ||||
| 
 | ||||
| </td></tr></tbody></table> | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Architecture | Tauri     | Date       | | ||||
| |:---------------|:-------------|:----------|:-----------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `v1.6.0`  | 2025-03-31 | | ||||
| | macOS 14.5     | `darwin-arm` | `v1.6.0`  | 2025-03-30 | | ||||
| | Windows 11     | `win11-x64`  | `v1.6.0`  | 2025-05-27 | | ||||
| | Windows 11     | `win11-arm`  | `v1.6.0`  | 2025-02-23 | | ||||
| | Linux (HoloOS) | `linux-x64`  | `v1.6.0`  | 2025-01-02 | | ||||
| | Linux (Debian) | `linux-arm`  | `v1.6.0`  | 2025-05-27 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| The [SheetJS NodeJS Module](/docs/getting-started/installation/nodejs) can be | ||||
| @ -347,21 +362,6 @@ function SheetJSExportKaioponent() { | ||||
| 
 | ||||
| ## Complete Example | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Architecture | Tauri     | Date       | | ||||
| |:---------------|:-------------|:----------|:-----------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `v1.6.0`  | 2025-03-31 | | ||||
| | macOS 14.5     | `darwin-arm` | `v1.6.0`  | 2025-03-30 | | ||||
| | Windows 11     | `win11-x64`  | `v1.6.0`  | 2024-12-21 | | ||||
| | Windows 11     | `win11-arm`  | `v1.6.0`  | 2025-02-23 | | ||||
| | Linux (HoloOS) | `linux-x64`  | `v1.6.0`  | 2025-01-02 | | ||||
| | Linux (Debian) | `linux-arm`  | `v1.6.0`  | 2025-02-16 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 0) Read Tauri "Getting Started" guide and install prerequisites.[^16] | ||||
| 
 | ||||
| <details> | ||||
| @ -386,15 +386,15 @@ If required dependencies are installed, the output will show a checkmark next to | ||||
| <span {...g}>[✔]</span> <span style={{...y.style,...B.style}}>Environment</span> | ||||
| {`    `}<span {...c}>-</span> <span {...B}>OS</span>: Mac OS 14.5.0 arm64 (X64) | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>Xcode Command Line Tools</span>: installed | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>rustc</span>: 1.85.1 (4eb161250 2025-03-15) | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>cargo</span>: 1.85.1 (d73d2caf9 2024-12-31) | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>rustup</span>: 1.28.1 (f9edccde0 2025-03-05) | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>rustc</span>: 1.87.0 (17067e9ac 2025-05-09) | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>cargo</span>: 1.87.0 (99624be96 2025-05-06) | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>rustup</span>: 1.28.2 (e4f3ad6f8 2025-04-28) | ||||
| {`    `}<span {...g}>✔</span> <span {...B}>Rust toolchain</span>: stable-aarch64-apple-darwin (default) | ||||
| {`    `}<span {...c}>-</span> <span {...B}>node</span>: 20.18.0 | ||||
| {`    `}<span {...c}>-</span> <span {...B}>pnpm</span>: 9.12.3 | ||||
| {`    `}<span {...c}>-</span> <span {...B}>npm</span>: 10.8.2 | ||||
| {`    `}<span {...c}>-</span> <span {...B}>bun</span>: 1.2.7 | ||||
| {`    `}<span {...c}>-</span> <span {...B}>deno</span>: deno 2.2.6 | ||||
| {`    `}<span {...c}>-</span> <span {...B}>bun</span>: 1.2.14 | ||||
| {`    `}<span {...c}>-</span> <span {...B}>deno</span>: deno 2.3.3 | ||||
| </pre> | ||||
| 
 | ||||
| :::caution pass | ||||
| @ -642,8 +642,9 @@ The following features should be manually verified: | ||||
| 
 | ||||
| - When it is loaded, the app will download https://docs.sheetjs.com/pres.numbers | ||||
|   and display the data in a table. | ||||
| - Clicking "Save Data" will show a save dialog. After selecting a path and name, | ||||
|   the app will write a file. That file can be opened in a spreadsheet editor. | ||||
| - Clicking "Save Data" will show a save dialog. If there is no filename, type | ||||
|   `SheetJSTauri.xlsb`. Click "Save". The app will write a file which can be | ||||
|   opened in a spreadsheet editor. | ||||
| - Edit the file in a spreadsheet editor, then click "Load Data" and select the | ||||
|   edited file. The table will refresh with new contents. | ||||
| 
 | ||||
|  | ||||
| @ -45,6 +45,24 @@ app to read and write workbooks. The app will look like the screenshots below: | ||||
| 
 | ||||
| </td></tr></tbody></table> | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Architecture | Server   | Client   | Date       | | ||||
| |:---------------|:-------------|:---------|:---------|:-----------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `6.0.0`  | `6.0.0`  | 2025-03-31 | | ||||
| | macOS 14.5     | `darwin-arm` | `6.0.0`  | `6.0.0`  | 2025-03-30 | | ||||
| | Windows 11     | `win11-x64`  | `6.1.0`  | `6.1.0`  | 2025-05-27 | | ||||
| | Windows 11     | `win11-arm`  | `5.6.0`  | `5.6.0`  | 2025-02-23 | | ||||
| | Linux (HoloOS) | `linux-x64`  | `5.5.0`  | `5.5.0`  | 2025-01-02 | | ||||
| | Linux (Debian) | `linux-arm`  | `5.6.0`  | `5.6.0`  | 2025-02-16 | | ||||
| 
 | ||||
| NeutralinoJS on Windows on ARM generates X64 binaries that run using the X64 | ||||
| compatibility layer. The binaries are not native ARM64 programs! | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) | ||||
| @ -186,24 +204,6 @@ const save_button_callback = async() => { | ||||
| 
 | ||||
| ## Complete Example | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Architecture | Server   | Client   | Date       | | ||||
| |:---------------|:-------------|:---------|:---------|:-----------| | ||||
| | macOS 15.3.2   | `darwin-x64` | `6.0.0`  | `6.0.0`  | 2025-03-31 | | ||||
| | macOS 14.5     | `darwin-arm` | `6.0.0`  | `6.0.0`  | 2025-03-30 | | ||||
| | Windows 11     | `win11-x64`  | `5.5.0`  | `5.5.0`  | 2024-12-20 | | ||||
| | Windows 11     | `win11-arm`  | `5.6.0`  | `5.6.0`  | 2025-02-23 | | ||||
| | Linux (HoloOS) | `linux-x64`  | `5.5.0`  | `5.5.0`  | 2025-01-02 | | ||||
| | Linux (Debian) | `linux-arm`  | `5.6.0`  | `5.6.0`  | 2025-02-16 | | ||||
| 
 | ||||
| NeutralinoJS on Windows on ARM generates X64 binaries that run using the X64 | ||||
| compatibility layer. The binaries are not native ARM64 programs! | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The app core state will be the HTML table.  Reading files will add the table to | ||||
| the window.  Writing files will parse the table into a spreadsheet. | ||||
| 
 | ||||
| @ -247,6 +247,22 @@ subdirectory in the `sheetjs-neu` folder: | ||||
| curl -L -o resources/js/xlsx.full.min.js https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| :::note pass | ||||
| 
 | ||||
| In PowerShell, the command may fail with a parameter error: | ||||
| 
 | ||||
| ``` | ||||
| Invoke-WebRequest : A parameter cannot be found that matches parameter name 'L'. | ||||
| ``` | ||||
| 
 | ||||
| `curl.exe` must be invoked directly: | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| curl.exe -L -o resources/js/xlsx.full.min.js https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 3) Add the highlighted line to `neutralino.config.json` in `nativeAllowList`: | ||||
| 
 | ||||
| ```json title="neutralino.config.json (add highlighted line)" | ||||
|  | ||||
| @ -530,6 +530,18 @@ When this demo was last tested on Windows 11 ARM, the build failed. | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| In PowerShell, the command will fail with `msbuild` errors: | ||||
| 
 | ||||
| ``` | ||||
|  × Could not find MSBuild with VCTools for Visual Studio 17.11.0 or later. Make sure all required components have been installed | ||||
| ``` | ||||
| 
 | ||||
| **The commands must be run in a "Native Tools Command Prompt"!** | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Native Module | ||||
| 
 | ||||
| <Tabs groupId="rnwlang"> | ||||
|  | ||||
| @ -4,7 +4,7 @@ sidebar_label: txiki.js | ||||
| pagination_prev: demos/desktop/index | ||||
| pagination_next: demos/data/index | ||||
| sidebar_custom_props: | ||||
|   summary: Compiled apps powered by QuickJS and txiki.js  | ||||
|   summary: Compiled apps powered by QuickJS and txiki.js | ||||
| --- | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
|  | ||||
| @ -12,7 +12,7 @@ import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| [MongoDB](https://mongodb.github.io/node-mongodb-native/) is a document-oriented | ||||
| database engine. [FerretDB](https://www.ferretdb.com/) is a truly open source | ||||
| implementation of the MongoDB wire protocol  | ||||
| implementation of the MongoDB wire protocol. | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
|  | ||||
| @ -11,8 +11,10 @@ simple key-value stores that only support string values and keys. | ||||
| 
 | ||||
| This demo covers two common use patterns: | ||||
| 
 | ||||
| - "Row Objects" shows a simple convention for loading and storing row objects | ||||
| - "Simple Strings" discusses how to persist and recover a raw Storage | ||||
| - ["Row Objects"](#row-objects) shows a simple convention for loading and | ||||
|   storing row objects. | ||||
| - ["Simple Strings"](#simple-strings) discusses how to persist and recover keys | ||||
|   and string values. | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| @ -20,8 +22,8 @@ Each browser demo was tested in the following environments: | ||||
| 
 | ||||
| | Browser      | Date       | | ||||
| |:-------------|:-----------| | ||||
| | Chromium 131 | 2024-12-23 | | ||||
| | Safari 18.2  | 2024-12-31 | | ||||
| | Chromium 136 | 2025-05-21 | | ||||
| | Safari 18.2  | 2025-05-21 | | ||||
| | Konqueror 22 | 2025-04-23 | | ||||
| 
 | ||||
| ::: | ||||
| @ -49,10 +51,13 @@ strings using `JSON.stringify` and store using the row index as a key: | ||||
| 
 | ||||
| #### Importing Data | ||||
| 
 | ||||
| Starting from a worksheet, the SheetJS `sheet_to_json` method[^1] generates an | ||||
| array of row objects. `localStorage.setItem` will store data in Local Storage: | ||||
| `localStorage.setItem` will store data in Local Storage. | ||||
| 
 | ||||
| ```js | ||||
| Starting from a worksheet, the SheetJS `sheet_to_json` method[^1] generates an | ||||
| array of row objects. Each object in the array can be saved in the Local Storage | ||||
| using the row index as the key. | ||||
| 
 | ||||
| ```js title="Store a SheetJS worksheet in Local Storage" | ||||
| function sheet_to_localStorage(worksheet) { | ||||
|   const aoo = XLSX.utils.sheet_to_json(worksheet); | ||||
|   for(let i = 0; i < aoo.length; ++i) { | ||||
| @ -96,7 +101,7 @@ function localStorage_to_array_of_objects() { | ||||
| The SheetJS `json_to_sheet`[^2] method will create a new worksheet from the | ||||
| array of objects: | ||||
| 
 | ||||
| ```js | ||||
| ```js title="Generate a SheetJS worksheet from records in Local Storage " | ||||
| function localStorage_to_sheet() { | ||||
|   const aoo = []; | ||||
|   for(let i = 0; i < localStorage.length; ++i) { | ||||
| @ -118,8 +123,8 @@ After saving the exported file, the Local Storage can be inspected in the | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| This example is for illustration purposes. If array of objects is available, it | ||||
| is strongly recommended to convert that array to a worksheet directly. | ||||
| This example is for illustration purposes. If an array of objects is available, | ||||
| it is strongly recommended to convert that array to a worksheet directly. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -203,7 +208,7 @@ In modern browsers, `Object.entries` will generate an array of key/value pairs. | ||||
| The SheetJS `aoa_to_sheet`[^3] method will interpret that array as a worksheet | ||||
| with 2 columns (key and value): | ||||
| 
 | ||||
| ```js | ||||
| ```js title="Generate a SheetJS two-column worksheet from Local Storage" | ||||
| function localStorage_to_ws() { | ||||
|   const aoa = Object.entries(localStorage); | ||||
|   return XLSX.utils.aoa_to_sheet(aoa); | ||||
| @ -216,7 +221,7 @@ In the other direction, the worksheet is assumed to store keys in column A and | ||||
| values in column B. The SheetJS `sheet_to_json`[^1] method, with the option | ||||
| `header: 1`, will generate key/value pairs that can be assigned to a storage: | ||||
| 
 | ||||
| ```js | ||||
| ```js title="Store a SheetJS two-column worksheet in Local Storage" | ||||
| function ws_to_localStorage(ws) { | ||||
|   const aoa = XLSX.utils.sheet_to_json(ws, { header: 1 }); | ||||
|   aoa.forEach(([key, val]) => localStorage.setItem(key, val)); | ||||
|  | ||||
| @ -8,7 +8,7 @@ sidebar_custom_props: | ||||
| 
 | ||||
| <head> | ||||
|   <script type="text/javascript" src="https://unpkg.com/localforage@1.10.0/dist/localforage.min.js"></script> | ||||
|   <script type="text/javascript" src="https://unpkg.com/dexie@4.0.10/dist/dexie.js"></script> | ||||
|   <script type="text/javascript" src="https://unpkg.com/dexie@4.0.11/dist/dexie.js"></script> | ||||
| </head> | ||||
| 
 | ||||
| :::danger pass | ||||
| @ -43,8 +43,8 @@ This demo was last tested in the following environments: | ||||
| 
 | ||||
| | Browser      | Date       | `localForage` | | ||||
| |:-------------|:-----------|:--------------| | ||||
| | Chromium 131 | 2024-12-31 | `1.10.0`      | | ||||
| | Safari 18.2  | 2024-12-31 | `1.10.0`      | | ||||
| | Chromium 136 | 2025-05-21 | `1.10.0`      | | ||||
| | Safari 18.2  | 2025-05-21 | `1.10.0`      | | ||||
| | Konqueror 22 | 2025-04-23 | `1.10.0`      | | ||||
| 
 | ||||
| ::: | ||||
| @ -116,8 +116,8 @@ This demo was last tested in the following environments: | ||||
| 
 | ||||
| | Browser      | Date       | DexieJS  | | ||||
| |:-------------|:-----------|:---------| | ||||
| | Chromium 131 | 2024-12-31 | `4.0.10` | | ||||
| | Safari 18.2  | 2024-12-31 | `4.0.10` | | ||||
| | Chromium 136 | 2025-05-21 | `4.0.11` | | ||||
| | Safari 18.2  | 2025-05-21 | `4.0.11` | | ||||
| | Konqueror 22 | 2025-04-23 | `4.0.10` | | ||||
| 
 | ||||
| ::: | ||||
|  | ||||
| @ -33,7 +33,7 @@ This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Lightning API | Date       | | ||||
| |:--------------|:-----------| | ||||
| | `61.0`        | 2024-10-06 | | ||||
| | `62.0`        | 2025-05-27 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -331,7 +331,7 @@ npx @salesforce/cli --version | ||||
| When the demo was last tested, the command printed | ||||
| 
 | ||||
| ``` | ||||
| @salesforce/cli/2.60.13 darwin-arm64 node-v20.18.0 | ||||
| @salesforce/cli/2.89.8 win32-x64 node-v24.1.0 | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| @ -380,7 +380,7 @@ with the following XML: | ||||
| ```xml title="force-app\main\default\lwc\sheetComponent\sheetComponent.js-meta.xml (replace highlighted lines)" | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> | ||||
|   <apiVersion>61.0</apiVersion> | ||||
|   <apiVersion>62.0</apiVersion> | ||||
|   <!-- highlight-start --> | ||||
|   <isExposed>true</isExposed> | ||||
|   <masterLabel>SheetForce</masterLabel> | ||||
| @ -412,7 +412,7 @@ A) In the Salesforce site, click on the gear icon in the top-right corner of the | ||||
| page and select "Setup" (Setup for current app). | ||||
| 
 | ||||
| B) Type "Custom Code" in the left sidebar search box. Expand "Custom Code", | ||||
| expand "Lightning Components" and click "Lightning Components". | ||||
| expand "Lightning Components" and click the inner "Lightning Components". | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| @ -430,8 +430,8 @@ Click the link to open the page in Salesforce Classic. | ||||
| 
 | ||||
| A) Click the "Setup" link in the top-right corner of the page. | ||||
| 
 | ||||
| B) Type "Lightning" in the left sidebar search box. Expand "Develop", expand | ||||
| "Lightning Components" and click "Lightning Components". | ||||
| B) Type "Custom Code" in the left sidebar search box. In the section, expand | ||||
| "Lightning Components" and click the inner "Lightning Components". | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| @ -505,7 +505,8 @@ When the "Page Saved" modal is displayed, click "Activate". | ||||
| 
 | ||||
| The following options should be set: | ||||
| - Click "Change..." next to "Icon" and pick a memorable icon | ||||
| - Under "Lightning Experience" click "LightningBolt" then "Add page to app" | ||||
| - Under "Lightning Experience" select "LightningBolt" in the left column and | ||||
|   click "Add page to app" in the right side | ||||
| 
 | ||||
| Click "Save" to activate the page. | ||||
| 
 | ||||
|  | ||||
| @ -299,7 +299,7 @@ npm run stop | ||||
| npm start | ||||
| ``` | ||||
| 
 | ||||
| 4) Activate the Task Pane for the addin (click "Show Task Pane" in the ribbon).  | ||||
| 4) Activate the Task Pane for the addin (click "Show Task Pane" in the ribbon). | ||||
| 
 | ||||
| 5) Hover near the top-right corner of the addin and click the `i` icon. | ||||
| 
 | ||||
|  | ||||
| @ -37,9 +37,9 @@ remote file, parses the contents, and writes data to the sheet: | ||||
| 
 | ||||
| This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Clasp   | Date       | | ||||
| |:--------|:-----------| | ||||
| | `2.4.2` | 2024-12-31 | | ||||
| | Clasp         | Date       | | ||||
| |:--------------|:-----------| | ||||
| | `3.0.4-alpha` | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -112,7 +112,7 @@ the result of setting cell `A1` to the formula `=AOA()`: | ||||
| ```js | ||||
| function AOA(url) { | ||||
|   return [ | ||||
|     ["Sheet", "JS"],  | ||||
|     ["Sheet", "JS"], | ||||
|     [     72,   62] | ||||
|   ]; | ||||
| } | ||||
| @ -153,6 +153,10 @@ The next page will include the following title: | ||||
| 
 | ||||
| 3) At the bottom of the screen, click "Continue". | ||||
| 
 | ||||
| The next page will include the following title: | ||||
| 
 | ||||
| > clasp – The Apps Script CLI wants access to your Google Account | ||||
| 
 | ||||
| 4) In the next screen, check every box that mentions "Google Apps Script". When | ||||
| the demo was last tested, the following were required: | ||||
| 
 | ||||
| @ -183,7 +187,8 @@ Authorization successful. | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| 9) Click the gear icon (Project Settings) and copy the Script ID | ||||
| 9) Click the gear icon (Project Settings) in the left sidebar. Scroll down to | ||||
| the "IDs" section and copy the Script ID. | ||||
| 
 | ||||
| ### Cloning the Apps Script | ||||
| 
 | ||||
|  | ||||
| @ -30,7 +30,7 @@ This demo was tested by SheetJS users in the following deployments: | ||||
| | Architecture | Version | Date       | | ||||
| |:-------------|:--------|:-----------| | ||||
| | `darwin-x64` | `14.1`  | 2025-03-31 | | ||||
| | `win11-x64`  | `14.0`  | 2024-12-19 | | ||||
| | `win11-x64`  | `14.2`  | 2025-05-21 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -181,12 +181,12 @@ This demo tests the NodeJS external engine and dedicated command line tools. | ||||
| 
 | ||||
| ### NodeJS Engine | ||||
| 
 | ||||
| 0) Install NodeJS. When the demo was tested, version `20.19.0` was installed. | ||||
| 0) Install NodeJS. When the demo was tested, version `20.19.2` was installed. | ||||
| 
 | ||||
| 1) Install dependencies in the Home folder (`~` or `$HOME` or `%HOMEPATH%`): | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz zeromq@6.4.0`} | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz zeromq@6.4.2`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 2) Open a new Mathematica Notebook and register NodeJS. When the example was | ||||
|  | ||||
| @ -344,7 +344,7 @@ If prompted, enter the path to the JDK installation. On macOS, JDK installations | ||||
| are typically stored in `/Library/Java/JavaVirtualMachines`. The required path | ||||
| is the `/Contents/Home/` folder within the specific JDK installation. | ||||
| 
 | ||||
| When this demo was last tested, Zulu JDK 21 was installed with Homebrew:  | ||||
| When this demo was last tested, Zulu JDK 21 was installed with Homebrew: | ||||
| 
 | ||||
| ```bash | ||||
| brew install --cask zulu@21 | ||||
|  | ||||
| @ -193,18 +193,18 @@ Each browser demo was tested in the following environments: | ||||
| 
 | ||||
| | Browser      | Date       | Comments                                | | ||||
| |:-------------|:-----------|:----------------------------------------| | ||||
| | Chromium 131 | 2024-12-31 |                                         | | ||||
| | Edge 131     | 2024-12-31 |                                         | | ||||
| | Safari 17.5  | 2024-12-31 | File System Access API is not supported | | ||||
| | Brave 1.63   | 2024-12-31 | File System Access API is not supported | | ||||
| | Chromium 136 | 2025-05-27 |                                         | | ||||
| | Edge 135     | 2025-05-27 |                                         | | ||||
| | Safari 17.1  | 2025-05-27 | File System Access API is not supported | | ||||
| | Brave 1.78   | 2025-05-27 | File System Access API is not supported | | ||||
| | Konqueror 22 | 2025-04-23 | File System Access API is not supported | | ||||
| | Firefox 133  | 2024-12-31 | File System Access API is not supported | | ||||
| | Firefox 138  | 2025-05-27 | File System Access API is not supported | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Downloading a Remote File | ||||
| 
 | ||||
| :::note fetch in Web Workers | ||||
| :::note `fetch` in Web Workers | ||||
| 
 | ||||
| `fetch` was enabled in Web Workers in Chrome 42 and Safari 10.3 | ||||
| 
 | ||||
| @ -400,7 +400,7 @@ self.addEventListener('message', async(e) => { | ||||
| 
 | ||||
| ### User-Submitted File | ||||
| 
 | ||||
| :::note FileReaderSync | ||||
| :::note `FileReaderSync` | ||||
| 
 | ||||
| Typically `FileReader` is used in the main browser context. In Web Workers, the | ||||
| synchronous version `FileReaderSync` is more efficient. | ||||
|  | ||||
| @ -89,7 +89,7 @@ Some properties cannot be changed in spreadsheet applications. The underlying | ||||
| SheetJS output codecs can write arbitrary values. | ||||
| 
 | ||||
| The `Props` object understands the "standard" properties listed in the following | ||||
| table. "SheetJS Name" refers to the name of the property in the `Props` object.  | ||||
| table. "SheetJS Name" refers to the name of the property in the `Props` object. | ||||
| "Excel Property Setting" refers to the name in the Excel file properties dialog. | ||||
| 
 | ||||
| | SheetJS Name  | Excel Property Setting         | | ||||
|  | ||||
| @ -67,7 +67,7 @@ class WriteResource extends Drash.Resource { | ||||
| } | ||||
| 
 | ||||
| const server = new Drash.Server({ | ||||
|   hostname: "", | ||||
|   hostname: "0.0.0.0", | ||||
|   port: 7262, | ||||
|   protocol: "http", | ||||
|   resources: [ ParseResource, WriteResource ], | ||||
|  | ||||
| @ -6,7 +6,6 @@ rm -rf sheetjs-playwright | ||||
| mkdir sheetjs-playwright | ||||
| cd sheetjs-playwright | ||||
| 
 | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz playwright@1.45.0 | ||||
| 
 | ||||
| cat >SheetJSPlaywright.js <<EOF | ||||
| const fs = require("fs"); | ||||
| @ -41,6 +40,7 @@ const { webkit } = require('playwright'); // import desired browser | ||||
| })(); | ||||
| EOF | ||||
| 
 | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz playwright@1.52.0 | ||||
| npx -y playwright@1.52.0 install | ||||
| node SheetJSPlaywright.js | ||||
| npx -y playwright@1.45.0 install | ||||
| npx -y xlsx-cli SheetJSPlaywright.xlsb | ||||
| @ -6,8 +6,6 @@ rm -rf sheetjs-puppeteer | ||||
| mkdir sheetjs-puppeteer | ||||
| cd sheetjs-puppeteer | ||||
| 
 | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz puppeteer@22.12.0 | ||||
| 
 | ||||
| cat >SheetJSPuppeteer.js <<EOF | ||||
| const fs = require("fs"); | ||||
| const puppeteer = require('puppeteer'); | ||||
| @ -43,5 +41,11 @@ const puppeteer = require('puppeteer'); | ||||
| })(); | ||||
| EOF | ||||
| 
 | ||||
| node SheetJSPuppeteer.js | ||||
| npx -y xlsx-cli SheetJSPuppeteer.xlsb | ||||
| for v in 24 23 22 21 20 15 10; do | ||||
| 	npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz puppeteer@$v | ||||
| 	npm ls | grep puppeteer | ||||
| 
 | ||||
| 	node SheetJSPuppeteer.js | ||||
| 	npx -y xlsx-cli SheetJSPuppeteer.xlsb | ||||
| 	rm SheetJSPuppeteer.xlsb | ||||
| done | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user