Demo refresh

This commit is contained in:
SheetJS 2025-05-06 20:21:41 -04:00
parent db305abddb
commit 1b242c12ef
22 changed files with 763 additions and 251 deletions

@ -352,7 +352,7 @@
<Cell><Data ss:Type="String">Python</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>

@ -42,7 +42,7 @@ This demo was tested in the following deployments:
|:-------------|:----------------|:-------|:-------|:-----------|
| `darwin-x64` | Duktape `2.7.0` | 2.2.3 | 3.13.1 | 2025-03-31 |
| `darwin-arm` | Duktape `2.7.0` | 2.2.3 | 3.13.2 | 2025-03-30 |
| `win11-x64` | Duktape `2.7.0` | 2.2.3 | 3.11.8 | 2024-12-21 |
| `win11-x64` | Duktape `2.7.0` | 2.2.3 | 3.11.9 | 2025-04-28 |
| `win11-arm` | Duktape `2.7.0` | 2.2.3 | 3.13.2 | 2025-02-23 |
| `linux-x64` | Duktape `2.7.0` | 1.5.3 | 3.11.7 | 2025-01-01 |
| `linux-arm` | Duktape `2.7.0` | 1.5.3 | 3.11.2 | 2025-02-16 |
@ -203,7 +203,7 @@ DataFrame. The DataFrame will be exported to the binary XLSB spreadsheet format.
:::note pass
The Windows build requires Visual Studio with "Desktop development with C++".
Commands must be run in a "Native Tools Command Prompt" session.
**Commands must be run in a "Native Tools Command Prompt" session.**
:::
@ -215,6 +215,14 @@ python3 -m pip install pandas
:::info pass
On Windows, Python may be available as `python.exe`:
```bash
python.exe -m pip install pandas
```
---
On macOS and Linux, the install command may require root access:
```bash
@ -305,15 +313,13 @@ cd ..
</TabItem>
<TabItem value="win11-x64" label="Windows">
- Download and extract the source tarball. Commands must be run in WSL `bash`:
- Download and extract the source tarball:
```bash
curl -LO https://duktape.org/duktape-2.7.0.tar.xz
tar -xJf duktape-2.7.0.tar.xz
```
(Run `bash`, then run the aforementioned commands, then run `exit` to exit WSL)
- Enter the source folder:
```bash
@ -472,6 +478,17 @@ def eval_file(ctx, path):
python3 SheetJSPandas.py pres.numbers
```
:::info pass
On Windows, Python may be available as `python.exe`:
```bash
python.exe SheetJSPandas.py pres.numbers
```
:::
If successful, the script will display DataFrame metadata:
```
@ -529,7 +546,7 @@ This demo was tested in the following deployments:
|:-------------|:----------------|:--------|:-------|:-----------|
| `darwin-x64` | Duktape `2.7.0` | 1.26.0 | 3.13.1 | 2025-03-31 |
| `darwin-arm` | Duktape `2.7.0` | 1.26.0 | 3.13.2 | 2025-03-30 |
| `win11-x64` | Duktape `2.7.0` | 1.17.1 | 3.11.8 | 2024-12-21 |
| `win11-x64` | Duktape `2.7.0` | 1.28.1 | 3.11.9 | 2025-04-28 |
| `win11-arm` | Duktape `2.7.0` | 1.23.0 | 3.13.2 | 2025-02-23 |
| `linux-x64` | Duktape `2.7.0` | 1.18.0 | 3.11.7 | 2025-01-01 |
| `linux-arm` | Duktape `2.7.0` | 1.22.0 | 3.11.2 | 2025-02-16 |
@ -599,10 +616,18 @@ python3 -m pip install polars
:::info pass
On Windows, Python may be available as `python.exe`:
```bash
python.exe -m pip install polars
```
---
On macOS and Linux, the install command may require root access:
```bash
sudo python3 -m pip install pandas
sudo python3 -m pip install polars
```
:::
@ -662,6 +687,16 @@ cp ../libduktape.* ../SheetJSPandas.py ../sheetjs.py ../*.js ../*.numbers .
python3 SheetJSPandas.py pres.numbers
```
:::info pass
On Windows, Python may be available as `python.exe`:
```bash
python.exe SheetJSPandas.py pres.numbers
```
:::
:::note pass
If the virtual environment was configured in the previous step, run:

@ -377,7 +377,7 @@ This demo was tested in the following deployments:
|:-------------|:--------|:-------|:-----------|
| `darwin-x64` | 0.1.48 | 2.2.6 | 2025-03-31 |
| `darwin-arm` | 0.1.48 | 2.2.12 | 2025-04-24 |
| `win11-x64` | 0.1.48 | 2.0.4 | 2024-10-30 |
| `win11-x64` | 0.1.48 | 2.2.12 | 2025-04-28 |
| `win11-arm` | 0.1.48 | 2.2.1 | 2025-02-23 |
| `linux-x64` | 0.1.48 | 2.0.5 | 2025-01-10 |
| `linux-arm` | 0.1.48 | 2.1.10 | 2025-02-16 |
@ -392,17 +392,17 @@ This demo was tested in the following deployments:
2) Run the script with `--allow-net` and `--allow-write` entitlements:
```bash
deno run --allow-net --allow-write SheetJSDenoDOM.ts
deno run --allow-net --allow-write --allow-import SheetJSDenoDOM.ts
```
The script will create a file `SheetJSDenoDOM.xlsx` that can be opened.
:::caution pass
:::note pass
Deno 2 additionally requires the `--allow-import` entitlement:
In older versions of Deno, the `--allow-import` flag must be omitted:
```bash
deno run --allow-net --allow-write --allow-import SheetJSDenoDOM.ts
deno run --allow-net --allow-write SheetJSDenoDOM.ts
```
:::

@ -56,15 +56,15 @@ This demo was tested in the following environments:
| OS | Device | NS | Date |
|:-----------|:--------------------|:---------|:-----------|
| Android 30 | NVIDIA Shield | `8.7.2` | 2024-06-09 |
| iOS 15.1 | iPad Pro | `8.7.2` | 2024-06-09 |
| Android 30 | NVIDIA Shield | `8.9.2` | 2025-05-06 |
| iOS 15.1 | iPad Pro | `8.9.2` | 2025-05-06 |
**Simulators**
| OS | Device | NS | Dev Platform | Date |
|:-----------|:--------------------|:---------|:-------------|:-----------|
| Android 34 | Pixel 3a | `8.7.2` | `darwin-arm` | 2024-06-09 |
| iOS 17.5 | iPhone SE (3rd gen) | `8.7.2` | `darwin-arm` | 2024-06-09 |
| Android 35 | Pixel 9 Pro XL | `8.9.2` | `darwin-x64` | 2025-05-06 |
| iOS 18.4 | iPhone 16 Pro Max | `8.9.2` | `darwin-x64` | 2025-05-06 |
| Android 35 | Pixel 9 | `8.8.3` | `win11-x64` | 2024-12-21 |
| Android 35 | Pixel 9 | `8.8.3` | `linux-x64` | 2025-01-02 |
@ -78,15 +78,15 @@ NativeScript 8.6.1 split the telemetry into two parts: "usage" and "error". Both
must be disabled separately:
```bash
npx -p nativescript ns usage-reporting disable
npx -p nativescript ns error-reporting disable
npx -y -p nativescript ns usage-reporting disable
npx -y -p nativescript ns error-reporting disable
```
To verify telemetry was disabled:
```bash
npx -p nativescript ns usage-reporting status
npx -p nativescript ns error-reporting status
npx -y -p nativescript ns usage-reporting status
npx -y -p nativescript ns error-reporting status
```
:::
@ -120,6 +120,22 @@ for accessing data and are subject to change in future platform versions.
<details>
<summary><b>Technical Details</b> (click to show)</summary>
**iOS**
The following key/value pairs must be added to `Info.plist`:
```xml title="App_Resources/iOS/Info.plist (add highlighted lines)"
<dict>
<!-- highlight-start -->
<key>UIFileSharingEnabled</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<!-- highlight-end -->
```
---
**Android**
Android security has evolved over the years. In newer Android versions, the
@ -265,8 +281,8 @@ const wb = read(ab);
0) Disable telemetry:
```bash
npx -p nativescript ns usage-reporting disable
npx -p nativescript ns error-reporting disable
npx -y -p nativescript ns usage-reporting disable
npx -y -p nativescript ns error-reporting disable
```
1) Follow the official Environment Setup instructions[^8].
@ -274,14 +290,14 @@ npx -p nativescript ns error-reporting disable
:::caution pass
In previous test runs, NativeScript did not support the latest Android API.
The error message from `npx -p nativescript ns doctor android` clearly stated
The error message from `npx -y -p nativescript ns doctor android` clearly stated
supported versions:
<pre>
<span {...r}></span> No compatible version of the Android SDK Build-tools are installed on your system. You can install any version in the following range: '&gt;=23 &lt;=33'.
</pre>
If NativeScript does not properly supports the latest API level, a previous API
If NativeScript does not properly support the latest API level, an older API
version should be installed using Android Studio.
In a previous test run, the following packages were required:
@ -290,14 +306,14 @@ In a previous test run, the following packages were required:
- `Android SDK Build-Tools` Version `33.0.2`
It is recommended to install the SDK Platform and corresponding Android SDK
Build-Tools for the latest supported API level.ß
Build-Tools for the latest supported API level.
:::
2) Test the local system configuration for Android development:
```bash
npx -p nativescript ns doctor android
npx -y -p nativescript ns doctor android
```
In the last macOS test, the following output was displayed:
@ -316,7 +332,7 @@ In the last macOS test, the following output was displayed:
<span {...g}></span> Javac is installed and is configured properly.
<span {...g}></span> The Java Development Kit (JDK) is installed and is configured properly.
<span {...g}></span> Getting NativeScript components versions information...
<span {...g}></span> Component nativescript has 8.7.2 version and is up to date.
<span {...g}></span> Component nativescript has 8.9.2 version and is up to date.
</pre>
</details>
@ -324,7 +340,7 @@ In the last macOS test, the following output was displayed:
3) Test the local system configuration for iOS development (macOS only):
```bash
npx -p nativescript ns doctor ios
npx -y -p nativescript ns doctor ios
```
In the last macOS test, the following output was displayed:
@ -343,9 +359,9 @@ In the last macOS test, the following output was displayed:
<span {...g}></span> CocoaPods are configured properly.
<span {...g}></span> Your current CocoaPods version is newer than 1.0.0.
<span {...g}></span> Python installed and configured correctly.
<span {...g}></span> Xcode version 15.4.0 satisfies minimum required version 10.
<span {...g}></span> Xcode version 16.3.0 satisfies minimum required version 10.
<span {...g}></span> Getting NativeScript components versions information...
<span {...g}></span> Component nativescript has 8.7.2 version and is up to date.
<span {...g}></span> Component nativescript has 8.9.2 version and is up to date.
</pre>
</details>
@ -355,21 +371,21 @@ In the last macOS test, the following output was displayed:
4) Create a skeleton NativeScript + Angular app:
```bash
npx -p nativescript ns create SheetJSNS --ng
npx -y -p nativescript ns create SheetJSNS --ng
```
5) Launch the app in the android simulator to verify the app:
5) Launch the app in the Android simulator to verify the app:
```bash
cd SheetJSNS
npx -p nativescript ns run android
npx -y -p nativescript ns run android
```
(this may take a while)
Once the simulator launches and the test app is displayed, end the script by
selecting the terminal and pressing <kbd>CTRL</kbd>+<kbd>C</kbd>. On Windows, if
prompted to `Terminate batch job`, type `y` and press Enter.
prompted to `Terminate batch job`, type <kbd>Y</kbd> and press Enter.
:::note pass
@ -381,6 +397,23 @@ Emulator start failed with: No emulator image available for device identifier 'u
:::
:::caution pass
In the most recent test, the build failed with an exception:
```
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by net.rubygrapefruit.platform.internal.NativeLibraryLoader in an unnamed module (file:/Users/sheetjs/.gradle/wrapper/dists/gradle-8.7-bin/bhs2wmbdwecv87pi65oeuq5iu/gradle-8.7/lib/native-platform-0.22-milestone-25.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
```
**The NativeScript Gradle version is incompatible with Java 24!**
It is strongly recommended to roll back to Java 21.
:::
### Add SheetJS
:::note pass
@ -406,11 +439,10 @@ import { Component, OnInit } from '@angular/core'
// ...
export class ItemsComponent implements OnInit {
items: Array<Item>
// highlight-next-line
version = `SheetJS - ${version}`;
constructor(private itemService: ItemService) {}
itemService = inject(ItemService)
page = inject(Page)
// ...
```
@ -428,7 +460,7 @@ in the title of the action bar:
9) End the script and relaunch the app in the Android simulator:
```bash
npx -p nativescript ns run android
npx -y -p nativescript ns run android
```
The title bar should show the version.
@ -449,7 +481,7 @@ The title bar should show the version.
<Button text="Export File" (tap)="export()" style="padding: 10px"></Button>
</StackLayout>
<!-- highlight-end -->
<ListView [items]="items">
<ListView [items]="itemService.items()">
<!-- ... -->
</ListView>
<!-- highlight-next-line -->
@ -458,15 +490,15 @@ The title bar should show the version.
11) Add the `import` and `export` methods in the component script:
```ts title="src/app/item/items.component.ts"
```ts title="src/app/item/items.component.ts (add highlighted lines)"
// highlight-start
import { version, utils, read, write } from 'xlsx';
import { Dialogs, getFileAccess } from '@nativescript/core';
import { Folder, knownFolders, path } from '@nativescript/core/file-system';
// highlight-end
import { Component, OnInit } from '@angular/core'
import { Item } from './item'
import { Component, NO_ERRORS_SCHEMA, inject } from '@angular/core'
import { NativeScriptCommonModule, NativeScriptRouterModule } from '@nativescript/angular'
import { Page } from '@nativescript/core'
import { ItemService } from './item.service'
// highlight-start
@ -476,19 +508,12 @@ function get_url_for_filename(filename: string): string {
}
// highlight-end
@Component({
selector: 'ns-items',
templateUrl: './items.component.html',
})
export class ItemsComponent implements OnInit {
items: Array<Item>
version: string = `SheetJS - ${version}`;
// ...
constructor(private itemService: ItemService) {}
ngOnInit(): void {
this.items = this.itemService.getItems()
}
export class ItemsComponent {
version = `SheetJS - ${version}`;
itemService = inject(ItemService)
page = inject(Page)
// highlight-start
/* Import button */
@ -499,13 +524,14 @@ export class ItemsComponent implements OnInit {
async export() {
}
// highlight-end
}
// ...
```
12) End the script and relaunch the app in the Android simulator:
```bash
npx -p nativescript ns run android
npx -y -p nativescript ns run android
```
Two buttons should appear just below the header:
@ -534,7 +560,7 @@ Two buttons should appear just below the header:
const ws = wb.Sheets[wsname];
/* update table */
this.items = utils.sheet_to_json<Item>(ws);
this.itemService.items.set(utils.sheet_to_json(ws));
} catch(e) { await Dialogs.alert(e.message); }
// highlight-end
}
@ -547,7 +573,7 @@ Two buttons should appear just below the header:
try {
/* create worksheet from data */
const ws = utils.json_to_sheet(this.items);
const ws = utils.json_to_sheet(this.itemService.items());
/* create workbook from worksheet */
const wb = utils.book_new();
@ -569,7 +595,7 @@ Two buttons should appear just below the header:
14) Launch the app in the Android Simulator:
```bash
npx -p nativescript ns run android
npx -y -p nativescript ns run android
```
If the app does not automatically launch, manually open the `SheetJSNS` app.
@ -611,8 +637,8 @@ $bytes = [Convert]::FromBase64String($b64)
After the header row, insert a row and make the following assignments:
- Set cell `A2` to `0`
- Set cell `B2` to `SheetJS` (type `'SheetJS` in the formula bar)
- Set cell `C2` to `Library` (type `'Library` in the formula bar)
- Set cell `B2` to `SheetJS` (type `'SheetJS` in the formula bar)
- Set cell `C2` to `Library` (type `'Library` in the formula bar)
After making the changes, the worksheet should look like the following:
@ -620,8 +646,6 @@ After making the changes, the worksheet should look like the following:
id | name | role
# highlight-next-line
0 | SheetJS | Library
1 | Ter Stegen | Goalkeeper
3 | Piqué | Defender
...
```
@ -671,7 +695,7 @@ Scroll down to ["Fetching Files"](#android-device) for Android device testing.
20) Launch the app in the iOS Simulator:
```bash
npx -p nativescript ns run ios
npx -y -p nativescript ns run ios
```
21) Tap "Export File". A dialog will print where the file was written.
@ -681,8 +705,8 @@ npx -p nativescript ns run ios
After the header row, insert a row and make the following assignments:
- Set cell `A2` to `0`
- Set cell `B2` to `SheetJS` (type `'SheetJS` in the formula bar)
- Set cell `C2` to `Library` (type `'Library` in the formula bar)
- Set cell `B2` to `SheetJS` (type `'SheetJS` in the formula bar)
- Set cell `C2` to `Library` (type `'Library` in the formula bar)
After making the changes, the worksheet should look like the following:
@ -690,8 +714,6 @@ After making the changes, the worksheet should look like the following:
id | name | role
# highlight-next-line
0 | SheetJS | Library
1 | Ter Stegen | Goalkeeper
3 | Piqué | Defender
...
```
@ -704,31 +726,21 @@ The first item in the list will change:
### Fetching Files
25) In `src/app/item/items.component.ts`, make `ngOnInit` asynchronous:
```ts title="src/app/item/items.component.ts (replace existing function)"
async ngOnInit(): Promise<void> {
this.items = await this.itemService.getItems()
}
```
26) Replace `item.service.ts` with the following:
25) Replace `item.service.ts` with the following:
```ts title="src/app/item/item.service.ts"
import { Injectable } from '@angular/core'
import { knownFolders, path, getFileAccess } from '@nativescript/core'
import { getFile } from '@nativescript/core/http';
import { read, utils } from 'xlsx';
import { Injectable, signal, effect } from '@angular/core'
import { knownFolders, path, getFileAccess } from '@nativescript/core';
import { getFile } from '@nativescript/core/http';
import { Item } from './item'
interface IPresident { Name: string; Index: number };
@Injectable({ providedIn: 'root' })
export class ItemService {
private items: Array<Item>;
async getItems(): Promise<Array<Item>> {
items = signal<Item[]>([]);
constructor() { effect(() => { (async() => {
/* fetch https://docs.sheetjs.com/pres.xlsx */
const temp: string = path.join(knownFolders.temp().path, "pres.xlsx");
const ab = await getFile("https://docs.sheetjs.com/pres.xlsx", temp)
@ -736,32 +748,33 @@ export class ItemService {
const wb = read(await getFileAccess().readBufferAsync(ab.path));
/* translate the first worksheet to the required Item type */
const data = utils.sheet_to_json<IPresident>(wb.Sheets[wb.SheetNames[0]]);
return this.items = data.map((pres, id) => ({id, name: pres.Name, role: ""+pres.Index} as Item));
}
/* update state */
this.items.set(data.map((pres, id) => ({id, name: pres.Name, role: ""+pres.Index} as Item)));
})(); }); }
getItem(id: number): Item {
return this.items.filter((item) => item.id === id)[0]
return this.items().find((item) => item.id === id)
}
}
```
27) End the script and relaunch the app in the Android simulator:
26) End the script and relaunch the app in the Android simulator:
```bash
npx -p nativescript ns run android
npx -y -p nativescript ns run android
```
The app should show Presidential data.
### Android Device
28) Connect an Android device using a USB cable.
27) Connect an Android device using a USB cable.
If the device asks to allow USB debugging, tap "Allow".
29) Close any Android / iOS emulators.
28) Close any Android / iOS emulators.
30) Enable "Legacy External Storage" in the Android app. The manifest is stored
29) Enable "Legacy External Storage" in the Android app. The manifest is stored
at `App_Resources/Android/src/main/AndroidManifest.xml`:
```xml title="App_Resources/Android/src/main/AndroidManifest.xml (add highlighted line)"
@ -776,13 +789,13 @@ at `App_Resources/Android/src/main/AndroidManifest.xml`:
android:hardwareAccelerated="true">
```
31) Install the `@nativescript-community/perms` dependency:
30) Install the `@nativescript-community/perms` dependency:
```bash
npm i --save @nativescript-community/perms
```
32) Add the highlighted lines to `items.component.ts`:
31) Add the highlighted lines to `items.component.ts`:
- Import `File` from NativeScript core and `request` from the new dependency:
@ -815,10 +828,10 @@ import { Component, OnInit } from '@angular/core'
} catch(e) { await Dialogs.alert(e.message); }
```
33) Build APK and run on device:
32) Build APK and run on device:
```bash
npx -p nativescript ns run android
npx -y -p nativescript ns run android
```
If the Android emulators are closed and an Android device is connected, the last
@ -839,22 +852,59 @@ file named `SheetJSNS.xls`.
### iOS Device
34) Connect an iOS device using a USB cable
33) Connect an iOS device using a USB cable
35) Close any Android / iOS emulators.
34) Close any Android / iOS emulators.
36) Enable developer code signing certificates:
35) Enable developer code signing certificates:
Open `platforms/ios/SheetJSNS.xcodeproj/project.xcworkspace` in Xcode. Select
the "Project Navigator" and select the "App" project. In the main view, select
"Signing & Capabilities". Under "Signing", select a team in the dropdown menu.
the "Project Navigator" and select `SheetJSNS`. In the main view, select the
`SheetJSNS` target. Click "Signing & Capabilities". Under "Signing", select a
team in the dropdown menu.
:::caution pass
When this demo was last tested, Xcode repeatedly crashed.
The issue was resolved by cleaning the project:
```bash
npx -y -p nativescript ns platform clean ios
```
:::
36) Add the following key/value pairs to `Info.plist`:
```xml title="App_Resources/iOS/Info.plist (add highlighted lines)"
<dict>
<!-- highlight-start -->
<key>UIFileSharingEnabled</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<!-- highlight-end -->
```
37) Run on device:
```bash
npx -p nativescript ns run ios
npx -y -p nativescript ns run ios
```
:::info pass
If this is the first time testing an app on a device, the certificate must be
trusted on the device:
Under "Settings" > "General" > "VPN & Device Management", there should be a
"Apple Development" certificate in the "DEVELOPER APP" section. Select the
certificate and confirm that "SheetJSNS" is listed under "APPS". Tap "Trust ..."
and tap "Trust" in the popup.
:::
<details open>
<summary><b>iOS Device Testing</b> (click to hide)</summary>
@ -863,8 +913,9 @@ connected to the Internet, a list of Presidents should be displayed.
Tap "Export File". The app will show an alert. Tap "OK".
Switch to the "Files" app and open the "Downloads" folder. There should be a new
file named `SheetJSNS.xls`.
Switch to the "Files" app and repeatedly tap "&lt;". In the "Browse" window, tap
"On My iPhone". There should be a new folder named "SheetJSNS". Tap the folder
and look for the file named `SheetJSNS.xls`.
</details>

@ -59,7 +59,7 @@ This demo was tested in the following environments:
|:-----------|:------------------|:--------|:---------|:-------------|:-----------|
| Android 35 | Pixel 9 Pro XL | `3.7.2` | `3.29.2` | `darwin-x64` | 2025-03-31 |
| iOS 18.3 | iPhone 16 Pro Max | `3.7.2` | `3.29.2` | `darwin-x64` | 2025-03-31 |
| Android 35 | Pixel 3a | `3.5.0` | `3.24.0` | `win11-x64` | 2024-08-10 |
| Android 36 | Pixel 9 Pro XL | `3.7.2` | `3.29.3` | `win11-x64` | 2054-04-28 |
:::
@ -244,7 +244,7 @@ Run `flutter doctor` and confirm the following items are checked:
<TabItem value="win" label="Windows">
<pre>
<span {...g}>[✓]</span> Android toolchain - develop for Android devices (Android SDK version 35.0.0)
<span {...g}>[✓]</span> Android toolchain - develop for Android devices (Android SDK version 35.0.1)
</pre>
</TabItem>
@ -260,7 +260,7 @@ Run `flutter doctor` and confirm the following items are checked:
On first run, there may be a warning with "Android toolchain":
```
[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[!] Android toolchain - develop for Android devices (Android SDK version 35.0.1)
! Some Android licenses not accepted. To resolve this, run: flutter doctor
--android-licenses
```
@ -386,9 +386,9 @@ Pixel_9_Pro_XL_API_35 • Pixel 9 Pro XL API 35 • Google • android
There should be at least one `android` emulator:
```
Id • Name • Manufacturer • Platform
Id • Name • Manufacturer • Platform
Pixel_3a_API_35 • Pixel 3a API 35 • Google • android
Pixel_9_Pro_XL • Pixel 9 Pro XL • Google • android
```
</TabItem>
@ -445,14 +445,43 @@ emulator -avd Pixel_9_Pro_XL_API_35
:::note pass
If `emulator` cannot be found, the folder must be added to the system path.
<Tabs groupId="os">
<TabItem value="macos" label="macOS">
On macOS, `~/Library/Android/sdk/emulator/` is the typical location for the
`emulator` binary. If it cannot be found, add the folder to `PATH`:
`emulator` binary:
```bash
export PATH="$PATH":~/Library/Android/sdk/emulator
emulator -avd Pixel_9_Pro_XL_API_35
```
</TabItem>
<TabItem value="win" label="Windows">
The Android SDK folder can be found in the SDK manager in Android Studio. It is
typically `%LOCALAPPDATA%\Android\Sdk`.
If it is not assigned, create a User environment variable named `ANDROID_HOME`
with the value set to the Android SDK folder.
---
There are three folders within the Android SDK folder that should be added to
the User `PATH` environment variable. Each folder holds a different tool:
| Folder | Command-line Tool |
|:------------------------------------------|:------------------|
| `%ANDROID_HOME%\emulator` | `emulator` |
| `%ANDROID_HOME%\cmdline-tools\latest\bin` | `avdmanager` |
| `%ANDROID_HOME%\platform-tools` | `adb` |
</TabItem>
</Tabs>
:::
</details>
@ -645,6 +674,13 @@ flutter -v -d emulator-5554 run
</details>
:::caution pass
In some test runs on low-power devices, it took 20 seconds for the app to fetch
and display data!
:::
:::info Troubleshooting
In some demo runs, the build failed with an Android SDK error:

@ -55,7 +55,7 @@ This demo was tested in the following deployments:
|:-------------|:------------------|:-----------|
| `darwin-x64` | `18.5` (StataNow) | 2025-01-08 |
| `darwin-arm` | `18.5` (StataNow) | 2025-04-24 |
| `win11-x64` | `18.5` (StataNow) | 2024-12-19 |
| `win11-x64` | `18.5` (StataNow) | 2025-04-28 |
| `win11-arm` | `18.5` (StataNow) | 2025-02-23 |
| `linux-x64` | `18.5` (StataNow) | 2025-01-09 |
@ -257,6 +257,22 @@ curl -LO https://www.stata.com/plugins/stplugin.c
curl -LO https://www.stata.com/plugins/stplugin.h
```
:::danger pass
**When this demo was last tested, `stplugin.h` was removed from the website!**
If the official links do not work, the following files should be used:
- [`stplugin.c`](pathname:///stata/stplugin.c)
- [`stplugin.h`](pathname:///stata/stplugin.h)
```bash
curl -LO https://docs.sheetjs.com/plugins/stplugin.c
curl -LO https://docs.sheetjs.com/plugins/stplugin.h
```
:::
4) Download Duktape. In Windows, the following commands should be run in WSL. In
macOS, the commands should be run in the same Terminal session.
@ -463,67 +479,32 @@ The output will show the import result:
(2 vars, 5 obs)
</pre>
20) Open the Data Editor (in Browse or Edit mode) and compare to the screenshot:
20) List the dataset:
```stata
browse Name Index
list Name Index
```
The result should match the following listing:
```
. list Name Index
+----------------------+
| Name Index |
|----------------------|
1. | Bill Clinton 42 |
2. | GeorgeW Bush 43 |
3. | Barack Obama 44 |
4. | Donald Trump 45 |
5. | Joseph Biden 46 |
+----------------------+
```
In the Stata GUI, the Data Editor should match the following screenshot:
![Data Editor showing data from the file](pathname:///stata/data-editor.png)
:::info pass
In the terminal version of Stata, `browse` does not work:
```
. browse Name Index
command browse is unrecognized
r(199);
```
The `codebook` command will display details.
<details>
<summary><b>Expected Output</b> (click to show)</summary>
```text title="Expected output for 80-column terminal windows"
-------------------------------------------------------------------------------
Name Name
-------------------------------------------------------------------------------
Type: String (str12)
Unique values: 5 Missing "": 0/5
Tabulation: Freq. Value
1 "Barack Obama"
1 "Bill Clinton"
1 "Donald Trump"
1 "GeorgeW Bush"
1 "Joseph Biden"
Warning: Variable has embedded blanks.
-------------------------------------------------------------------------------
Index Index
-------------------------------------------------------------------------------
Type: Numeric (byte)
Range: [42,46] Units: 1
Unique values: 5 Missing .: 0/5
Tabulation: Freq. Value
1 42
1 43
1 44
1 45
1 46
```
</details>
:::
[^1]: Run `help import excel` in Stata or see ["import excel"](https://www.stata.com/manuals/dimportexcel.pdf) in the Stata documentation.
[^2]: See [`read` in "Reading Files"](/docs/api/parse-options)

@ -130,7 +130,7 @@ This demo was tested in the following deployments:
|:-------------|:--------|:-----------|
| `darwin-x64` | `2.7.0` | 2025-03-31 |
| `darwin-arm` | `2.7.0` | 2025-02-13 |
| `win11-x64` | `2.7.0` | 2024-12-20 |
| `win11-x64` | `2.7.0` | 2025-04-28 |
| `win11-arm` | `2.7.0` | 2025-02-23 |
| `linux-x64` | `2.7.0` | 2025-04-21 |
| `linux-arm` | `2.7.0` | 2025-02-15 |
@ -692,7 +692,7 @@ The main Duktape code can be added to the Zig build pipeline.
:::note pass
The following explanation was verified against Zig 0.12.0.
The following explanation was verified against Zig 0.14.0.
:::
@ -710,7 +710,7 @@ folder must be added to the include path list:
```
The `duktape.c` source file must be added to the build sequence. For Zig version
0.12.0, Duktape must be compiled with flags `-std=c99 -fno-sanitize=undefined`
0.14.0, Duktape must be compiled with flags `-std=c99 -fno-sanitize=undefined`
and linked against `libc` and `libm`:
```zig title="build.zig"
@ -786,7 +786,7 @@ This demo was tested in the following deployments:
|:-------------|:--------|:---------|:-----------|
| `darwin-x64` | `2.7.0` | `0.14.0` | 2025-03-31 |
| `darwin-arm` | `2.7.0` | `0.13.0` | 2025-02-13 |
| `win11-x64` | `2.7.0` | `0.13.0` | 2024-12-20 |
| `win11-x64` | `2.7.0` | `0.14.0` | 2025-04-28 |
| `win11-arm` | `2.7.0` | `0.13.0` | 2025-02-23 |
| `linux-x64` | `2.7.0` | `0.14.0` | 2025-04-21 |
| `linux-arm` | `2.7.0` | `0.13.0` | 2025-02-15 |
@ -855,8 +855,8 @@ The following commands should be run within WSL bash.
For X64 Windows:
```bash
curl -LO https://ziglang.org/download/0.13.0/zig-windows-x86_64-0.13.0.zip
unzip zig-windows-x86_64-0.13.0.zip
curl -LO https://ziglang.org/download/0.14.0/zig-windows-x86_64-0.14.0.zip
unzip zig-windows-x86_64-0.14.0.zip
```
For ARM64 Windows:

@ -1484,6 +1484,7 @@ This demo was last tested in the following deployments:
|:-------------|:--------------|:---------|:-----------|
| `darwin-x64` | `13.1.201.22` | `3.13.1` | 2025-03-31 |
| `darwin-arm` | `13.1.201.22` | `3.13.2` | 2025-04-24 |
| `win11-x64` | `13.1.201.22` | `3.11.9` | 2025-04-28 |
:::
@ -1548,6 +1549,26 @@ python sheetjs-stpyv8.py pres.xlsx
The script will display CSV rows from the first worksheet. It will also create
`SheetJSSTPyV8.xlsb`, a workbook that can be opened with a spreadsheet editor.
:::caution pass
On Windows, this may fail with a `charmap` error:
```
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 380: character maps to <undefined>
```
`sheetjs-stpyv8.py` must be altered to read `xlsx.full.min.js` with mode `rb`:
```python title="sheetjs-stpyv8.py (edit highlighted line)"
# Read xlsx.full.min.js
# highlight-next-line
with open("xlsx.full.min.js", "rb") as f:
```
:::
## Snapshots
At a high level, V8 snapshots are raw dumps of the V8 engine state. It is much

@ -30,22 +30,23 @@ This demo was tested in the following deployments:
| OpenJDK | Rhino | Date |
|:--------|:---------|:-----------|
| 23.0.1 | `1.7.15` | 2025-01-10 |
| 22.0.2 | `1.7.15` | 2025-01-10 |
| 21.0.5 | `1.7.15` | 2025-01-10 |
| 20.0.2 | `1.7.15` | 2025-01-10 |
| 19.0.2 | `1.7.15` | 2025-01-10 |
| 18.0.2 | `1.7.15` | 2025-01-10 |
| 17.0.13 | `1.7.15` | 2025-01-10 |
| 16.0.2 | `1.7.15` | 2025-01-10 |
| 15.0.2 | `1.7.15` | 2025-01-10 |
| 14.0.2 | `1.7.15` | 2025-01-10 |
| 13.0.2 | `1.7.15` | 2025-01-10 |
| 12.0.2 | `1.7.15` | 2025-01-10 |
| 11.0.25 | `1.7.15` | 2025-01-10 |
| 10.0.2 | `1.7.15` | 2025-01-10 |
| 9.0.4 | `1.7.15` | 2025-01-10 |
| 1.8.0 | `1.7.15` | 2025-01-10 |
| 24.0.1 | `1.7.15` | 2025-05-06 |
| 23.0.2 | `1.7.15` | 2025-05-06 |
| 22.0.2 | `1.7.15` | 2025-05-06 |
| 21.0.7 | `1.7.15` | 2025-05-06 |
| 20.0.2 | `1.7.15` | 2025-05-06 |
| 19.0.2 | `1.7.15` | 2025-05-06 |
| 18.0.2 | `1.7.15` | 2025-05-06 |
| 17.0.15 | `1.7.15` | 2025-05-06 |
| 16.0.1 | `1.7.15` | 2025-05-06 |
| 15.0.10 | `1.7.15` | 2025-05-06 |
| 14.0.2 | `1.7.15` | 2025-05-06 |
| 13.0.2 | `1.7.15` | 2025-05-06 |
| 12.0.1 | `1.7.15` | 2025-05-06 |
| 11.0.27 | `1.7.15` | 2025-05-06 |
| 10 | `1.7.15` | 2025-05-06 |
| 9.0.4 | `1.7.15` | 2025-05-06 |
| 1.8.0 | `1.7.15` | 2025-05-06 |
:::

@ -165,7 +165,7 @@ This demo was tested in the following deployments:
|:-------------|:--------|:-----------|
| `darwin-x64` | `4.2.1` | 2025-03-31 |
| `darwin-arm` | `4.2.0` | 2025-02-13 |
| `win11-x64` | `4.1.0` | 2024-12-20 |
| `win11-x64` | `4.2.2` | 2026-04-28 |
| `win11-arm` | `4.2.0` | 2025-02-23 |
| `linux-x64` | `4.1.0` | 2025-01-09 |
| `linux-arm` | `4.2.0` | 2025-02-15 |
@ -248,7 +248,7 @@ dotnet run
```bash
dotnet nuget add source https://www.myget.org/F/jint/api/v3/index.json
dotnet add package Jint --version 4.2.1
dotnet add package Jint --version 4.2.2
```
To verify Jint is installed, replace `Program.cs` with the following:
@ -283,6 +283,25 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.xlsx`}
</CodeBlock>
:::caution pass
PowerShell `curl` is incompatible with the official `curl` program. The command
may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
```
`curl.exe` must be used instead:
<CodeBlock language="bash">{`\
curl.exe -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
curl.exe -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl.exe -LO https://docs.sheetjs.com/pres.xlsx`}
</CodeBlock>
:::
6) Replace `Program.cs` with the following:
```csharp title="Program.cs"
@ -499,7 +518,7 @@ cp bin/Release/net*/linux-arm64/publish/SheetJSJint .
For Windows 11 x64, the RID is `win-x64` and the command is:
```powershell
copy .\bin\Release\net9.0\win-x64\publish\SheetJSJint.exe .
copy .\bin\Release\net*\win-x64\publish\SheetJSJint.exe .
```
:::caution pass
@ -513,7 +532,7 @@ The system cannot find the path specified.
The correct command was
```powershell
copy .\bin\x64\Release\net9.0\win-x64\publish\SheetJSJint.exe .
copy .\bin\x64\Release\net*\win-x64\publish\SheetJSJint.exe .
```
:::

@ -107,7 +107,7 @@ This demo was tested in the following deployments:
|:-------------|:-----------|:-----------|:-----------|
| `darwin-x64` | `bcd7cc6` | `1.24.1` | 2025-03-31 |
| `darwin-arm` | `5ef83b8` | `1.24.0` | 2025-02-13 |
| `win11-x64` | `79f3a7e` | `1.23.4` | 2024-12-20 |
| `win11-x64` | `bcd7cc6` | `1.24.2` | 2025-04-28 |
| `win11-arm` | `5ef83b8` | `1.24.0` | 2025-02-23 |
| `linux-x64` | `79f3a7e` | `1.22.0` | 2025-01-02 |
| `linux-arm` | `5ef83b8` | `1.19.8` | 2025-02-15 |
@ -141,12 +141,48 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.numbers`}
</CodeBlock>
:::caution pass
PowerShell `curl` is incompatible with the official `curl` program. The command
may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
```
`curl.exe` must be used instead:
<CodeBlock language="bash">{`\
curl.exe -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
curl.exe -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl.exe -LO https://docs.sheetjs.com/pres.numbers`}
</CodeBlock>
:::
2) Download [`SheetGoja.go`](pathname:///goja/SheetGoja.go):
```bash
curl -LO https://docs.sheetjs.com/goja/SheetGoja.go
```
:::caution pass
PowerShell `curl` is incompatible with the official `curl` program. The command
may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
```
`curl.exe` must be used instead:
```bash
curl.exe -LO https://docs.sheetjs.com/goja/SheetGoja.go
```
:::
3) Build the standalone `SheetGoja` binary:
```bash

@ -105,22 +105,23 @@ This demo was tested in the following deployments:
| OpenJDK | Nashorn | Date |
|:--------|:----------------|:-----------|
| 23.0.1 | 15.4 standalone | 2024-12-17 |
| 22.0.2 | 15.4 standalone | 2024-12-17 |
| 21.0.5 | 15.4 standalone | 2024-12-17 |
| 20.0.2 | 15.4 standalone | 2024-12-17 |
| 19.0.2 | 15.4 standalone | 2024-12-17 |
| 18.0.2 | 15.4 standalone | 2024-12-17 |
| 17.0.13 | 15.4 standalone | 2024-12-17 |
| 16.0.1 | 15.4 standalone | 2024-12-17 |
| 15.0.10 | 15.4 standalone | 2024-12-17 |
| 14.0.2 | Built-in | 2024-12-17 |
| 13.0.14 | Built-in | 2024-12-17 |
| 12.0.2 | Built-in | 2024-12-17 |
| 11.0.25 | Built-in | 2024-12-17 |
| 10.0.2 | Built-in | 2024-12-17 |
| 9 | Built-in | 2024-12-17 |
| 1.8.0 | Built-in | 2024-12-17 |
| 24.0.1 | 15.4 standalone | 2025-05-06 |
| 23.0.2 | 15.4 standalone | 2025-05-06 |
| 22.0.2 | 15.4 standalone | 2025-05-06 |
| 21.0.7 | 15.4 standalone | 2025-05-06 |
| 20.0.2 | 15.4 standalone | 2025-05-06 |
| 19.0.2 | 15.4 standalone | 2025-05-06 |
| 18.0.2 | 15.4 standalone | 2025-05-06 |
| 17.0.15 | 15.4 standalone | 2025-05-06 |
| 16.0.1 | 15.4 standalone | 2025-05-06 |
| 15.0.10 | 15.4 standalone | 2025-05-06 |
| 14.0.2 | Built-in | 2025-05-06 |
| 13.0.2 | Built-in | 2025-05-06 |
| 12.0.1 | Built-in | 2025-05-06 |
| 11.0.27 | Built-in | 2025-05-06 |
| 10 | Built-in | 2025-05-06 |
| 9.0.4 | Built-in | 2025-05-06 |
| 1.8.0 | Built-in | 2025-05-06 |
:::

@ -374,7 +374,7 @@ fork, which powers React Native for Windows, does have built-in support[^5]
| Architecture | Git Commit | Date |
|:-------------|:-----------|:-----------|
| `win11-x64` | `4c64b05` | 2024-12-20 |
| `win11-x64` | `254fb48` | 2025-04-28 |
| `win11-arm` | `4c64b05` | 2025-02-23 |
The ["Windows Example"](#windows-example) covers `hermes-windows`.
@ -690,7 +690,7 @@ cd sheetjs-hermes
```bash
git clone https://github.com/microsoft/hermes-windows
cd hermes-windows
git checkout 4c64b05
git checkout 254fb48
cd ..
```
@ -849,7 +849,7 @@ This demo was tested in the following deployments:
|:-------------|:---------|:-----------|
| `darwin-x64` | `0.13.0` | 2025-03-31 |
| `darwin-arm` | `0.13.0` | 2025-04-23 |
| `win11-x64` | `0.13.0` | 2024-12-20 |
| `win11-x64` | `0.13.0` | 2025-04-28 |
| `win11-arm` | `0.13.0` | 2025-02-23 |
| `linux-x64` | `0.13.0` | 2025-04-21 |

@ -89,7 +89,7 @@ This demo was tested in the following deployments:
|:-------------|:---------|:---------|:-----------|
| `darwin-x64` | `2.6.10` | `2.10.0` | 2025-03-31 |
| `darwin-arm` | `2.6.10` | `2.10.0` | 2025-02-13 |
| `win11-x64` | `3.3.6` | `2.10.0` | 2024-12-20 |
| `win11-x64` | `3.3.8` | `2.10.0` | 2025-04-28 |
| `win11-arm` | `3.2.3` | `2.10.0` | 2025-02-23 |
| `linux-x64` | `3.2.3` | `2.10.0` | 2025-04-21 |
| `linux-arm` | `3.1.2` | `2.10.0` | 2025-02-15 |
@ -157,12 +157,47 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.numbers`}
</CodeBlock>
:::caution pass
PowerShell `curl` is incompatible with the official `curl` program. The command
may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
```
`curl.exe` must be used instead:
<CodeBlock language="bash">{`\
curl.exe -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl.exe -LO https://docs.sheetjs.com/pres.numbers`}
</CodeBlock>
:::
3) Download [`ExecSheetJS.rb`](pathname:///execjs/ExecSheetJS.rb):
```bash
curl -LO https://docs.sheetjs.com/execjs/ExecSheetJS.rb
```
:::caution pass
PowerShell `curl` is incompatible with the official `curl` program. The command
may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
```
`curl.exe` must be used instead:
```bash
curl.exe -LO https://docs.sheetjs.com/execjs/ExecSheetJS.rb
```
:::
4) Run the demo:
```bash

@ -134,7 +134,7 @@ This demo was tested in the following deployments:
|:-------------|:-----------|:-----------|
| `darwin-x64` | `36becec` | 2025-03-31 |
| `darwin-arm` | `e26c81f` | 2025-01-13 |
| `win11-x64` | `e26c81f` | 2024-12-19 |
| `win11-x64` | `36becec` | 2025-04-28 |
| `win11-arm` | `e26c81f` | 2025-02-23 |
| `linux-x64` | `e26c81f` | 2025-01-09 |
@ -575,7 +575,7 @@ If successful, the program will print the contents of the first sheet as CSV.
:::note Tested Deployments
This demo was last tested on 2025-03-31 against `ch` commit `36becec`.
This demo was last tested on 2025-04-28 against `ch` commit `36becec`.
:::

@ -106,7 +106,7 @@ This demo was tested in the following deployments:
|:-------------|:---------|:-----------|
| `darwin-x64` | `0.20.0` | 2025-03-31 |
| `darwin-arm` | `0.20.0` | 2025-02-13 |
| `win11-x64` | `0.20.0` | 2024-12-19 |
| `win11-x64` | `0.20.0` | 2025-04-28 |
| `win11-arm` | `0.20.0` | 2025-02-23 |
| `linux-x64` | `0.20.0` | 2025-04-21 |
| `linux-arm` | `0.20.0` | 2025-02-15 |
@ -152,12 +152,47 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.xlsx`}
</CodeBlock>
:::caution pass
PowerShell `curl` is incompatible with the official `curl` program. The command
may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
```
`curl.exe` must be used instead:
<CodeBlock language="bash">{`\
curl.exe -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl.exe -LO https://docs.sheetjs.com/pres.xlsx`}
</CodeBlock>
:::
4) Download [`main.rs`](pathname:///boa/main.rs) and replace `src/main.rs`:
```bash
curl -L -o src/main.rs https://docs.sheetjs.com/boa/main.rs
```
:::caution pass
PowerShell `curl` is incompatible with the official `curl` program. The command
may fail with a parameter error:
```
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
```
`curl.exe` must be used instead:
```bash
curl.exe -L -o src/main.rs https://docs.sheetjs.com/boa/main.rs
```
:::
5) Build and run the app in release mode:
```bash

@ -54,13 +54,14 @@ This demo was tested in the following deployments:
| OpenJDK | GraalJS | Date |
|:--------|:--------|:-----------|
| 23.0.1 | 24.1.1 | 2024-12-17 |
| 22.0.2 | 24.1.1 | 2024-12-17 |
| 21.0.5 | 24.1.1 | 2024-12-17 |
| 20.0.2 | 24.1.1 | 2024-12-17 |
| 19.0.2 | 24.1.1 | 2024-12-17 |
| 18.0.2 | 24.1.1 | 2024-12-17 |
| 17.0.13 | 24.1.1 | 2024-12-17 |
| 24.0.1 | 24.2.1 | 2025-05-06 |
| 23.0.2 | 24.2.1 | 2025-05-06 |
| 22.0.2 | 24.2.1 | 2025-05-06 |
| 21.0.7 | 24.2.1 | 2025-05-06 |
| 20.0.2 | 24.2.1 | 2025-05-06 |
| 19.0.2 | 24.2.1 | 2025-05-06 |
| 18.0.2 | 24.2.1 | 2025-05-06 |
| 17.0.15 | 24.2.1 | 2025-05-06 |
:::
@ -69,14 +70,14 @@ This demo was tested in the following deployments:
0) Download GraalJS and its dependencies:
```bash
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-scriptengine/24.1.1/js-scriptengine-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-language/24.1.1/js-language-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/polyglot/polyglot/24.1.1/polyglot-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/collections/24.1.1/collections-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/truffle/truffle-api/24.1.1/truffle-api-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/nativeimage/24.1.1/nativeimage-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/shadowed/icu4j/24.1.1/icu4j-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/regex/regex/24.1.1/regex-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-scriptengine/24.2.1/js-scriptengine-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-language/24.2.1/js-language-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/polyglot/polyglot/24.2.1/polyglot-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/collections/24.2.1/collections-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/truffle/truffle-api/24.2.1/truffle-api-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/nativeimage/24.2.1/nativeimage-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/shadowed/icu4j/24.2.1/icu4j-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/regex/regex/24.2.1/regex-24.2.1.jar"
```
1) Download the SheetJS Standalone script, shim script and test file. Move all
@ -117,14 +118,14 @@ CSV rows from the first worksheet.
<TabItem value="unix" label="Linux/MacOS">
```bash
java -cp ".:js-scriptengine-24.1.1.jar:js-language-24.1.1.jar:polyglot-24.1.1.jar:collections-24.1.1.jar:truffle-api-24.1.1.jar:nativeimage-24.1.1.jar:icu4j-24.1.1.jar:regex-24.1.1.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
java -cp ".:js-scriptengine-24.2.1.jar:js-language-24.2.1.jar:polyglot-24.2.1.jar:collections-24.2.1.jar:truffle-api-24.2.1.jar:nativeimage-24.2.1.jar:icu4j-24.2.1.jar:regex-24.2.1.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
java -cp ".;js-scriptengine-24.1.1.jar;js-language-24.1.1.jar;polyglot-24.1.1.jar;collections-24.1.1.jar;truffle-api-24.1.1.jar;nativeimage-24.1.1.jar;icu4j-24.1.1.jar;regex-24.1.1.jar" -D"polyglot.js.nashorn-compat=true" SheetJSNashorn pres.xlsx
java -cp ".;js-scriptengine-24.2.1.jar;js-language-24.2.1.jar;polyglot-24.2.1.jar;collections-24.2.1.jar;truffle-api-24.2.1.jar;nativeimage-24.2.1.jar;icu4j-24.2.1.jar;regex-24.2.1.jar" -D"polyglot.js.nashorn-compat=true" SheetJSNashorn pres.xlsx
```
</TabItem>
@ -154,14 +155,14 @@ cd sheethorn
<TabItem value="unix" label="Linux/MacOS">
```bash
java -cp ".:js-scriptengine-24.1.1.jar:js-language-24.1.1.jar:polyglot-24.1.1.jar:collections-24.1.1.jar:truffle-api-24.1.1.jar:nativeimage-24.1.1.jar:icu4j-24.1.1.jar:regex-24.1.1.jar:SheetJSNashorn.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
java -cp ".:js-scriptengine-24.2.1.jar:js-language-24.2.1.jar:polyglot-24.2.1.jar:collections-24.2.1.jar:truffle-api-24.2.1.jar:nativeimage-24.2.1.jar:icu4j-24.2.1.jar:regex-24.2.1.jar:SheetJSNashorn.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
java -cp ".;js-scriptengine-24.1.1.jar;js-language-24.1.1.jar;polyglot-24.1.1.jar;collections-24.1.1.jar;truffle-api-24.1.1.jar;nativeimage-24.1.1.jar;icu4j-24.1.1.jar;regex-24.1.1.jar;SheetJSNashorn.jar" -D"polyglot.js.nashorn-compat=true" SheetJSNashorn pres.xlsx
java -cp ".;js-scriptengine-24.2.1.jar;js-language-24.2.1.jar;polyglot-24.2.1.jar;collections-24.2.1.jar;truffle-api-24.2.1.jar;nativeimage-24.2.1.jar;icu4j-24.2.1.jar;regex-24.2.1.jar;SheetJSNashorn.jar" -D"polyglot.js.nashorn-compat=true" SheetJSNashorn pres.xlsx
```
</TabItem>

@ -0,0 +1,14 @@
/*
stplugin.c, version 3.0
copyright (c) 2003, 2006, 2015 StataCorp LP
*/
#include "stplugin.h"
ST_plugin *_stata_ ;
STDLL pginit(ST_plugin *p)
{
_stata_ = p ;
return(SD_PLUGINVER) ;
}

@ -0,0 +1,246 @@
/*
stplugin.h, version 3.0.0
copyright (c) 2003, 2004, 2006, 2015 StataCorp LP
*/
#if !defined(STPLUGIN_H)
#define STPLUGIN_H
#if !defined(SD_FASTMODE)
#define SD_SAFEMODE
#endif
#define HP9000 1
#define OPUNIX 2
#define APPLEMAC 3
#define STWIN32 4
#ifndef SYSTEM
#define SYSTEM STWIN32
#endif
typedef signed char ST_sbyte ;
typedef unsigned char ST_ubyte ;
typedef int ST_int ;
typedef unsigned ST_unsigned ;
typedef short int ST_int2 ;
typedef int ST_int4 ;
typedef long ST_long ;
typedef unsigned int ST_uint4 ;
typedef float ST_float ;
typedef double ST_double ;
typedef unsigned char ST_boolean ;
typedef int ST_retcode ;
typedef double * ST_dmkey ;
#if !defined(bTrue)
#define bTrue 1
#define bFalse 0
#endif
#define SF_HIWORD(x) ((ST_int2)((ST_int4)(x)>>16))
#define SF_LOWORD(x) ((ST_int2)(x))
#define SF_MAKELONG(x,y) ((ST_int4)(((ST_int2)(x))|((ST_int4)((ST_int2)(y)))<<16))
#if SYSTEM==STWIN32
#if __cplusplus
#define STDLL extern "C" __declspec(dllexport) ST_retcode
#else
#define STDLL extern __declspec(dllexport) ST_retcode
#endif
#endif
#if SYSTEM!=STWIN32
#if SYSTEM==HP9000
#include <dl.h>
#endif
#if SYSTEM==OPUNIX
#include <dlfcn.h>
#endif
#if __cplusplus
#define STDLL extern "C" ST_retcode
#else
#define STDLL ST_retcode
#endif
#define LPSTR char *
#endif
typedef struct {
ST_int type ;
ST_int nel ;
ST_int m ;
ST_int n ;
} ST_matinfo ;
#define SD_PLUGINMAJ 3
#define SD_PLUGINMIN 0
#define SD_PLUGINVER SF_MAKELONG(SD_PLUGINMAJ,SD_PLUGINMIN)
typedef void (* ST_VV) (void) ;
typedef ST_int (* ST_IV) (void) ;
typedef ST_int (* ST_IS) (char *) ;
typedef void (* ST_VU) (ST_ubyte) ;
typedef ST_boolean (* ST_BI) (ST_int) ;
typedef ST_boolean (* ST_BII) (ST_int,ST_int) ;
typedef ST_boolean (* ST_BD) (ST_double) ;
typedef ST_int (* ST_III) (ST_int,ST_int) ;
typedef ST_double (* ST_DII) (ST_int,ST_int) ;
typedef ST_double (* ST_DV) (void) ;
typedef ST_double (* ST_DD) (ST_double) ;
typedef ST_double (* ST_DDD) (ST_double,ST_double) ;
typedef ST_int (* ST_ISS) (char *,char *) ;
typedef ST_int (* ST_ISI) (char *,ST_int) ;
typedef ST_int (* ST_ISSI) (char *,char *,ST_int) ;
typedef void (* ST_VSD) (char *,ST_double) ;
typedef ST_int (* ST_ISD) (char *, ST_double) ;
typedef ST_int (* ST_ISDp) (char *,ST_double *) ;
typedef ST_int (* ST_ISDpIIIII) (char *,ST_int,ST_double *,ST_int,ST_int,ST_int,ST_int,ST_int) ;
typedef ST_int (* ST_ISIID) (char *, ST_int, ST_int, ST_double) ;
typedef ST_int (* ST_ISIIDp) (char *,ST_int,ST_int,ST_double *) ;
typedef ST_int (* ST_ISDpI) (char *,ST_double *,ST_int) ;
typedef void (* ST_VSMip) (char *,ST_matinfo *) ;
typedef ST_int (* ST_IIIDp) (ST_int, ST_int, ST_double *) ;
typedef ST_int (* ST_IIID) (ST_int, ST_int, ST_double) ;
typedef char * (* ST_SSI) (char *,ST_int) ;
typedef char * (* ST_SSSD) (char *,char *,ST_double) ;
typedef char * (* ST_SSSDM) (char *,char *,ST_double, ST_dmkey) ;
typedef ST_int (* ST_IIIS) (ST_int, ST_int, char *) ;
typedef ST_int (* ST_IIISI) (ST_int, ST_int, char *, ST_int) ;
typedef struct {
ST_IS spoutsml ;
ST_IS spoutnosml ;
ST_VV spoutflush ;
ST_VU set_outputlevel ;
ST_ISI get_input ;
ST_IV pollstd ;
ST_IV pollnow ;
ST_SSSD safereforms ;
ST_SSSDM safereforml ;
ST_SSI gettok ;
ST_ISS macresave ;
ST_ISSI macuse ;
ST_ISDp scalaruse ;
ST_ISDp scalarsave ;
ST_ISDpIIIII matrixstore ;
ST_ISDpI matrixload ;
ST_VSMip matrixinfo ;
ST_ISIIDp matrixel ;
ST_int matsize ;
ST_DII data, safedata ;
ST_IV nobs ;
ST_IV nvar ;
ST_double missval ;
ST_BD ismissing ;
ST_ISI stfindvar ;
ST_BI isstr ;
ST_VSD abvarfcn ;
ST_int *stopflag ;
ST_DDD stround ;
ST_DD stsqrt ;
ST_DDD stpow ;
ST_DD stlog ;
ST_DD stexp ;
ST_DV strandom ;
ST_IIID store ;
ST_IIID safestore ;
ST_IIIS sstore ;
ST_BI selobs ;
ST_IV nobs1 ;
ST_IV nobs2 ;
ST_IV nvars ;
ST_IS spouterr ;
ST_ISIIDp safematel ;
ST_ISIID safematstore ;
ST_ISIIDp matel ;
ST_ISIID matstore ;
ST_IIIDp safevdata ;
ST_IIIDp vdata ;
ST_IS colsof ;
ST_IS rowsof ;
ST_ISD scalsave ;
ST_IIIS sdata ;
ST_int2 major ;
ST_int2 minor ;
ST_BI isstrl ;
ST_BII isbinary ;
ST_III sdatalen ;
ST_IIISI strldata ;
} ST_plugin ;
#if __cplusplus
extern "C" ST_plugin *_stata_ ;
#else
extern ST_plugin *_stata_ ;
#endif
STDLL pginit(ST_plugin *p) ;
#define SF_display(a) ((_stata_)->spoutsml((a)))
#define SF_error(a) ((_stata_)->spouterr((a)))
#define SF_poll ((_stata_)->pollstd)
#define SW_stopflag (*((_stata_)->stopflag))
#define SF_macro_save(m,t) ((_stata_)->macresave((m),(t)))
#define SF_macro_use(m,d,l) ((_stata_)->macuse((m),(d),(l)))
#define SF_scal_use(s,d) ((_stata_)->scalaruse((s),(d)))
#define SF_scal_save(s,d) ((_stata_)->scalsave((s),(d)))
#if defined(SD_SAFEMODE)
#define SF_mat_el(s,r,c,d) ((_stata_)->safematel((s),(r),(c),(d)))
#define SF_mat_store(s,r,c,d) ((_stata_)->safematstore((s),(r),(c),(d)))
#else
#define SF_mat_el(s,r,c,d) ((_stata_)->matel((s),(r),(c),(d)))
#define SF_mat_store(s,r,c,d) ((_stata_)->matstore((s),(r),(c),(d)))
#endif
#define SV_matsize ((_stata_)->matsize)
#define SF_col(s) ((_stata_)->colsof((s)))
#define SF_row(s) ((_stata_)->rowsof((s)))
#if defined(SD_SAFEMODE)
#define SF_vdata(i,j,d) ((_stata_)->safevdata((i),(j),(d)))
#define SF_vstore(i,j,v) ((_stata_)->safestore((i),(j),(v)))
#else
#define SF_vdata(i,j,d) ((_stata_)->vdata((i),(j),(d)))
#define SF_vstore(i,j,v) ((_stata_)->store((i),(j),(v)))
#endif
#define SF_nobs ((_stata_)->nobs)
#define SF_in1 ((_stata_)->nobs1)
#define SF_in2 ((_stata_)->nobs2)
#define SF_nvar ((_stata_)->nvar)
#define SF_nvars ((_stata_)->nvars)
#define SF_sstore(i,j,s) ((_stata_)->sstore((i),(j),(s)))
#define SF_sdata(i,j,s) ((_stata_)->sdata((i),(j),(s)))
#define SF_strldata(i,j,s,l) ((_stata_)->strldata((i),(j),(s),(l)))
#define SF_sdatalen(i,j) ((_stata_)->sdatalen((i),(j)))
#define SF_var_is_string(a) ((_stata_)->isstr(a))
#define SF_var_is_strl(a) ((_stata_)->isstrl(a))
#define SF_var_is_binary(i,j) ((_stata_)->isbinary((i),(j)))
#define SV_missval ((_stata_)->missval)
#define SF_is_missing(z) ((_stata_)->ismissing(z))
#define SF_ifobs(z) ((_stata_)->selobs(z))
#endif

@ -5,14 +5,14 @@ rm -rf sheetjs-graaljs
mkdir -p sheetjs-graaljs
cd sheetjs-graaljs
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-scriptengine/24.1.1/js-scriptengine-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-language/24.1.1/js-language-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/polyglot/polyglot/24.1.1/polyglot-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/collections/24.1.1/collections-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/truffle/truffle-api/24.1.1/truffle-api-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/nativeimage/24.1.1/nativeimage-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/shadowed/icu4j/24.1.1/icu4j-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/regex/regex/24.1.1/regex-24.1.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-scriptengine/24.2.1/js-scriptengine-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/js/js-language/24.2.1/js-language-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/polyglot/polyglot/24.2.1/polyglot-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/collections/24.2.1/collections-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/truffle/truffle-api/24.2.1/truffle-api-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/sdk/nativeimage/24.2.1/nativeimage-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/shadowed/icu4j/24.2.1/icu4j-24.2.1.jar"
curl -LO "https://repo1.maven.org/maven2/org/graalvm/regex/regex/24.2.1/regex-24.2.1.jar"
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js
@ -20,19 +20,19 @@ curl -LO https://sheetjs.com/pres.xlsx
curl -LO https://docs.sheetjs.com/nashorn/SheetJSNashorn.java
for n in {17..23}; do
for n in {17..24}; do
export JAVA_HOME=`/usr/libexec/java_home -v $n`
java -version
rm -fr SheetJSNashorn.class SheetJSNashorn.jar sheethorn
javac SheetJSNashorn.java
java -cp ".:js-scriptengine-24.1.1.jar:js-language-24.1.1.jar:polyglot-24.1.1.jar:collections-24.1.1.jar:truffle-api-24.1.1.jar:nativeimage-24.1.1.jar:icu4j-24.1.1.jar:regex-24.1.1.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
java -cp ".:js-scriptengine-24.2.1.jar:js-language-24.2.1.jar:polyglot-24.2.1.jar:collections-24.2.1.jar:truffle-api-24.2.1.jar:nativeimage-24.2.1.jar:icu4j-24.2.1.jar:regex-24.2.1.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
jar -cf SheetJSNashorn.jar SheetJSNashorn.class xlsx.full.min.js shim.min.js
mkdir -p sheethorn
cp *.jar pres.xlsx sheethorn
cd sheethorn
java -cp ".:js-scriptengine-24.1.1.jar:js-language-24.1.1.jar:polyglot-24.1.1.jar:collections-24.1.1.jar:truffle-api-24.1.1.jar:nativeimage-24.1.1.jar:icu4j-24.1.1.jar:regex-24.1.1.jar:SheetJSNashorn.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
java -cp ".:js-scriptengine-24.2.1.jar:js-language-24.2.1.jar:polyglot-24.2.1.jar:collections-24.2.1.jar:truffle-api-24.2.1.jar:nativeimage-24.2.1.jar:icu4j-24.2.1.jar:regex-24.2.1.jar:SheetJSNashorn.jar" -Dpolyglot.js.nashorn-compat=true SheetJSNashorn pres.xlsx
cd -
done

@ -18,7 +18,7 @@ curl -L -o asm-analysis-9.5.jar "https://search.maven.org/remotecontent?filepath
curl -L -o asm-util-9.5.jar "https://search.maven.org/remotecontent?filepath=org/ow2/asm/asm-util/9.5/asm-util-9.5.jar"
# Standalone Nashorn
for n in {15..23}; do
for n in {15..24}; do
echo $n
export JAVA_HOME=`/usr/libexec/java_home -v $n`
echo $JAVA_HOME

@ -42,7 +42,7 @@ public class SheetJSRhino {
}
EOF
for n in 1.8 {9..23}; do
for n in 1.8 {9..24}; do
export JAVA_HOME=`/usr/libexec/java_home -v $n`
java -version
find . -name \*.class | while read x; do rm $x; done