Desktop App testing grid

This commit is contained in:
SheetJS 2024-05-28 01:20:05 -04:00
parent f0e5193b74
commit 945e5f02eb
26 changed files with 452 additions and 87 deletions

14
docz/data/desktop.js Normal file

@ -0,0 +1,14 @@
import { read, utils } from 'xlsx';
import url from './desktop.xls';
import React, { useEffect, useState } from 'react';
const FrameworkData = () => {
const [fw, setFW] = useState("");
useEffect(() => { (async() => {
const wb = read(await (await fetch(url)).arrayBuffer(), { dense: true });
setFW(utils.sheet_to_html(wb.Sheets["Frameworks"]));
})(); }, []);
return ( <div dangerouslySetInnerHTML={{__html: fw}}/> );
};
export default FrameworkData;

115
docz/data/desktop.xls Normal file

@ -0,0 +1,115 @@
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>10620</WindowHeight>
<WindowWidth>11020</WindowWidth>
<WindowTopX>2260</WindowTopX>
<WindowTopY>19600</WindowTopY>
<ActiveSheet>1</ActiveSheet>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s16">
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#1C1E21"/>
</Style>
<Style ss:ID="s17">
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000" ss:Bold="1"/>
</Style>
<Style ss:ID="s19">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000" ss:Bold="1"/>
</Style>
<Style ss:ID="s20">
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#467886" ss:Underline="Single"/>
</Style>
</Styles>
<Worksheet ss:Name="Frameworks">
<Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="10" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="16">
<Column ss:Index="2" ss:Width="24"/>
<Column ss:Width="31"/>
<Column ss:Width="24"/>
<Column ss:Width="31"/>
<Column ss:Width="24"/>
<Column ss:Width="31"/>
<Row>
<Cell ss:StyleID="s17"><Data ss:Type="String"></Data></Cell>
<Cell ss:MergeAcross="1" ss:StyleID="s19"><Data ss:Type="String">MacOS</Data></Cell>
<Cell ss:MergeAcross="1" ss:StyleID="s19"><Data ss:Type="String">Windows</Data></Cell>
<Cell ss:MergeAcross="1" ss:StyleID="s19"><Data ss:Type="String">Linux</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s17"><Data ss:Type="String">Framework</Data></Cell>
<Cell ss:StyleID="s17"><Data ss:Type="String">x64</Data></Cell>
<Cell ss:StyleID="s17"><Data ss:Type="String">ARM</Data></Cell>
<Cell ss:StyleID="s17"><Data ss:Type="String">x64</Data></Cell>
<Cell ss:StyleID="s17"><Data ss:Type="String">ARM</Data></Cell>
<Cell ss:StyleID="s17"><Data ss:Type="String">x64</Data></Cell>
<Cell ss:StyleID="s17"><Data ss:Type="String">ARM</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s20" ss:HRef="/docs/demos/desktop/electron#complete-example"><Data ss:Type="String">Electron</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✱</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s20" ss:HRef="/docs/demos/desktop/nwjs#complete-example"><Data ss:Type="String">NW.js</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✱</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s20" ss:HRef="/docs/demos/desktop/wails#complete-example"><Data ss:Type="String">Wails</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s20" ss:HRef="/docs/demos/desktop/tauri#complete-example"><Data ss:Type="String">Tauri</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s20" ss:HRef="/docs/demos/desktop/neutralino#complete-example"><Data ss:Type="String">NeutralinoJS</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✱</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s20" ss:HRef="/docs/demos/desktop/reactnative"><Data ss:Type="String">React Native</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✱</Data></Cell>
<Cell ss:StyleID="s16"></Cell>
<Cell ss:StyleID="s16"></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>

@ -132,8 +132,8 @@
<Cell><Data ss:Type="String">C</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
</Row>
@ -323,7 +323,7 @@
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
<Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell>
</Row>

@ -357,9 +357,9 @@ function exportFile() {
This demo was tested in the following environments:
| VueJS | ViteJS | Date |
|:--------|:--------|:-----------|
| `3.3.9` | `4.5.1` | 2023-12-04 |
| VueJS | ViteJS | Date |
|:---------|:---------|:-----------|
| `3.4.27` | `5.2.11` | 2024-05-26 |
:::

@ -38,6 +38,7 @@ This demo was tested in the following environments:
|:-----------|:--------------------|:------------------|:-------------|:-----------|
| Android 34 | Pixel 3a | `5.5.1` / `5.1.4` | `darwin-x64` | 2023-12-04 |
| iOS 17.0.1 | iPhone 15 Pro Max | `5.5.1` / `5.1.4` | `darwin-x64` | 2023-12-04 |
| Android 34 | Pixel 3a | `6.0.0` / `6.0.0` | `win10-x64` | 2024-05-28 |
**Real Devices**
@ -223,7 +224,7 @@ the `Permissions` comment:
<uses-permission android:name="android.permission.INTERNET" />
```
8) Run the app in the simulator
8) Run the app in the simulator:
```bash
npm run build
@ -231,16 +232,50 @@ npx cap sync
npx cap run android
```
9) Test the app
The app should look like the screenshot at the top of the page.
Open the app and observe that presidents are listed in the table.
9) Test the export functionality.
Touch "Export XLSX" and the emulator will ask for permission:
Touch "Export XLSX" and the emulator will ask for permission. Tap "Allow" and a
popup will be displayed with a path.
Tap "Allow" and a popup will be displayed with a path.
Open the "Files" app in the simulator, tap the `≡` icon and tap "Documents". Tap
the "Documents" folder to find `SheetJSCap.xlsx`.
To see the generated file, switch to the "Files" app in the simulator, tap the
`≡` icon and tap "Documents". Tap "Documents" folder to find `SheetJSCap.xlsx`.
<details open>
<summary><b>Downloading the generated file</b> (click to hide)</summary>
`adb` must be run from the root user:
```bash
adb root
```
The file location can be found by searching for `SheetJSCap.xlsx`:
```bash
adb exec-out find / -name SheetJSCap.xlsx
```
The first line of the output starting with `/` is the desired path:
```text
find: /proc/8533/task/8533/exe: No such file or directory
find: /proc/8533/exe: No such file or directory
// highlight-next-line
/data/media/0/Documents/SheetJSCap.xlsx
/storage/emulated/0/Documents/SheetJSCap.xlsx
```
`adb pull` can download the file:
```bash
adb pull "/data/media/0/Documents/SheetJSCap.xlsx" SheetJSCap.xlsx
```
`SheetJSCap.xlsx` can be opened with a spreadsheet editor such as Excel.
</details>
### iOS

@ -189,11 +189,11 @@ This demo was tested in the following environments:
| OS and Version | Architecture | Electron | Date |
|:---------------|:-------------|:---------|:-----------|
| macOS 14.4 | `darwin-x64` | `29.1.4` | 2024-03-15 |
| macOS 14.1.2 | `darwin-arm` | `27.1.3` | 2023-12-01 |
| macOS 14.5 | `darwin-arm` | `30.0.8` | 2024-05-28 |
| Windows 10 | `win10-x64` | `28.2.0` | 2024-03-04 |
| Windows 11 | `win11-arm` | `27.1.3` | 2023-12-01 |
| Windows 11 | `win11-arm` | `30.0.8` | 2024-05-28 |
| Linux (HoloOS) | `linux-x64` | `29.1.4` | 2024-03-21 |
| Linux (Debian) | `linux-arm` | `27.1.3` | 2023-12-01 |
| Linux (Debian) | `linux-arm` | `30.0.8` | 2024-05-28 |
:::
@ -274,9 +274,12 @@ The program will run on ARM64 Windows.
| Architecture | Command |
|:-------------|:--------------------------------------------------------------|
| `darwin-x64` | `open ./out/sheetjs-electron-darwin-x64/sheetjs-electron.app` |
| `win10-x64` | `.\out\sheetjs-electron-win32-x64\sheetjs-electron.exe` |
| `linux-x64` | `./out/sheetjs-electron-linux-x64/sheetjs-electron` |
| `darwin-x64` |`open ./out/sheetjs-electron-darwin-x64/sheetjs-electron.app` |
| `darwin-arm` |`open ./out/sheetjs-electron-darwin-arm64/sheetjs-electron.app`|
| `win10-x64` |`.\out\sheetjs-electron-win32-x64\sheetjs-electron.exe` |
| `win11-arm` |`.\out\sheetjs-electron-win32-x64\sheetjs-electron.exe` |
| `linux-x64` |`./out/sheetjs-electron-linux-x64/sheetjs-electron` |
| `linux-x64` |`./out/sheetjs-electron-linux-arm64/sheetjs-electron` |
#### Electron API
@ -319,7 +322,7 @@ and select `pres.numbers`.
## Electron Breaking Changes
The first version of this demo used Electron 1.7.5. The current demo includes
the required changes for Electron 28.2.0.
the required changes for Electron 30.0.8.
There are no Electron-specific workarounds in the library, but Electron broke
backwards compatibility multiple times. A summary of changes is noted below.

@ -114,9 +114,9 @@ This demo was tested in the following environments:
| OS and Version | Architecture | NW.js | Date | Notes |
|:---------------|:-------------|:---------|:-----------|:---------------------|
| macOS 14.3.1 | `darwin-x64` | `0.85.0` | 2024-03-12 | |
| macOS 14.1.2 | `darwin-arm` | `0.82.0` | 2023-12-01 | |
| macOS 14.5 | `darwin-arm` | `0.88.0` | 2024-05-28 | |
| Windows 10 | `win10-x64` | `0.83.0` | 2024-03-04 | |
| Windows 11 | `win11-arm` | `0.82.0` | 2023-12-01 | |
| Windows 11 | `win11-arm` | `0.88.0` | 2024-05-28 | |
| Linux (HoloOS) | `linux-x64` | `0.85.0` | 2024-03-12 | |
| Linux (Debian) | `linux-arm` | `0.60.0` | 2024-05-23 | Unofficial build[^1] |
@ -138,7 +138,7 @@ cd sheetjs-nwjs
"version": "0.0.0",
"main": "index.html",
"dependencies": {
"nw": "0.85.0",
"nw": "0.88.0",
"xlsx": "https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz"
}
}`}
@ -171,13 +171,18 @@ npm i
npx nw .
```
The app will show and you should be able to verify reading and writing by using
the file input element to select a spreadsheet and clicking the export button.
On launch, the app will fetch and parse https://docs.sheetjs.com/pres.numbers .
Using the file input element, a file can be selected from the filesystem and the
table will refresh with the contents of the selected file.
Click "Export Data!" and save the generated file to `SheetJSNWDemo.xlsx`. This
file can be opened in Excel or another spreadsheet editor.
5) To build a standalone app, run the builder:
```bash
npx -p nw-builder nwbuild --mode=build --version=0.85.0 --glob=false --outDir=../out ./
npx -p nw-builder nwbuild --mode=build --version=0.88.0 --glob=false --outDir=../out ./
```
This will generate the standalone app in the `..\out\` folder.

@ -298,11 +298,11 @@ This demo was tested in the following environments:
| OS and Version | Architecture | Wails | Date |
|:---------------|:-------------|:---------|:-----------|
| macOS 14.4 | `darwin-x64` | `v2.8.0` | 2024-03-15 |
| macOS 14.1.2 | `darwin-arm` | `v2.6.0` | 2023-12-01 |
| macOS 14.5 | `darwin-arm` | `v2.8.2` | 2024-05-28 |
| Windows 10 | `win10-x64` | `v2.8.0` | 2024-03-24 |
| Windows 11 | `win11-arm` | `v2.6.0` | 2023-12-01 |
| Windows 11 | `win11-arm` | `v2.8.2` | 2024-05-28 |
| Linux (HoloOS) | `linux-x64` | `v2.8.0` | 2024-03-21 |
| Linux (Debian) | `linux-arm` | `v2.6.0` | 2023-12-01 |
| Linux (Debian) | `linux-arm` | `v2.8.2` | 2024-05-28 |
:::
@ -334,7 +334,7 @@ On macOS and Linux, the `PATH` environment variable must include `~/go/bin`. If
`wails` cannot be found, run the following command in the terminal session:
```bash
export PATH="$PATH:~/go/bin"
export PATH="$PATH":~/go/bin
```
:::

@ -345,11 +345,11 @@ This demo was tested in the following environments:
| OS and Version | Architecture | Tauri | Date |
|:---------------|:-------------|:----------|:-----------|
| macOS 14.4 | `darwin-x64` | `v1.5.11` | 2024-04-20 |
| macOS 14.0 | `darwin-arm` | `v1.5.2` | 2023-10-18 |
| macOS 14.5 | `darwin-arm` | `v1.5.14` | 2024-05-26 |
| Windows 10 | `win10-x64` | `v1.5.11` | 2024-03-24 |
| Windows 11 | `win11-arm` | `v1.5.7` | 2023-12-01 |
| Windows 11 | `win11-arm` | `v1.5.14` | 2024-05-28 |
| Linux (HoloOS) | `linux-x64` | `v1.5.11` | 2024-03-21 |
| Linux (Debian) | `linux-arm` | `v1.5.7` | 2023-12-01 |
| Linux (Debian) | `linux-arm` | `v1.5.14` | 2024-05-28 |
:::
@ -467,6 +467,15 @@ npm add vite-plugin-kaioken -D --save
// highlight-end
```
In the same file, look for `"title"` and change the value to `SheetJS x Tauri`:
```json title="src-tauri/tauri.conf.json (edit highlighted line)"
{
// highlight-next-line
"title": "SheetJS x Tauri",
"width": 800,
```
In the same file, look for `"identifier"` and change the value to `com.sheetjs.tauri`:
```json title="src-tauri/tauri.conf.json (edit highlighted line)"
@ -685,6 +694,14 @@ select "Automation" in the body. Look for "Terminal", expand the section, and en
:::
:::note pass
In some tests, the fonts did not match the screenshots.
**The Inter font static TTFs must be manually downloaded and installed.**[^17]
:::
[^1]: See ["Security"](https://tauri.app/v1/references/architecture/security#allowing-api) in the Tauri documentation
[^2]: See [`FsAllowlistConfig`](https://tauri.app/v1/api/config/#fsallowlistconfig) in the Tauri documentation
[^3]: See [`DialogAllowlistConfig`](https://tauri.app/v1/api/config/#dialogallowlistconfig) in the Tauri documentation
@ -700,4 +717,5 @@ select "Automation" in the body. Look for "Terminal", expand the section, and en
[^13]: See [`fs`](https://tauri.app/v1/api/js/fs#writebinaryfile) in the Tauri documentation
[^14]: See ["Array of Arrays Input" in "Utility Functions"](/docs/api/utilities/array#array-of-arrays-input)
[^15]: See ["Workbook Helpers" in "Utility Functions"](/docs/api/utilities/wb)
[^16]: See ["Prerequisites"](https://tauri.app/v1/guides/getting-started/prerequisites) in the Tauri documentation
[^16]: See ["Prerequisites"](https://tauri.app/v1/guides/getting-started/prerequisites) in the Tauri documentation
[^17]: Click "Get font" in the [Inter Google Fonts listing](https://fonts.google.com/specimen/Inter)

@ -195,9 +195,12 @@ This demo was tested in the following environments:
| macOS 14.4 | `darwin-x64` | `5.0.0` | `5.0.1` | 2024-03-15 |
| macOS 14.5 | `darwin-arm` | `5.1.0` | `5.1.0` | 2024-05-25 |
| Windows 10 | `win10-x64` | `5.1.0` | `5.1.0` | 2024-03-24 |
| Windows 11 | `win11-arm` | `4.14.1` | `3.12.0` | 2023-12-01 |
| Windows 11 | `win11-arm` | `5.1.0` | `5.1.1` | 2024-05-28 |
| Linux (HoloOS) | `linux-x64` | `5.0.0` | `5.0.1` | 2024-03-21 |
| Linux (Debian) | `linux-arm` | `4.14.1` | `3.12.0` | 2023-12-01 |
| Linux (Debian) | `linux-arm` | `5.1.0` | `5.1.1` | 2024-05-28 |
On `win11-arm`, the Electron runner is a proper ARM64 binary but the binaries
generated by Electron Forge are x64. The x64 binaries run in Windows on ARM.
:::
@ -303,7 +306,7 @@ table {
6) Print the version number in the `showInfo` method of `resources/js/main.js`:
```js title="resources/js/main.js"
```js title="resources/js/main.js (add highlighted lines)"
function showInfo() {
document.getElementById('info').innerHTML = `
${NL_APPID} is running on port ${NL_PORT} inside ${NL_OS}
@ -408,9 +411,11 @@ npx @neutralinojs/neu build
Platform-specific programs will be created in the `dist` folder:
| Platform | Path to binary |
|:-------------|:-------------------------------------------|
| `darwin-arm` | `./dist/sheetjs-neu/sheetjs-neu-mac_arm64` |
| Platform | Path to binary |
|:-------------|:---------------------------------------------|
| `darwin-arm` | `./dist/sheetjs-neu/sheetjs-neu-mac_arm64` |
| `win11-arm` | `.\dist\sheetjs-neu\sheetjs-neu-win_x64.exe` |
| `linux-arm` | `.\dist\sheetjs-neu\sheetjs-neu-linux_arm64` |
Run the generated app and confirm that Presidential data is displayed.

@ -46,11 +46,11 @@ This demo was tested in the following environments:
| OS and Version | Architecture | RN Platform | Date |
|:---------------|:-------------|:------------|:-----------|
| Windows 10 | `win10-x64` | `v0.73.11` | 2024-03-24 |
| Windows 11 | `win11-x64` | `v0.72.12` | 2023-10-14 |
| Windows 10 | `win10-x64` | `v0.74.6` | 2024-05-28 |
| Windows 11 | `win11-x64` | `v0.74.6` | 2024-05-28 |
| Windows 11 | `win11-arm` | `v0.74.5` | 2024-05-25 |
| MacOS 14.4 | `darwin-x64` | `v0.73.22` | 2024-03-24 |
| MacOS 14.1.2 | `darwin-arm` | `v0.72.11` | 2023-12-01 |
| MacOS 14.5 | `darwin-arm` | `v0.73.30` | 2024-05-28 |
:::
@ -673,7 +673,7 @@ npx -y react-native-macos-init --no-telemetry
:::caution pass
In the most recent x64 test, the build failed due to `visionos` errors:
In some macOS tests, the build failed due to `visionos` errors:
```
[!] Failed to load 'React-RCTFabric' podspec:
@ -686,6 +686,14 @@ This error was resolved by upgrading CocoaPods to `1.15.2`:
sudo gem install cocoapods
```
After upgrading CocoaPods, reinstall the project pods:
```bash
cd macos
pod install
cd ..
```
:::
3) Install the SheetJS library:
@ -704,14 +712,14 @@ Close the running app from the dock and close the Metro terminal window.
:::danger pass
When the demo was last tested on x64, the app failed with a warning
When the demo was last tested, the app failed with a warning
> No bundle URL present.
**As this affects the default app, this is a bug in React Native macOS!**
The production builds work as expected. If there are errors, the recommended
approach is to [make a release build](#production) every time.
The production builds work as expected. If there are errors, click "Dismiss" to
dismiss the error, close the app, and [make a release build](#production).
:::
@ -789,7 +797,6 @@ B) Copy the highlighted lines and paste under `/* Begin PBXFileReference section
4717DC6828CC495400A9BE56 /* RCTDocumentPicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RCTDocumentPicker.h; path = "SheetJSMacOS-macOS/RCTDocumentPicker.h"; sourceTree = "<group>"; };
4717DC6928CC499A00A9BE56 /* RCTDocumentPicker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RCTDocumentPicker.m; path = "SheetJSMacOS-macOS/RCTDocumentPicker.m"; sourceTree = "<group>"; };
// highlight-end
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
```
:::
@ -959,9 +966,9 @@ xcodebuild -workspace macos/SheetJSmacOS.xcworkspace -scheme SheetJSmacOS-macOS
```
When the demo was last tested, the path to the generated app was displayed in
the terminal. Search for `Release/SheetJSmacOS.app` and look for `touch`:
the terminal. Search for `Release/SheetJSmacOS.app` and look for `touch -c`:
```
```text title="Sample result when searching for 'touch -c'"
/usr/bin/touch -c /Users/sheetjs/Library/Developer/Xcode/DerivedData/SheetJSmacOS-abcdefghijklmnopqrstuvwxyzab/Build/Products/Release/SheetJSmacOS.app
```

@ -2,13 +2,43 @@
title: Desktop Applications
pagination_prev: demos/mobile/index
pagination_next: demos/cli/index
hide_table_of_contents: true
---
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
import FrameworkData from '/data/desktop.js'
[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
data from spreadsheets.
Web technologies including JavaScript and HTML can power traditional software.
This demo covers a number of desktop app frameworks. In each demo, we will build
an app that uses SheetJS libraries to read and write spreadsheet files.
## Strategies
There are two different integration strategies. The "WebView" strategy embeds a
mini web browser and adds supporting native components. The "Engine" strategy
uses an embedded JavaScript engine that fits into the desktop app.
### WebView
WebViews are special web browser components designed to be embedded within apps.
As the browser components are available across all major platforms, desktop apps
can use the WebView as the main user interface. This approach allows small teams
to build software that works across operating systems and architectures.
The app is designed in HTML and CSS. [Web Frameworks](/docs/demos/frontend) can
be used but are typically not required.
### Engine
JavaScript engines including [V8](/docs/demos/engines/v8) can be directly added
to traditional desktop software. This approach is explored in greater detail in
the ["JavaScript Engines" demo](/docs/demos/engines/).
## Desktop Apps
Desktop app frameworks bundle a JavaScript engine and a windowing framework to
@ -38,6 +68,12 @@ Frameworks like React Native generate applications that use native UI elements.
:::
## Command-Line Tools
#### Platform Support
The following frameworks have been tested on the following platforms:
<FrameworkData/>
#### Command-Line Tools
**[The exposition has been moved to a separate page.](/docs/demos/cli)**

@ -10,6 +10,9 @@ import TabItem from '@theme/TabItem';
import CodeBlock from '@theme/CodeBlock';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
export const r = {style: {color:"red"}};
export const B = {style: {fontWeight:"bold"}};
With the availability of JS engines and the success of server-side platforms,
it is possible to build standalone command-line tools from JavaScript code.
@ -21,9 +24,8 @@ processors. The ultimate goal is to use SheetJS libraries to generate CSV output
from arbitrary spreadsheet files. The generated command-line tool will accept an
argument, parse the specified workbook, and print CSV rows to the terminal.
>**Sample terminal session**
```bash
$ xlsx-cli.exe pres.numbers
```bash title="Sample terminal session"
> xlsx-cli.exe pres.numbers
Name,Index
Bill Clinton,42
GeorgeW Bush,43
@ -92,9 +94,9 @@ This demo was tested in the following deployments:
| `darwin-x64` | `4.0.0-rc.4` | `14.15.3` | Pre-built | 2024-03-15 |
| `darwin-arm` | `4.0.0-rc.6` | `18.20.3` | Compiled | 2024-05-25 |
| `win10-x64` | `4.0.0-rc.4` | `14.15.3` | Pre-built | 2024-04-18 |
| `win11-arm` | `4.0.0-rc.2` | `20.10.0` | Compiled | 2023-12-01 |
| `win11-arm` | `4.0.0-rc.6` | `20.10.0` | Compiled | 2024-05-28 |
| `linux-x64` | `4.0.0-rc.4` | `14.15.3` | Pre-built | 2024-03-21 |
| `linux-arm` | `4.0.0-rc.2` | `20.10.0` | Compiled | 2023-12-01 |
| `linux-arm` | `4.0.0-rc.6` | `18.20.3` | Compiled | 2024-05-26 |
</TabItem>
<TabItem value="pkg" label="pkg">
@ -104,9 +106,9 @@ This demo was tested in the following deployments:
| `darwin-x64` | `5.8.1` | `18.5.0` | 2024-03-15 |
| `darwin-arm` | `5.8.1` | `18.5.0` | 2024-05-25 |
| `win10-x64` | `5.8.1` | `18.5.0` | 2024-04-18 |
| `win11-arm` | `5.8.1` | `18.5.0` | 2023-12-01 |
| `win11-arm` | `5.8.1` | `18.5.0` | 2024-05-28 |
| `linux-x64` | `5.8.1` | `18.5.0` | 2024-03-21 |
| `linux-arm` | `5.8.1` | `18.5.0` | 2023-12-01 |
| `linux-arm` | `5.8.1` | `18.5.0` | 2024-05-26 |
</TabItem>
<TabItem value="boxednode" label="boxednode">
@ -117,7 +119,7 @@ This demo was tested in the following deployments:
| `darwin-arm` | `2.4.3` | `22.2.0` | 2024-05-25 |
| `win10-x64` | `2.4.2` | `16.20.2` | 2024-04-18 |
| `linux-x64` | `2.4.0` | `21.7.1` | 2024-03-21 |
| `linux-arm` | `2.3.0` | `21.3.0` | 2023-12-01 |
| `linux-arm` | `2.4.3` | `20.13.1` | 2024-05-26 |
</TabItem>
</Tabs>
@ -174,10 +176,23 @@ This generates `xlsx-cli` or `xlsx-cli.exe` depending on platform.
When the demo was tested on ARM targets, the Nexe pre-built packages were
missing. The package must be built from source:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
npx nexe xlsx-cli.js --build --python=$(which python3) --make="-j8"
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
npx nexe xlsx-cli.js --build --make="-j8"
```
</TabItem>
</Tabs>
:::
:::caution pass
@ -266,14 +281,39 @@ Run `boxednode`:
<TabItem value="unix" label="Linux/MacOS">
```bash
npx boxednode@2.4.0 -s xlsx-cli.js -t xlsx-cli
npx boxednode@2.4.3 -s xlsx-cli.js -t xlsx-cli
```
:::caution pass
When this demo was last tested in `linux-arm`, the build failed with an error:
<pre>
../deps/v8/src/base/small-vector.h: In instantiation of <span {...B}>class v8::base::SmallVector&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt;, 16&gt;</span>:
<span {...B}>../deps/v8/src/compiler/turboshaft/loop-unrolling-reducer.h:444:11:</span> required from here
<span {...B}>../deps/v8/src/base/macros.h:206:55:</span> <span style={{...r.style,...B.style}}>error:</span> static assertion failed: T should be trivially copyable
{" 206 |"} static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::<span style={{...r.style,...B.style}}>value</span>, \\
{" |"} ^~~~~
</pre>
This affects NodeJS `22.2.0`, but does not affect `20.13.1`. It affects the
[V8 JavaScript Engine](https://docs.sheetjs.com/docs/demos/engines/v8#build-v8)
and cannot easily be patched using `boxednode`.
The `-n` flag controls the target NodeJS version. For this demo, the following
command uses NodeJS `20.13.1`:
```bash
npx boxednode@2.4.3 -s xlsx-cli.js -t xlsx-cli -n 20.13.1
```
:::
</TabItem>
<TabItem value="win" label="Windows">
```bash
npx boxednode@2.4.0 -s xlsx-cli.js -t xlsx-cli.exe -n 16.20.2
npx boxednode@2.4.3 -s xlsx-cli.js -t xlsx-cli.exe -n 16.20.2
```
:::info pass
@ -374,7 +414,7 @@ This demo was last tested in the following deployments:
| `win10-x64` | `12.3.219.9` | `0.88.0` | 2024-03-24 |
| `win11-x64` | `12.6.228.3` | `0.92.0` | 2024-05-23 |
| `linux-x64` | `12.3.219.9` | `0.88.0` | 2024-03-18 |
| `linux-arm` | `12.0.267.8` | `0.82.0` | 2023-12-01 |
| `linux-arm` | `12.6.228.3` | `0.92.0` | 2024-05-26 |
:::

@ -1,5 +1,6 @@
---
title: Deno Deploy
title: Sheets with Deno Deploy
sidebar_label: Deno Deploy
pagination_prev: demos/local/index
pagination_next: demos/extensions/index
---
@ -27,7 +28,7 @@ When the demo was last tested, Deno Deploy required a GitHub account.
:::note Tested Deployments
This demo was last tested by SheetJS users on 2023 October 18.
This demo was last tested by SheetJS users on 2024 May 26.
:::
@ -87,7 +88,9 @@ class SheetJSResource extends Drash.Resource {
2) If the account never signed into Deno Deploy, click "Continue with Github".
In the next screen, review the prompt and click "Authorize Deno Deploy"
In the next screen, review the prompt and click "Authorize Deno Deploy".
If a welcome screen is displayed, click "I know what I'm doing".
3) Click "New Playground" to create a new Playground.

@ -1,5 +1,6 @@
---
title: Google Sheets
title: Google Sheets Data Interchange
sidebar_label: Google Sheets
pagination_prev: demos/local/index
pagination_next: demos/extensions/index
---
@ -101,7 +102,7 @@ The edit URL starts with `https://docs.google.com/spreadsheets/d/` and includes
```
https://docs.google.com/spreadsheets/d/a_long_string_of_characters/edit#gid=0
---------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^--- ID
|^^^^^^^^^^^^^^^^^^^^^^^^^^^|--- ID
```
The `GoogleSpreadsheet` constructor accepts a document ID and auth object:

@ -6,7 +6,7 @@ pagination_next: demos/extensions/index
---
<head>
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="6msofx0wc1zd7da"></script>
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="v85yuk360zx6nyx"></script>
</head>
[Dropbox](https://www.dropbox.com/) is a file hosting service that offers APIs
@ -34,7 +34,7 @@ their Dropbox account. This demo will generate a XLS workbook using SheetJS.
The Dropbox API script is loaded in this page with
```html
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="6msofx0wc1zd7da"></script>
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="v85yuk360zx6nyx"></script>
```
The `data-app-key` used in this demo is a "Development" key associated with the
@ -212,8 +212,10 @@ The file must be written before the Save button is created.
#### Saver Live Demo
This demo seeds data by fetching a file and writing to HTML table. The generated
table is scraped to create a new workbook that is written to XLS.
This demo starts with an array of arrays of data. When the page loads, the data
is exported to XLSX and a data URI is generated. When the button is clicked, the
data URI is sent to Dropbox and the service will attempt to save the data to
`SheetJSDropbox.xls` in your Dropbox account.
:::caution pass
@ -264,7 +266,7 @@ function SheetJSEnregistrez() {
:::note Tested Deployments
This demo was last tested on 2023 November 30.
This demo was last tested on 2024 May 27.
:::
@ -276,14 +278,14 @@ step can be safely skipped.
1) Create a Dropbox app in the Developer panel.
Click the `᎒᎒᎒` icon > App Center. In the next page, click "Build an App". In
the next page, click "Create Apps".
Click the `᎒᎒᎒` icon > App Center. In the next page, click "Build an App" in the
left sidebar. In the next page, click "Create apps".
In the App creation wizard, select the following options:
- "Choose an API": "Scoped access"
- "Choose the type of access you need": "Full Dropbox"
- "Name": (enter any name) "SheetJS Docs"
- "Name": (enter any name)
:::caution pass
@ -302,7 +304,9 @@ The following permissions should be selected in the "Permissions" tab
- `files.content.write` (Edit content of your Dropbox files and folders)
- `files.content.read` (View content of your Dropbox files and folders)
In the settings tab, under "Chooser / Saver / Embedder domains", the desired
After selecting the permissions, click "Submit".
In the Settings tab, under "Chooser / Saver / Embedder domains", the desired
public domains should be added. `localhost` must also be added for development
use (it is not automatically enabled).

@ -1,5 +1,6 @@
---
title: Google Sheets
title: Google Sheets Script Automation
sidebar_label: Google Sheets
pagination_prev: demos/cloud/index
pagination_next: demos/bigdata/index
sidebar_custom_props:

@ -15,12 +15,12 @@
"make": "electron-forge make"
},
"devDependencies": {
"@electron-forge/cli": "7.3.0",
"@electron-forge/maker-deb": "7.3.0",
"@electron-forge/maker-rpm": "7.3.0",
"@electron-forge/maker-squirrel": "7.3.0",
"@electron-forge/maker-zip": "7.3.0",
"electron": "29.1.4"
"@electron-forge/cli": "7.4.0",
"@electron-forge/maker-deb": "7.4.0",
"@electron-forge/maker-rpm": "7.4.0",
"@electron-forge/maker-squirrel": "7.4.0",
"@electron-forge/maker-zip": "7.4.0",
"electron": "30.0.8"
},
"config": {
"forge": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 131 KiB

@ -70,7 +70,7 @@ try {
</script>
<template>
<div>
<div class="root">
<h1><a href="https://sheetjs.com" target="_blank">
<img src="https://sheetjs.com/sketch128.png" class="logo" alt="SheetJS" />
SheetJS × Tauri {{ ver }}</a></h1>
@ -97,12 +97,90 @@ try {
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #42b883aa);
}
.centre { text-align: center; }
table.center {
margin-left: auto;
margin-right: auto;
}
.root {
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 24px;
font-weight: 400;
color: #0f0f0f;
background-color: #f6f6f6;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
h1 {
text-align: center;
}
input,
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
color: #0f0f0f;
background-color: #ffffff;
transition: border-color 0.25s;
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
}
button {
cursor: pointer;
}
button:hover {
border-color: #396cd8;
}
button:active {
border-color: #396cd8;
background-color: #e8e8e8;
}
input,
button {
outline: none;
}
@media (prefers-color-scheme: dark) {
.root {
color: #f6f6f6;
background-color: #2f2f2f;
}
a:hover {
color: #24c8db;
}
input,
button {
color: #ffffff;
background-color: #0f0f0f98;
}
button:active {
background-color: #0f0f0f69;
}
}
</style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 166 KiB