This commit is contained in:
SheetJS 2023-08-28 18:40:53 -04:00
parent a6aba251e5
commit 57312901e1
20 changed files with 329 additions and 88 deletions

@ -133,8 +133,8 @@ function exportFile() {
:::note
This demo was last run on 2023 April 06 using `vue@3.2.47`. When running
`npm init`, the package `create-vue@3.6.1` was installed.
This demo was last run on 2023 August 27 using `vue@3.3.4`. When running
`npm init`, the package `create-vue@3.7.3` was installed.
:::
@ -209,8 +209,8 @@ function exportFile() {
:::note
This demo was last run on 2023 April 06 using `vue@3.2.47`. When running
`npm init`, the package `create-vue@3.6.1` was installed.
This demo was last run on 2023 August 27 using `vue@3.3.4`. When running
`npm init`, the package `create-vue@3.7.3` was installed.
:::
@ -283,4 +283,4 @@ There is a shared component [`SheetJS-vue.js`](pathname:///vue/SheetJS-vue.js)
The entire demo is designed to run in Internet Explorer and does not reflect
modern design patterns.
:::
:::

@ -1,5 +1,7 @@
---
title: Svelte
title: Sheets in Svelte Sites
sidebar_label: Svelte
description: Build interactive websites with Svelte. Seamlessly integrate spreadsheets into your app using SheetJS. Bring Excel-powered workflows and data to the modern web.
pagination_prev: demos/index
pagination_next: demos/grid/index
sidebar_position: 4
@ -8,17 +10,25 @@ sidebar_position: 4
import current from '/version.js';
import CodeBlock from '@theme/CodeBlock';
Svelte is a JS library for building user interfaces.
[Svelte](https://svelte.dev/) is a JavaScript library for building user
interfaces.
This demo tries to cover common Svelte data flow ideas and strategies. Svelte
familiarity is assumed.
[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
data from spreadsheets.
Other demos cover general Svelte deployments, including:
This demo uses Svelte and SheetJS to process and generate spreadsheets. We'll
explore how to load SheetJS in a Svelte component and compare common state
models and data flow strategies.
:::note pass
This demo focuses on Svelte concepts. Other demos cover general deployments:
- [Static Site Generation powered by SvelteKit](/docs/demos/static/svelte)
- [iOS applications powered by CapacitorJS](/docs/demos/mobile/capacitor)
- [Desktop application powered by Wails](/docs/demos/desktop/wails)
:::
## Installation
@ -122,8 +132,8 @@ function exportFile() {
:::note
This demo was last run on 2023 March 08 using `svelte@3.55.1`. When running
`npm create`, the package `create-vite@4.1.0` was installed.
This demo was last run on 2023 August 27 using `svelte@4.2.0`. When running
`npm create`, the package `create-vite@4.4.1` was installed.
:::
@ -200,8 +210,8 @@ function exportFile() {
:::note
This demo was last run on 2023 March 08 using `svelte@3.55.1`. When running
`npm create`, the package `create-vite@4.1.0` was installed.
This demo was last run on 2023 August 27 using `svelte@4.2.0`. When running
`npm create`, the package `create-vite@4.4.1` was installed.
:::

@ -8,7 +8,7 @@ sidebar_position: 7
import current from '/version.js';
import CodeBlock from '@theme/CodeBlock';
:::warning
:::warning pass
This demo is for the legacy AngularJS framework (version 1).
@ -23,7 +23,7 @@ This demo is for the legacy AngularJS framework (version 1).
:::note
This demo was last run on 2023 April 08 using AngularJS `1.5.0`
This demo was last run on 2023 August 27 using AngularJS `1.8.2`
:::
@ -170,7 +170,7 @@ $scope.exportSheetJS = function() {
<html ng-app="s5s">
<head>
<title>SheetJS + AngularJS</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<script src="https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js"></script>
<script src="https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js"></script>
</head>
@ -269,8 +269,8 @@ The HTML table can be directly exported with `XLSX.utils.table_to_book`:
<html ng-app="s5s">
<head>
<title>SheetJS + AngularJS</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-sanitize.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular-sanitize.js"></script>
<script src="https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js"></script>
<script src="https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js"></script>
</head>

@ -77,6 +77,13 @@ provides ["Worker Threads"](#worker-threads) for this exact use case.
#### Express
:::note
This demo was verified on 2023 August 27 using `express-formidable@1.2.0` and
ExpressJS `4.18.2`
:::
The `express-formidable` middleware is powered by the `formidable` parser. It
adds a `files` property to the request.
@ -132,7 +139,7 @@ app.listen(+process.env.PORT||3000);
1) Install dependencies:
<CodeBlock language="bash">{`\
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz express express-formidable`}
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz express@4.18.2 express-formidable@1.2.0`}
</CodeBlock>
2) Start server (note: it will not print anything to console when running)
@ -158,6 +165,12 @@ It should prompt to download `SheetJSExpress.xlsx`
#### NestJS
:::note
This demo was verified on 2023 August 27 using NestJS `10.2.0` and Multer.
:::
[The NestJS docs](https://docs.nestjs.com/techniques/file-upload) have detailed
instructions for file upload support. In the controller, the `path` property
works with `XLSX.readFile`.
@ -171,7 +184,7 @@ with a CSV output of the first sheet. It will also respond to GET requests to
```ts title="src/sheetjs/sheetjs.controller.js"
import { Controller, Get, Header, Post, StreamableFile, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { readFile, utils } from 'xlsx';
import { readFile, utils, write } from 'xlsx';
@Controller('sheetjs')
export class SheetjsController {
@ -220,7 +233,7 @@ npx @nestjs/cli generate controller sheetjs
```
3) Add `multer` to the new module by editing `src/sheetjs/sheetjs.module.ts`.
Changes are highlighted below:
The highlighted lines should be added to the file:
```ts title="src/sheetjs/sheetjs.module.ts"
import { Module } from '@nestjs/common';
@ -269,7 +282,7 @@ It should prompt to download `SheetJSNest.xlsx`
:::note
This demo was verified on 2023 April 06 using `fastify@4.15.0`
This demo was verified on 2023 August 27 using `fastify@4.22.0`
:::
@ -304,7 +317,7 @@ fastify.post('/', async(req, reply) => {
});
```
:::caution
:::caution pass
Out of the box, Fastify will return an error `FST_ERR_CTP_BODY_TOO_LARGE` when
processing large spreadsheets (`statusCode 413`). This is a Fastify issue.
@ -420,7 +433,7 @@ the main server process. Body parsers like `formidable` will write uploaded
files to the filesystem, and the file path should be passed to the worker (and
the worker would be responsible for reading and cleaning up the files).
:::note
:::note pass
The `child_process` module can also spawn [command-line tools](/docs/demos/cli).
That approach is not explored in this demo.
@ -431,9 +444,8 @@ That approach is not explored in this demo.
:::note
This demo was last tested on 2023 March 14.
Versions: NodeJS 18.15.0 + ExpressJS 4.18.2 + Formidable 2.1.1
This demo was last tested on 2023 August 27 with NodeJS 20.5.1 + ExpressJS
4.18.2 + Formidable 2.1.1
:::

@ -188,16 +188,16 @@ const save_button_callback = async() => {
## Complete Example
:::note pass
:::note
This demo was tested in the following environments:
| OS and Version | Arch | Server | Client | Date |
|:---------------|:-----|:----------|:---------|:-----------|
| macOS 13.4.1 | x64 | `v4.10.0` | `v3.8.2` | 2023-06-28 |
| macOS 13.4.1 | ARM | `v4.10.0` | `v3.8.2` | 2023-06-28 |
| Windows 10 | x64 | `v4.7.0` | `v3.6.0` | 2023-03-19 |
| Linux (HoloOS) | x64 | `v4.7.0` | `v3.6.0` | |
| OS and Version | Arch | Server | Client | Date |
|:---------------|:-----|:----------|:----------|:-----------|
| macOS 13.5.1 | x64 | `v4.13.0` | `v3.11.0` | 2023-08-26 |
| macOS 13.4.1 | ARM | `v4.10.0` | `v3.8.2` | 2023-06-28 |
| Windows 10 | x64 | `v4.13.0` | `v3.11.0` | 2023-08-26 |
| Linux (HoloOS) | x64 | `v4.13.0` | `v3.11.0` | 2023-08-26 |
:::
@ -231,6 +231,13 @@ curl -L -o resources/js/xlsx.full.min.js https://cdn.sheetjs.com/xlsx-${current}
],
```
:::note pass
There may be multiple `nativeAllowList` blocks in the configuration file. The
line must be added to the first block.
:::
4) Set up skeleton app and print version info:
- Replace the contents of `resources/index.html` with the following code:

@ -62,6 +62,7 @@ This demo was tested in the following deployments:
|:-------------|:--------|:------------|:-----------|
| `darwin-x64` | `2.0.1` | `20.1.0` | 2023-05-08 |
| `darwin-arm` | `2.0.1` | `20.2.0` | 2023-06-05 |
| `win10-x64` | `2.1.1` | `16.20.2` | 2023-08-27 |
| `linux-x64` | `2.0.1` | `20.1.0` | 2023-05-08 |
</details>
@ -138,20 +139,76 @@ This generates `xlsx-cli-linux`, `xlsx-cli-macos`, and `xlsx-cli-win.exe` .
Run `boxednode`:
<Tabs groupId="os">
<TabItem value="unix" label="Linux/MacOS">
```bash
npx boxednode@2.0.1 -s xlsx-cli.js -t xlsx-cli
npx boxednode@2.1.1 -s xlsx-cli.js -t xlsx-cli
```
</TabItem>
<TabItem value="win" label="Windows">
```bash
npx boxednode@2.1.1 -s xlsx-cli.js -t xlsx-cli.exe -n 16.20.2
```
:::info pass
The Windows 10 build requires Visual Studio with "Desktop development with C++"
workload, Python 3, and NASM[^1].
:::
:::caution pass
When the demo was last tested on Windows, the build failed:
```
error MSB8020: The build tools for Visual Studio 2019 (Platform Toolset = 'v142') cannot be found. To build using the v142 build tools, please install Visual Studio 2019 build tools.
```
This error was fixed by installing the `v142` build tools through the Visual
Studio installer.
:::
:::caution pass
In the most recent Windows test against NodeJS `20.5.1`, the build failed due
to an issue in the OpenSSL dependency:
```
...\node-v20.5.1\deps\openssl\openssl\crypto\info.c(176,16): error C2153: integer literals must have at least one digit [...\node-v20.5.1\deps\openssl\openssl.vcxproj]
```
SheetJS libraries are compatible with NodeJS versions dating back to `v0.8`. The
workaround is to select NodeJS `v16.20.2` using the `-n` flag. This version was
was chosen since NodeJS `v18` upgraded the OpenSSL dependency.
:::
</TabItem>
</Tabs>
4) Run the generated program, passing `pres.numbers` as the argument. For
</TabItem>
</Tabs>
4) Run the generated program, passing `pres.numbers` as the argument. For
example, `nexe` generates `xlsx-cli` in macOS so the command is:
```bash
./xlsx-cli pres.numbers
```
`nexe` generates `xlsx-cli.exe` in Windows, so the command is:
```powershell
.\xlsx-cli.exe pres.numbers
```
## V8
The [V8](/docs/demos/engines/v8) demo covers standalone programs that embed the
@ -288,3 +345,5 @@ The following demos for JS engines produce standalone programs:
- [QuickJS](/docs/demos/engines/quickjs)
- [Goja](/docs/demos/engines/goja)
- [JavaScriptCore](/docs/demos/engines/jsc)
[^1]: Downloads can be found [at the main NASM project website](https://www.nasm.us/)

@ -1,5 +1,6 @@
---
title: Dropbox
title: Spreadsheets in Dropbox
sidebar_label: Dropbox
pagination_prev: demos/local/index
pagination_next: demos/extensions/index
---
@ -8,12 +9,27 @@ pagination_next: demos/extensions/index
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="4ysmnhy8wtm6k3w"></script>
</head>
Dropbox is a file hosting service that offers APIs for programmatic file access.
[Dropbox](https://www.dropbox.com/) is a file hosting service that offers APIs
for programmatic file access.
[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
data from spreadsheets.
This demo uses SheetJS to read and write spreadsheets stored on Dropbox. We'll
explore two Dropbox API workflows:
- A "Chooser"[^1] application allows users to select files from their Dropbox
accounts. This demo will fetch and parse the selected file.
- A "Saver"[^2] application allows users to save a generated spreadsheet to
their Dropbox account. This demo will generate a XLS workbook using SheetJS.
## Integration Details
"Dropbox Apps" are the standard way to interact with the service. The
["Dropbox App"](#dropbox-app) section describes how this demo was configured.
:::note
:::info pass
The Dropbox API script is loaded in this page with
@ -29,23 +45,59 @@ The `data-app-key` used in this demo is a "Development" key associated with the
The live demos require a Dropbox account.
## Reading Files
### Reading Files
"Chooser" is a small library that lets users select a file from their account.
`Dropbox.createChooseButton` is a function that accepts an options argument and
returns a DOM element that should be added to the page:
### Live Demo
```js
var button = Dropbox.createChooseButton({
/* ... options described below ... */
});
document.appendChild(button);
```
The button must have the following options:
The following options must be set:
- `multiselect: false` ensures only one file can be selected
- `folderselect: false` limits selection to real files
- `linkType: "direct"` ensures the link points to a raw file
- `success` method is called when the user selects a file
When a file is selected, the `success` callback will receive an array of files
(even if `multiselect` is disabled). Each file object has a `link` file which
corresponds to a temporary URL that can be fetched.
The following options are optional:
:::caution
- `extensions: ['.xlsx', '.xls']` limits the file types for selection
#### Chooser Callback
The `success` callback method receives an array of File objects even if only one
file is selected. This file object has the following properties:
- `name` is the name of the selected file
- `link` is a temporary URL that can be fetched
This demo fetches the link using the `fetch` API, parses the raw data using the
SheetJS `read` function[^3] and generates a HTML table using `sheet_to_html`[^4]
```js
async(files) => {
/* get file entry -- note that dropbox API always passes an array */
var file = files[0];
console.log(`Selected ${file.name} ID=${file.id}`);
/* fetch file and parse */
var wb = XLSX.read(await (await fetch(file.link)).arrayBuffer());
/* convert first sheet to HTML table and add to page */
var html = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]]);
console.log(html);
}
```
#### Chooser Live Demo
:::caution pass
If the live demo shows a message
@ -93,9 +145,26 @@ function SheetJSChoisissez() {
}
```
## Writing Files
### Writing Files
:::caution
"Saver" is a small library that lets users save files to their account.
`Dropbox.createSaveButton` is a function that accepts three arguments and
returns a DOM element that should be added to the page:
```js
var button = Dropbox.createSaveButton(url, filename, options);
/* add button to page */
btn.current.appendChild(button);
```
`filename` will be the recommended filename in the Save window.
The options object supports two callbacks: `success` (if the save succeeded) and
`cancel` (if the user cancels without saving).
#### URL
:::caution pass
The Dropbox API was not designed for writing files that are created in the web
browser. The Data URI approach is a neat workaround but should not be used in
@ -104,18 +173,49 @@ using NodeJS and generate a proper URL for Dropbox to fetch.
:::
"Saver" is a small library that lets users save files to their account.
The Dropbox API is designed to fetch data from a user-specified URL. Files are
not included in the request!
### Live Demo
The SheetJS workaround involves the Data URI scheme[^5]. The main steps are:
The file must be written before the Save button is created. Unfortunately the
API does not accept data in the POST body, so the workaround is to create a data
URI by writing with the `base64` type and prepending the URI metadata.
1) Write a workbook using the SheetJS `write`[^6] method. The `type: "base64"`
option instructs the method to return a Base64-encoded string.
```js
/* write XLS workbook (Base64 string) */
const b64 = XLSX.write(workbook, { type: "base64", bookType: "xls" });
```
2) Construct a Data URL by prepending the `data` header:
```js
/* create data URI */
const url = "data:application/vnd.ms-excel;base64," + b64;
```
3) Create a button and add it to the page:
```js
/* create save button using the concise function call */
var button = Dropbox.createSaveButton( url, "SheetJSDropbox.xls", {
success: () => setMsg("File saved successfully!"),
cancel: () => setMsg("User Canceled Selection!"),
});
document.appendChild(button);
```
:::info
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.
:::caution
:::caution pass
If the live demo shows a message
@ -164,25 +264,36 @@ function SheetJSEnregistrez() {
:::note
This demo was last tested on 2023 February 28.
This demo was last tested on 2023 August 26.
:::
This demo requires a "Dropbox app":
0) Create a Dropbox app through the Developer tools. For this demo:
0) Create a Dropbox account and verify the associated email address. This demo
has been tested with a free Dropbox Basic plan account. The app installation
step can be safely skipped.
- "Choose an APU": "Scoped access"
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".
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"
:::caution
:::caution pass
The Dropbox API Terms and Conditions should be reviewed before acceptance.
:::
1) Configure the Dropbox app in the Developer tools.
Click "Create App" to create the app.
2) Configure the Dropbox app in the Developer tools.
The following permissions should be selected in the "Permissions" tab
@ -195,3 +306,14 @@ 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).
For public use, select "Enable Additional Users".
3) Copy the "App key" and add it to the `data-app-key` attribute of the Dropbox
integration script reference.
[^1]: See ["Chooser"](https://www.dropbox.com/developers/chooser) in the Dropbox Developers Documentation
[^2]: See ["Saver"](https://www.dropbox.com/developers/saver) in the Dropbox Developers Documentation
[^3]: See [`read` in "Reading Files"](/docs/api/parse-options)
[^4]: See [`sheet_to_html` in "Utilities"](/docs/api/utilities/html#html-table-output)
[^5]: See ["Data URLs"](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs) in the "MDN web docs"
[^6]: See [`writeFile` in "Writing Files"](/docs/api/write-options)

@ -127,7 +127,7 @@ This demo was tested in the following deployments:
| `11.8.82` | `darwin-x64` | macOS 13.5.1 | `clang 14.0.3` | 2023-08-26 |
| `11.8.82` | `darwin-arm` | macOS 13.5.1 | `clang 14.0.3` | 2023-08-26 |
| `11.8.82` | `win10-x64` | Windows 10 | `CL 19.37.32822` | 2023-08-26 |
| `11.3.244.11` | `linux-x64` | HoloOS 3.4.6 | `gcc 12.2.0` | 2023-05-20 |
| `11.8.82` | `linux-x64` | HoloOS 3.4.8 | `gcc 12.2.0` | 2023-08-26 |
:::
@ -435,7 +435,7 @@ fatal: cannot set up tracking information; starting point 'refs/tags/11.8.82' is
6) Build the static library.
<Tabs groupId="triple">
<TabItem value="darwin-x64" label="Intel Mac">
<TabItem value="darwin-x64" label="Intel Mac / Linux">
```bash
tools/dev/v8gen.py x64.release.sample
@ -504,7 +504,7 @@ treat_warnings_as_errors = false
7) Ensure the sample `hello-world` compiles and runs:
<Tabs groupId="triple">
<TabItem value="darwin-x64" label="Intel Mac">
<TabItem value="darwin-x64" label="Intel Mac / Linux">
```bash
g++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti -lv8_monolith \
@ -572,7 +572,7 @@ cp ~/dev/v8/v8/samples/hello-world.cc .
10) Create symbolic links to the `include` headers and `obj` library folders:
<Tabs groupId="triple">
<TabItem value="darwin-x64" label="Intel Mac">
<TabItem value="darwin-x64" label="Intel Mac / Linux">
```bash
ln -s ~/dev/v8/v8/include

@ -96,6 +96,8 @@ This demo was tested in the following deployments:
|:-------------|:-----------|:-----------|:-----------|
| `darwin-x64` | `28ee0ee` | `1.19.3` | 2023-06-05 |
| `darwin-arm` | `28ee0ee` | `1.20.4` | 2023-06-05 |
| `win10-x64` | `81d7606` | `1.20.2` | 2023-08-27 |
| `linux-x64` | `81d7606` | `1.21.0` | 2023-08-27 |
:::

@ -96,12 +96,13 @@ This demo was tested in the following deployments:
| OpenJDK | Nashorn | Date |
|:--------|:----------------|:-----------|
| 20.0.1 | 15.4 standalone | 2023-05-21 |
| 19.0.2 | 15.4 standalone | 2023-05-21 |
| 17.0.6 | 15.4 standalone | 2023-05-21 |
| 15.0.10 | 15.4 standalone | 2023-05-21 |
| 11.0.19 | Built-in | 2023-05-21 |
| 1.8.0 | Built-in | 2023-05-21 |
| 21-rc34 | 15.4 standalone | 2023-08-28 |
| 20.0.2 | 15.4 standalone | 2023-08-28 |
| 19.0.2 | 15.4 standalone | 2023-08-28 |
| 17.0.8 | 15.4 standalone | 2023-08-28 |
| 15.0.10 | 15.4 standalone | 2023-08-28 |
| 11.0.20 | Built-in | 2023-08-28 |
| 1.8.0 | Built-in | 2023-08-28 |
:::

@ -328,7 +328,7 @@ first worksheet name, and the contents of the first sheet as CSV rows.
:::note
This demo was last tested on 2023 March 11 against QuickJS commit `2788d71`.
This demo was last tested on 2023 August 26 against QuickJS commit `2788d71`.
:::

@ -338,17 +338,32 @@ This demo was tested in the following deployments:
| Architecture | Git Commit | Date |
|:-------------|:-----------|:-----------|
| `darwin-x64` | `70af78b` | 2023-08-02 |
| `darwin-x64` | `70af78b` | 2023-08-27 |
| `darwin-arm` | `869312f` | 2023-06-05 |
| `linux-x64` | `70af78b` | 2023-08-27 |
:::
0) Install build dependencies:
0) Install [dependencies](https://hermesengine.dev/docs/building-and-running/#dependencies)
<details><summary><b>Installation Notes</b> (click to show)</summary>
The official guidance[^5] has been verified in macOS and HoloOS (Linux).
On macOS:
```bash
brew install icu4c cmake ninja
```
On HoloOS (and other Arch Linux distros):
```bash
sudo pacman -Syu cmake git ninja icu python zip readline
```
</details>
1) Make a project directory:
```bash
@ -405,7 +420,7 @@ contents of the first sheet as CSV rows.
:::note
This demo was last tested on 2023 May 30 against Hermes version `0.11.0`.
This demo was last tested on 2023 August 27 against Hermes version `0.11.0`.
:::
@ -469,3 +484,4 @@ If successful, the script will print CSV data from the test file.
[^2]: See ["Workbook Object"](/docs/csf/book)
[^3]: See ["Workbook Object"](/docs/csf/book)
[^4]: See [`sheet_to_csv` in "Utilities"](/docs/api/utilities/csv#csv-output)
[^5]: See ["Dependencies" in "Building and Running"](https://hermesengine.dev/docs/building-and-running/#dependencies) in the Hermes Documentation

@ -71,6 +71,7 @@ This demo was tested in the following deployments:
|:-------------|:---------|:--------|:-----------|
| `darwin-x64` | `2.7.6` | `2.8.1` | 2023-07-24 |
| `darwin-arm` | `2.6.10` | `2.8.1` | 2023-07-24 |
| `linux-x64` | `3.0.4` | `2.8.1` | 2023-08-27 |
:::

@ -123,7 +123,7 @@ This demo was tested in the following deployments:
| `darwin-x64` | `c3ead3f` | 2023-08-26 |
| `darwin-arm` | `c3ead3f` | 2023-08-26 |
| `win10-x64` | `c3ead3f` | 2023-08-26 |
| `linux-x64` | `c3ead3f` | 2023-07-05 |
| `linux-x64` | `c3ead3f` | 2023-08-27 |
:::

@ -102,7 +102,7 @@ write_file("SheetJE.fods", $fods);
:::note
This demo was tested on 2023 February 12 against JE 0.066
This demo was tested on 2023-08-26 against JE 0.066
:::

@ -5,7 +5,7 @@
<head>
<title>SheetJS + AngularJS</title>
<!-- Angular -->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<!-- SheetJS library -->
<script src="https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js"></script>

@ -1,6 +1,15 @@
# Note: The official Hermes documentation includes zero guidance on embedding.
# Tested against commit 70af78ba69391645749b40a3674d7321c4d6177a
MYCC=llvm-g++
POSTAMBLE=-framework CoreFoundation
UNAME__S := $(shell uname -s)
ifeq ($(UNAME__S),Linux)
MYCC=g++
POSTAMBLE=-licuuc -licudata -licuio -licutu -licui18n
endif
.PHONY: doit
doit: sheetjs-hermes
if [ ! -e xlsx.full.min.js ]; then curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js; fi
@ -18,10 +27,17 @@ clean-all: clean
# This sequence was cobbled together by linking against every artifact.
# Some of these lines are likely extraneous
sheetjs-hermes: sheetjs-hermes.cpp init
llvm-g++ $< -o $@ -std=gnu++17 \
$(MYCC) $< -o $@ -std=gnu++17 \
-Ihermes/include/ -Ihermes/API/ -Ihermes/API/jsi -Ihermes/public \
-Lbuild_release/API/hermes/ -lhermesapi -lcompileJS -lsynthTrace -lsynthTraceParser -ltimerStats -ltraceInterpreter \
-Lbuild_release/external/dtoa/ -ldtoa \
-Lbuild_release/API/hermes/ -lsynthTrace -lsynthTraceParser \
-lhermesapi \
-Lbuild_release/lib/VM/ -lhermesVMRuntime \
-Lbuild_release/lib/BCGen/HBC/ -lhermesHBCBackend \
-Lbuild_release/lib/BCGen/ -lhermesBackend \
-Lbuild_release/lib/SourceMap/ -lhermesSourceMap \
-Lbuild_release/lib/Parser/ -lhermesParser \
-Lbuild_release/lib/Platform/Unicode/ -lhermesPlatformUnicode \
-lcompileJS -ltimerStats -ltraceInterpreter \
-Lbuild_release/external/llvh/lib/Demangle/ -lLLVHDemangle \
-Lbuild_release/external/llvh/lib/Support/ -lLLVHSupport \
-Lbuild_release/jsi/ -ljsi \
@ -30,8 +46,6 @@ sheetjs-hermes: sheetjs-hermes.cpp init
-Lbuild_release/lib/ADT -lhermesADT \
-Lbuild_release/lib/AST/ -lhermesAST \
-Lbuild_release/lib/AST2JS/ -lhermesAST2JS \
-Lbuild_release/lib/BCGen/ -lhermesBackend \
-Lbuild_release/lib/BCGen/HBC/ -lhermesHBCBackend \
-Lbuild_release/lib/CompilerDriver/ -lhermesCompilerDriver \
-Lbuild_release/lib/ConsoleHost/ -lhermesConsoleHost \
-Lbuild_release/lib/DependencyExtractor/ -lhermesDependencyExtractor \
@ -39,19 +53,16 @@ sheetjs-hermes: sheetjs-hermes.cpp init
-Lbuild_release/lib/FrontEndDefs/ -lhermesFrontEndDefs \
-Lbuild_release/lib/Inst/ -lhermesInst \
-Lbuild_release/lib/InternalBytecode/ -lhermesInternalBytecode \
-Lbuild_release/lib/Parser/ -lhermesParser \
-Lbuild_release/lib/Platform/ -lhermesPlatform \
-Lbuild_release/lib/Platform/Intl/ -lhermesBCP47Parser \
-Lbuild_release/lib/Platform/Unicode/ -lhermesPlatformUnicode \
-Lbuild_release/lib/Regex/ -lhermesRegex \
-Lbuild_release/lib/SourceMap/ -lhermesSourceMap \
-Lbuild_release/lib/Support/ -lhermesSupport \
-Lbuild_release/lib/VM/ -lhermesVMRuntime \
-Lbuild_release/public/hermes/Public -lhermesPublic \
-Lhermes/external/flowparser/ -lflowparser-mac \
-framework CoreFoundation
-Lbuild_release/external/dtoa/ -ldtoa \
$(POSTAMBLE)
.PHONY: init
init:
if [ ! -e hermes ]; then git clone https://github.com/facebook/hermes.git; cd hermes; git checkout 70af78ba69391645749b40a3674d7321c4d6177a; cd ..; fi
if [ ! -e build_release ]; then cmake -S hermes -B build_release -G Ninja -DCMAKE_BUILD_TYPE=Release; cmake --build ./build_release; fi
if [ ! -e build_release ]; then cmake -S hermes -B build_release -G Ninja -DCMAKE_BUILD_TYPE=Release; cmake --build ./build_release; fi

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB