Demo refresh

This commit is contained in:
SheetJS 2025-05-27 18:50:10 -04:00
parent d77a40c6bf
commit 8a65ff5698
34 changed files with 229 additions and 156 deletions

@ -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.
![extensions - apps script](pathname:///gsheet/apps-script.png)
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