forked from sheetjs/docs.sheetjs.com
		
	ruby+bun
This commit is contained in:
		
							parent
							
								
									4fd04640ae
								
							
						
					
					
						commit
						18bfc66fac
					
				| @ -184,9 +184,10 @@ This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Arch | Electron | Date       | | ||||
| |:---------------|:-----|:---------|:-----------| | ||||
| | macOS 13.5.1   | ARM  | `26.1.0` | 2023-09-03 | | ||||
| | macOS 13.5.1   | x64  | `26.1.0` | 2023-09-03 | | ||||
| | macOS 13.5.1   | ARM  | `26.1.0` | 2023-09-03 | | ||||
| | Windows 10     | x64  | `26.1.0` | 2023-09-03 | | ||||
| | Windows 10     | ARM  | `26.1.0` | 2023-09-24 | | ||||
| | Linux (HoloOS) | x64  | `26.1.0` | 2023-09-03 | | ||||
| | Linux (Debian) | ARM  | `26.1.0` | 2023-09-03 | | ||||
| 
 | ||||
| @ -254,6 +255,13 @@ On Linux, the packaging step may require additional dependencies[^1] | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| When the demo was last tested on Windows ARM, the generated binary targeted x64. | ||||
| The program will run on ARM64 Windows. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| **Testing** | ||||
| 
 | ||||
| 5) Download [the test file `pres.numbers`](https://sheetjs.com/pres.numbers) | ||||
|  | ||||
| @ -109,7 +109,14 @@ input.click(); | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was tested against NW.js 0.78.0 on 2023 July 27. | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Arch | NW.js    | Date       | | ||||
| |:---------------|:-----|:---------|:-----------| | ||||
| | macOS 13.4.1   | x64  | `0.78.0` | 2023-07-27 | | ||||
| | Windows 10     | x64  | `0.78.0` | 2023-07-27 | | ||||
| | Windows 10     | ARM  | `0.80.0` | 2023-09-25 | | ||||
| | Linux (HoloOS) | x64  | `0.78.0` | 2023-07-27 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -122,7 +129,7 @@ This demo was tested against NW.js 0.78.0 on 2023 July 27. | ||||
|   "version": "0.0.0", | ||||
|   "main": "index.html", | ||||
|   "dependencies": { | ||||
|     "nw": "~0.73.0", | ||||
|     "nw": "~0.80.0", | ||||
|     "xlsx": "https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz" | ||||
|   } | ||||
| }`} | ||||
| @ -157,7 +164,7 @@ the file input element to select a spreadsheet and clicking the export button. | ||||
| 5) To build a standalone app, run the builder: | ||||
| 
 | ||||
| ```bash | ||||
| npx -p nw-builder nwbuild --mode=build . | ||||
| npx -p nw-builder nwbuild --mode=build --glob=false --outDir=../out ./ | ||||
| ``` | ||||
| 
 | ||||
| This will generate the standalone app in the `build\sheetjs-nwjs\` folder. | ||||
| This will generate the standalone app in the `..\build\sheetjs-nwjs\` folder. | ||||
| @ -300,7 +300,9 @@ This demo was tested in the following environments: | ||||
| | macOS 12.6.3   | x64  | `v2.5.1` | 2023-08-24 | | ||||
| | macOS 13.5.1   | ARM  | `v2.5.1` | 2023-08-24 | | ||||
| | Windows 10     | x64  | `v2.5.1` | 2023-08-25 | | ||||
| | Windows 11     | ARM  | `v2.6.0` | 2023-09-25 | | ||||
| | Linux (HoloOS) | x64  | `v2.5.1` | 2023-08-25 | | ||||
| | Linux (Debian) | ARM  | `v2.6.0` | 2023-09-25 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -369,7 +371,7 @@ cd sheetjs-wails | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| cd frontend | ||||
| curl -L -o src/assets/logo.png https://sheetjs.com/sketch1024.png | ||||
| curl -o src/assets/logo.png https://sheetjs.com/sketch1024.png | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz | ||||
| cd ..`} | ||||
| </CodeBlock> | ||||
| @ -381,8 +383,8 @@ cd ..`} | ||||
|   `frontend/src/App.svelte` | ||||
| 
 | ||||
| ```bash | ||||
| curl -L -o app.go https://docs.sheetjs.com/wails/app.go | ||||
| curl -L -o frontend/src/App.svelte https://docs.sheetjs.com/wails/App.svelte | ||||
| curl -o app.go https://docs.sheetjs.com/wails/app.go | ||||
| curl -o frontend/src/App.svelte https://docs.sheetjs.com/wails/App.svelte | ||||
| ``` | ||||
| 
 | ||||
| 5) Build the app with | ||||
|  | ||||
| @ -257,8 +257,8 @@ This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS and Version | Arch | Tauri    | Date       | | ||||
| |:---------------|:-----|:---------|:-----------| | ||||
| | macOS 13.4.1   | ARM  | `v1.4.0` | 2023-06-29 | | ||||
| | macOS 13.4.0   | x64  | `v1.4.0` | 2023-06-25 | | ||||
| | macOS 13.4.1   | ARM  | `v1.4.0` | 2023-06-29 | | ||||
| | Windows 10     | x64  | `v1.4.1` | 2023-07-30 | | ||||
| | Linux (HoloOS) | x64  | `v1.4.1` | 2023-07-30 | | ||||
| 
 | ||||
|  | ||||
| @ -199,12 +199,27 @@ This demo was tested in the following environments: | ||||
| | Windows 10     | x64  | `v4.13.0` | `v3.11.0` | 2023-08-26 | | ||||
| | Windows 11     | ARM  | `v4.13.0` | `v3.11.0` | 2023-09-21 | | ||||
| | Linux (HoloOS) | x64  | `v4.13.0` | `v3.11.0` | 2023-08-26 | | ||||
| | Linux (Debian) | ARM  | `v4.13.0` | `v3.11.0` | 2023-09-25 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The app core state will be the HTML table.  Reading files will add the table to | ||||
| the window.  Writing files will parse the table into a spreadsheet. | ||||
| 
 | ||||
| <details><summary><b>Installation Notes</b> (click to show)</summary> | ||||
| 
 | ||||
| NeutralinoJS uses `portable-file-dialogs`[^12] to show open and save dialogs. On | ||||
| Linux, Zenity or KDialog are require. | ||||
| 
 | ||||
| The last Debian test was run on a system using LXDE. KDialog is supported but | ||||
| must be explicitly installed: | ||||
| 
 | ||||
| ```bash | ||||
| sudo apt-get install kdialog | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| 1) Create a new NeutralinoJS app: | ||||
| 
 | ||||
| ```bash | ||||
| @ -383,3 +398,5 @@ Platform-specific programs will be created in the `dist` folder. | ||||
| [^9]: See ["Supported Output Formats"](/docs/api/write-options#supported-output-formats) | ||||
| [^10]: See [`filesystem.writeBinaryFile`](https://neutralino.js.org/docs/api/filesystem/#filesystemwritebinaryfilefilename-data) in the NeutralinoJS documentation | ||||
| [^11]: See ["HTML Table Input" in "Utility Functions"](/docs/api/utilities/html#html-table-input) | ||||
| [^12]: See [the list of supported `portable-file-dialogs`] | ||||
| (https://github.com/samhocevar/portable-file-dialogs#status) | ||||
| @ -43,27 +43,32 @@ This demo was tested in the following deployments: | ||||
| | Architecture | Version | Node Target | Date       | | ||||
| |:-------------|:--------|:------------|:-----------| | ||||
| | `darwin-x64` | `5.8.1` | `18.5.0`    | 2023-05-08 | | ||||
| | `darwin-arm` | `5.8.1` | `18.5.0`    | 2023-06-05 | | ||||
| | `darwin-arm` | `5.8.1` | `18.5.0`    | 2023-09-25 | | ||||
| | `win10-x64`  | `5.8.1` | `18.5.0`    | 2023-05-08 | | ||||
| | `win11-arm`  | `5.8.1` | `18.5.0`    | 2023-09-25 | | ||||
| | `linux-x64`  | `5.8.1` | `18.5.0`    | 2023-05-08 | | ||||
| | `linux-arm`  | `5.8.1` | `18.5.0`    | 2023-09-25 | | ||||
| 
 | ||||
| **`nexe`** | ||||
| 
 | ||||
| | Architecture | Version      | Node Target | Date       | | ||||
| |:-------------|:-------------|:------------|:-----------| | ||||
| | `darwin-x64` | `4.0.0-rc.2` | `14.15.3`   | 2023-05-08 | | ||||
| | `darwin-arm` | `4.0.0-rc.2` | `18.16.0`   | 2023-06-05 | | ||||
| | `darwin-arm` | `4.0.0-rc.2` | `20.7.0`    | 2023-09-25 | | ||||
| | `win10-x64`  | `4.0.0-rc.2` | `14.15.3`   | 2023-05-08 | | ||||
| | `win11-arm`  | `4.0.0-rc.2` | `18.17.1`   | 2023-09-25 | | ||||
| | `linux-x64`  | `4.0.0-rc.2` | `14.15.3`   | 2023-05-08 | | ||||
| | `linux-arm`  | `4.0.0-rc.2` | `20.7.0`    | 2023-09-25 | | ||||
| 
 | ||||
| **`boxednode`** | ||||
| 
 | ||||
| | Architecture | Version | Node Target | Date       | | ||||
| |:-------------|:--------|:------------|:-----------| | ||||
| | `darwin-x64` | `2.0.1` | `20.1.0`    | 2023-05-08 | | ||||
| | `darwin-arm` | `2.0.1` | `20.2.0`    | 2023-06-05 | | ||||
| | `darwin-arm` | `2.1.1` | `20.7.0`    | 2023-09-25 | | ||||
| | `win10-x64`  | `2.1.1` | `16.20.2`   | 2023-08-27 | | ||||
| | `linux-x64`  | `2.0.1` | `20.1.0`    | 2023-05-08 | | ||||
| | `linux-arm`  | `2.1.1` | `20.7.0`    | 2023-09-25 | | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| @ -114,13 +119,19 @@ This generates `xlsx-cli` or `xlsx-cli.exe` depending on platform. | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| When the demo was tested on `darwin-arm`, the `mac-arm64` pre-built package was | ||||
| When the demo was tested on ARM targets, the Nexe pre-built packages were | ||||
| missing.  The package must be built from source: | ||||
| 
 | ||||
| ```bash | ||||
| npx nexe xlsx-cli.js --build --python=$(which python3) --make="-j8" | ||||
| ``` | ||||
| 
 | ||||
| On Windows ARM, the target `windows-arm64-18.17.1` must be specified: | ||||
| 
 | ||||
| ```bash | ||||
| npx nexe xlsx-cli.js --build --python=$(which python3) --make="-j8" --target=windows-arm64-18.17.1 | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|   </TabItem> | ||||
| @ -222,10 +233,10 @@ This demo was last tested in the following deployments: | ||||
| |:-------------|:-------------|:---------|:-----------| | ||||
| | `darwin-x64` | `11.4.183.2` | `0.71.2` | 2023-05-22 | | ||||
| | `darwin-arm` | `11.4.183.2` | `0.71.2` | 2023-05-22 | | ||||
| | `linux-x64`  | `11.4.183.2` | `0.71.2` | 2023-05-23 | | ||||
| | `linux-arm`  | `11.7.439.6` | `0.75.1` | 2023-08-30 | | ||||
| | `win10-x64`  | `11.4.183.2` | `0.71.2` | 2023-05-23 | | ||||
| | `win11-x64`  | `11.7.439.6` | `0.75.1` | 2023-08-31 | | ||||
| | `linux-x64`  | `11.4.183.2` | `0.71.2` | 2023-05-23 | | ||||
| | `linux-arm`  | `11.7.439.6` | `0.75.1` | 2023-08-30 | | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| --- | ||||
| title: GitHub | ||||
| title: Data Processing in GitHub | ||||
| sidebar_label: GitHub | ||||
| pagination_prev: demos/local/index | ||||
| pagination_next: demos/extensions/index | ||||
| --- | ||||
| @ -10,12 +11,29 @@ import CodeBlock from '@theme/CodeBlock'; | ||||
| Many official data releases by governments and organizations include XLSX or | ||||
| XLS files. Unfortunately some data sources do not retain older versions. | ||||
| 
 | ||||
| Git is a popular system for organizing a historical record of source code and | ||||
| changes.  Git can also store and track binary data artifacts. | ||||
| [Git](https://git-scm.com/) is a popular system for organizing a historical | ||||
| record of text files and changes. Git can also store and track spreadsheets. | ||||
| 
 | ||||
| GitHub is a popular host for Git repositories.  GitHub's "Flat Data" project | ||||
| explores storing and comparing versions of structured CSV and JSON data. The | ||||
| official "Excel to CSV"[^1] example uses SheetJS to generate CSV data from files: | ||||
| [GitHub](https://github.com/) hosts Git repositories and provides infrastructure | ||||
| to run scheduled tasks. ["Flat Data"](https://octo.github.com/projects/flat-data) | ||||
| explores storing and comparing versions of structured CSV and JSON data. | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| This demo uses SheetJS in GitHub to process spreadsheet. We'll explore how to | ||||
| fetch and process spreadsheets at regular intervals, and how to keep track of | ||||
| changes over time. | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| ["Excel to CSV"](https://octo.github.com/projects/flat-data#:~:text=Excel) is an | ||||
| official example that pulls XLSX workbooks from an endpoint and uses SheetJS to | ||||
| parse the workbooks and generate CSV files: | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The following diagram depicts the data dance: | ||||
| 
 | ||||
| ```mermaid | ||||
| sequenceDiagram | ||||
| @ -36,17 +54,15 @@ sequenceDiagram | ||||
|   end | ||||
| ``` | ||||
| 
 | ||||
| This demo covers implementation details elided in the official write-up. | ||||
| 
 | ||||
| ## Flat Data | ||||
| 
 | ||||
| As a project from the company, the entire lifecycle uses GitHub offerings: | ||||
| 
 | ||||
| - GitHub offers free hosting for Git repositories | ||||
| - GitHub Actions provide the main engine for running tasks at regular intervals | ||||
| - `githubocto/flat` Action to help fetch data and automate post-processing | ||||
| - `flat-postprocessing` Post-processing helper functions and examples | ||||
| - "Flat Viewer": Web viewer for structured CSV and JSON data on GitHub | ||||
| - GitHub Actions[^1] infrastructure runs tasks at regular intervals | ||||
| - `githubocto/flat`[^2] Action to help fetch data and automate post-processing | ||||
| - `flat-postprocessing`[^3] Post-processing helper functions and examples | ||||
| - "Flat Viewer"[^4]: Web viewer for structured CSV and JSON data on GitHub | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| @ -118,14 +134,22 @@ import * as XLSX from 'https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs' | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 
 | ||||
| The official Deno registry is out of date. This is a known registry bug. | ||||
| See [the "Deno" installation section](/docs/getting-started/installation/deno) | ||||
| for more details. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| #### Post-Process Script | ||||
| 
 | ||||
| The first argument to the post-processing script is the filename.  The file can | ||||
| be read with `XLSX.readFile` directly. `XLSX.utils.sheet_to_csv` generates CSV: | ||||
| The first argument to the post-processing script is the filename. | ||||
| 
 | ||||
| The SheetJS `readFile` method[^5] will read the file and generate a SheetJS | ||||
| workbook object[^6]. After extracting the first worksheet, `sheet_to_csv`[^7] | ||||
| generates a CSV string. | ||||
| 
 | ||||
| After generating a CSV string, the string should be written to the filesystem | ||||
| using `Deno.writeFileSync`[^8]. By convention, the CSV should preserve the file | ||||
| name stem and replace the extension with `.csv`: | ||||
| 
 | ||||
| <CodeBlock title="postprocess.ts" language="ts">{`\ | ||||
| // @deno-types="https://cdn.sheetjs.com/xlsx-${current}/package/types/index.d.ts" | ||||
| @ -157,10 +181,20 @@ Deno.writeFileSync(out_file, new TextEncoder().encode(csv));`} | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This was last tested on 2023 April 06 using the GitHub UI. | ||||
| This was last tested by SheetJS users on 2023 September 24 using the GitHub UI. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| <https://github.com/SheetJS/flat-sheet> is an example from a previous test. The | ||||
| Flat Viewer URL for the repo is <https://flatgithub.com/SheetJS/flat-sheet/> | ||||
| 
 | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Create Project | ||||
| 
 | ||||
| 0) Create a free GitHub account or sign into the GitHub web interface. | ||||
| 
 | ||||
| 1) Create a new repository (click the "+" icon in the upper-right corner). | ||||
| @ -172,6 +206,8 @@ This was last tested on 2023 April 06 using the GitHub UI. | ||||
| 
 | ||||
| You will be redirected to the new project. | ||||
| 
 | ||||
| ### Add Code | ||||
| 
 | ||||
| 2) In the browser URL bar, change "github.com" to "github.dev". For example, if | ||||
|    the URL was originally `https://github.com/SheetJS/flat-sheet` , the new URL | ||||
|    should be `https://github.dev/SheetJS/flat-sheet` . Press Enter. | ||||
| @ -244,6 +280,8 @@ jobs: | ||||
| 
 | ||||
| 6) Click the `☰` icon and click "Go to Repository" to return to the repo page. | ||||
| 
 | ||||
| ### Test Action | ||||
| 
 | ||||
| 7) Click "Settings" to see the repository settings. In the left column, click | ||||
|    "Actions" to expand the submenu and click "General". | ||||
| 
 | ||||
| @ -262,16 +300,28 @@ jobs: | ||||
| 9) Click "Code" to return to the main view.  It should have a file listing that | ||||
|    includes `data.xlsx` (downloaded file) and `data.csv` (generated data) | ||||
| 
 | ||||
|    Now repeat step 7 to run the action a second time.  Click "Code" again. | ||||
| 10) Repeat step 8 to run the action a second time.  Click "Code" again. | ||||
| 
 | ||||
| 10) Go to the URL bar and change "github.com" to "flatgithub.com".  For example, | ||||
| ### Viewer | ||||
| 
 | ||||
| 11) Go to the URL bar and change "github.com" to "flatgithub.com".  For example, | ||||
|    if the URL was originally `https://github.com/SheetJS/flat-sheet` , the new | ||||
|    URL should be `https://flatgithub.com/SheetJS/flat-sheet` . Press Enter. | ||||
| 
 | ||||
|    You will see the "Flat Viewer".  In the top bar, the "Commit" option allows | ||||
|    for switching to an older version of the data. | ||||
| 
 | ||||
|    The update process will run once an hour.  If you return in a few hours and | ||||
|    refresh the page, there should be more commits in the selection list. | ||||
|    The following screenshot shows the viewer in action: | ||||
| 
 | ||||
| [^1]: See ["Excel to CSV"](https://githubnext.com/projects/flat-data#:~:text=View%20code-,Excel,-to%20CSV) in the "Flat Data" writeup | ||||
|  | ||||
| 
 | ||||
|    The column chart in the Index column is a histogram. | ||||
| 
 | ||||
| [^1]: See ["GitHub Actions documentation"](https://docs.github.com/en/actions) | ||||
| [^2]: See [`githubocto/flat`](https://github.com/githubocto/flat) repo on GitHub. | ||||
| [^3]: See [`githubocto/flat-postprocessing`](https://github.com/githubocto/flat-postprocessing) repo on GitHub. | ||||
| [^4]: The hosted version is available at <https://flatgithub.com/> | ||||
| [^5]: See [`readFile` in "Reading Files"](/docs/api/parse-options) | ||||
| [^6]: See ["Workbook Object"](/docs/csf/book) | ||||
| [^7]: See [`sheet_to_csv` in "CSV and Text"](/docs/api/utilities/csv#delimiter-separated-output) | ||||
| [^8]: See [`Deno.writeFileSync`](https://deno.land/api?s=Deno.writeFileSync) in the Deno Runtime APIs documentation. | ||||
| @ -1,5 +1,7 @@ | ||||
| --- | ||||
| title: Photoshop and InDesign | ||||
| title: Sheets in Photoshop and InDesign | ||||
| sidebar_label: Photoshop and InDesign | ||||
| description: Design documents using InDesign and Photoshop. Leverage spreadsheet data in app extensions using SheetJS. Use your Excel spreadsheets without leaving your Adobe apps. | ||||
| pagination_prev: demos/cloud/index | ||||
| pagination_next: demos/bigdata/index | ||||
| --- | ||||
| @ -9,21 +11,27 @@ import Tabs from '@theme/Tabs'; | ||||
| import TabItem from '@theme/TabItem'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| Photoshop, InDesign and other Adobe Creative Suite applications offer extension | ||||
| support.  Over the years there have been a few different JavaScript platforms: | ||||
| Adobe Creative Suite[^1] applications, including the Photoshop graphics editor | ||||
| and InDesign desktop publishing software, support JavaScript-based extensions. | ||||
| 
 | ||||
| - "ExtendScript": This uses an old JavaScript dialect but is supported in older | ||||
|   versions of Creative Suite and Creative Cloud. | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| - "Common Extensibility Platform" (CEP): This was introduced in Creative Suite. | ||||
|   App automation uses ExtendScript, but integration logic uses modern JS. | ||||
| This demo uses SheetJS in Creative Suite extensions to import data from | ||||
| spreadsheet files and export data to spreadsheets. We'll explore how to use | ||||
| SheetJS scripts in extensions and programmatically interact with documents. | ||||
| 
 | ||||
| - "Unified Extensibility Platform" (UXP): This is the current recommendation for | ||||
|   new Adobe CC extensions in supported apps (Photoshop 2021+ and InDesign 2022+) | ||||
| This demo explores three different JavaScript platforms supported in various | ||||
| versions of Photoshop and InDesign: | ||||
| 
 | ||||
| This demo intends to cover parts relevant to SheetJS.  General setup as well as | ||||
| general Adobe considerations are not covered here.  A basic familiarity with | ||||
| extension development is assumed. | ||||
| - ["ExtendScript"](#extendscript): The ExtendScript platform uses a nonstandard | ||||
|   JavaScript dialect. It is the only option in older versions of Creative Suite. | ||||
| 
 | ||||
| - ["Common Extensibility Platform" (CEP)](#cep): This was introduced in Creative | ||||
|   Suite. App automation uses ExtendScript, but integration logic uses modern JS. | ||||
| 
 | ||||
| - ["Unified Extensibility Platform" (UXP)](#uxp): This platform supports modern | ||||
|   JavaScript but has limited support (Photoshop 2021+ and InDesign 2022+) | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| @ -31,10 +39,10 @@ This demo was verified in the following deployments: | ||||
| 
 | ||||
| | App       | Platform     | Date       | | ||||
| |:----------|:-------------|:-----------| | ||||
| | Photoshop | ExtendScript | 2023-04-15 | | ||||
| | InDesign  | ExtendScript | 2023-04-15 | | ||||
| | InDesign  | CEP          | 2023-04-30 | | ||||
| | InDesign  | UXP          | 2023-05-02 | | ||||
| | Photoshop | ExtendScript | 2023-09-24 | | ||||
| | InDesign  | ExtendScript | 2023-09-24 | | ||||
| | InDesign  | CEP          | 2023-09-24 | | ||||
| | InDesign  | UXP          | 2023-09-24 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -49,13 +57,13 @@ be included from a script in the same directory: | ||||
| 
 | ||||
| ### Reading Files | ||||
| 
 | ||||
| `XLSX.readFile` can directly accept an absolute URI: | ||||
| The SheetJS `readFile`[^2] method can directly accept an absolute URI: | ||||
| 
 | ||||
| ```js | ||||
| var workbook = XLSX.readFile("~/Documents/test.xlsx"); | ||||
| ``` | ||||
| 
 | ||||
| The path can be user-configurable using `File.openDialog`: | ||||
| `File.openDialog` shows a file picker and returns a path: | ||||
| 
 | ||||
| ```js | ||||
| /* Show File Picker */ | ||||
| @ -77,15 +85,13 @@ author (`activeDocument.info.author`) will be changed accordingly. | ||||
| 
 | ||||
| 0) Download the [test workbook](pathname:///files/SheetJS.xlsb). | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 1) Download the following scripts and move to the scripts directory[^3]: | ||||
| 
 | ||||
| <ul> | ||||
| <li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.extendscript.js`}><code>xlsx.extendscript.js</code></a></li> | ||||
| <li><a href={`https://docs.sheetjs.com/extendscript/parse.jsx`}><code>parse.jsx</code></a></li> | ||||
| </ul> | ||||
| 
 | ||||
| and place in the scripts directory. | ||||
| 
 | ||||
| 2) Restart Photoshop and open a file (or create a new one) | ||||
| 
 | ||||
| 3) File > Scripts > parse and select the test workbook | ||||
| @ -108,19 +114,15 @@ the Layers window is "Title")  will be set to the name of the first worksheet. | ||||
| - The data from the first sheet will be added to the "Table Frame" TextFrame. | ||||
| 
 | ||||
| 0) Download the [test workbook](https://sheetjs.com/pres.xlsx) and | ||||
| [InDesign template](pathname:///extendscript/Template.indd) | ||||
| [InDesign template](pathname:///extendscript/Template.idml) | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 1) Download the following scripts and move to the scripts directory[^4]: | ||||
| 
 | ||||
| <ul> | ||||
| <li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.extendscript.js`}><code>xlsx.extendscript.js</code></a></li> | ||||
| <li><a href={`https://docs.sheetjs.com/extendscript/esidparse.jsx`}><code>esidparse.jsx</code></a></li> | ||||
| </ul> | ||||
| 
 | ||||
| 
 | ||||
| Move to the scripts directory. To find the directory, activate Scripts panel | ||||
| (Windows > Utilities > Scripts), click `☰`, and select "Reveal in Explorer". | ||||
| 
 | ||||
| 2) Open the template | ||||
| 
 | ||||
| 3) Activate the Scripts panel.  Expand the "User" folder and double-click | ||||
| @ -137,13 +139,13 @@ A new table will be added and the title will be the name of the first worksheet. | ||||
| 
 | ||||
| ### Writing Files | ||||
| 
 | ||||
| `XLSX.writeFile` can directly accept an absolute URI: | ||||
| The SheetJS `writeFile`[^5] method can directly accept an absolute URI: | ||||
| 
 | ||||
| ```js | ||||
| XLSX.writeFile(workbook, "~/Documents/test.xlsx"); | ||||
| ``` | ||||
| 
 | ||||
| The path can be user-configurable using `File.saveDialog`: | ||||
| `File.saveDialog` shows a save picker and returns a path: | ||||
| 
 | ||||
| ```js | ||||
| /* Show File Picker */ | ||||
| @ -164,15 +166,13 @@ selected, the library will create a new workbook with one worksheet.  Cell `A1` | ||||
| will be "Author" and cell `B1` will be the active Photoshop document Author. | ||||
| The PS author is available as `activeDocument.info.author`. | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 1) Download the following scripts and move to the scripts directory[^6]: | ||||
| 
 | ||||
| <ul> | ||||
| <li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.extendscript.js`}><code>xlsx.extendscript.js</code></a></li> | ||||
| <li><a href={`https://docs.sheetjs.com/extendscript/write.jsx`}><code>write.jsx</code></a></li> | ||||
| </ul> | ||||
| 
 | ||||
| and place in the scripts directory. | ||||
| 
 | ||||
| 2) Restart Photoshop and open a file (or create a new one) | ||||
| 
 | ||||
| 3) File > File Info ... and confirm there is an Author. If not, set to `SheetJS` | ||||
| @ -193,18 +193,15 @@ In this example, the script will show a dialog to select an output file.  Once | ||||
| selected, the library will scan all text frames for table objects.  Each table | ||||
| object will be scanned and a new worksheet will be created. | ||||
| 
 | ||||
| 0) Download the [InDesign document](pathname:///extendscript/Filled.indd) | ||||
| 0) Download the [InDesign document](pathname:///extendscript/Filled.idml) | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 1) Download the following scripts and move to the scripts directory[^7]: | ||||
| 
 | ||||
| <ul> | ||||
| <li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.extendscript.js`}><code>xlsx.extendscript.js</code></a></li> | ||||
| <li><a href={`https://docs.sheetjs.com/extendscript/esidwrite.jsx`}><code>esidwrite.jsx</code></a></li> | ||||
| </ul> | ||||
| 
 | ||||
| Move to the scripts directory. To find the directory, activate Scripts panel | ||||
| (Windows > Utilities > Scripts), click `☰`, and select "Reveal in Explorer". | ||||
| 
 | ||||
| 2) Open the document. | ||||
| 
 | ||||
| 3) Activate the Scripts panel.  Expand the "User" folder and double-click | ||||
| @ -221,9 +218,9 @@ and compare to the InDesign doc. | ||||
| 
 | ||||
| ## CEP | ||||
| 
 | ||||
| [The standalone scripts](/docs/getting-started/installation/standalone) can be | ||||
| added to CEP extension HTML.  It should be downloaded from the CDN and included | ||||
| in the extension. | ||||
| The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) | ||||
| can be added to CEP extension HTML.  It should be downloaded from the CDN and | ||||
| included in the extension. | ||||
| 
 | ||||
| For performing file operations in CEP extensions, NodeJS is not required!  The | ||||
| manifest must include the following flags to enable `cep.fs`: | ||||
| @ -235,10 +232,14 @@ manifest must include the following flags to enable `cep.fs`: | ||||
| </CEFCommandLine> | ||||
| ``` | ||||
| 
 | ||||
| The Base64 encoding is compatible with `type: "base64"`. | ||||
| 
 | ||||
| ### Reading Files | ||||
| 
 | ||||
| The second argument to `cep.fs.readFile` is an encoding. `cep.encoding.Base64` | ||||
| instructs the method to return a Base64-encoded string. | ||||
| 
 | ||||
| The SheetJS `read` method[^8], with the option `type: "base64"`[^9], can parse | ||||
| Base64 strings and return SheetJS workbook objects. | ||||
| 
 | ||||
| The typical flow is to read data from CEP and pass the data into the host | ||||
| ExtendScript context. The following snippet parses a workbook: | ||||
| 
 | ||||
| @ -259,10 +260,7 @@ const wb = XLSX.read(data.data, { type: "base64" }); | ||||
| 0) Download [`com.sheetjs.data.zip`](pathname:///extendscript/com.sheetjs.data.zip) | ||||
| and extract to a `com.sheetjs.data` subdirectory. | ||||
| 
 | ||||
| 1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder: | ||||
| 
 | ||||
| - Windows `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\` | ||||
| - Macintosh `/Library/Application\ Support/Adobe/CEP/extensions` | ||||
| 1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder[^10]. | ||||
| 
 | ||||
| If prompted, give administrator privileges. | ||||
| 
 | ||||
| @ -284,9 +282,15 @@ After "success" popup, the first worksheet should be written to the file. | ||||
| 
 | ||||
| ### Writing Files | ||||
| 
 | ||||
| The SheetJS `write` method[^11], with the option `type: "base64"`[^12], can | ||||
| generate spreadsheet files encoded as Base64 strings. | ||||
| 
 | ||||
| The third argument to `cep.fs.writeFile` is an encoding. `cep.encoding.Base64` | ||||
| instructs the method to interpret the data as a Base64-encoded string. | ||||
| 
 | ||||
| The typical flow is to invoke a function with `CSInterface#evalScript` that | ||||
| returns data from the host ExtendScript context. The callback should build the | ||||
| workbook and initiate a file save. The following snippet saves a workbook: | ||||
| workbook and initiate a file save. The following snippet exports to XLSX: | ||||
| 
 | ||||
| ```js | ||||
| /* generate XLSX as base64 string */ | ||||
| @ -305,10 +309,7 @@ cep.fs.writeFile(fn.data, b64, cep.encoding.Base64); | ||||
| 0) Download [`com.sheetjs.data.zip`](pathname:///extendscript/com.sheetjs.data.zip) | ||||
| and extract to a `com.sheetjs.data` subdirectory. | ||||
| 
 | ||||
| 1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder: | ||||
| 
 | ||||
| - Windows `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\` | ||||
| - Macintosh `/Library/Application\ Support/Adobe/CEP/extensions` | ||||
| 1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder[^13]: | ||||
| 
 | ||||
| If prompted, give administrator privileges. | ||||
| 
 | ||||
| @ -329,11 +330,11 @@ If prompted, give administrator privileges. | ||||
| 
 | ||||
| UXP uses scripts with `.psjs` (PS) or `.idjs` (InDesign) file extensions. | ||||
| 
 | ||||
| [The "Standalone" scripts](/docs/getting-started/installation/frameworks) can | ||||
| be loaded directly in UXP scripts with `require`: | ||||
| The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) | ||||
| can be loaded directly in UXP scripts with `require`: | ||||
| 
 | ||||
| ```js | ||||
| // assuming xlsx.full.min.js is in the same folder as the idjs / psjs script | ||||
| /* assuming xlsx.full.min.js is in the same folder as the idjs / psjs script */ | ||||
| const XLSX = require("./xlsx.full.min.js"); | ||||
| ``` | ||||
| 
 | ||||
| @ -347,7 +348,8 @@ const storage = UXP.storage, ufs = storage.localFileSystem; | ||||
| ### Reading Files | ||||
| 
 | ||||
| The `getFileForOpening` method resolves to a `File` object. Reading the file | ||||
| with the `binary` format returns an `ArrayBuffer` object that can be parsed: | ||||
| with the `binary` format returns an `ArrayBuffer` object that can be parsed | ||||
| with the SheetJS `read` method[^14]: | ||||
| 
 | ||||
| ```js | ||||
| /* show file picker (single file, no folders) */ | ||||
| @ -363,11 +365,7 @@ const wb = XLSX.read(ab); | ||||
| <Tabs groupId="ccapp"> | ||||
|   <TabItem value="indesign" label="InDesign"> | ||||
| 
 | ||||
| 0) Open the "Scripts Panel" folder. | ||||
| 
 | ||||
| To find this folder: Open the Scripts panel in InDesign (Window > Utilities > | ||||
| Scripts).  In the Scripts panel, right-click "User" and select "Reveal".  This | ||||
| will open a Finder (macOS) or Explorer (Windows) window.  Open "Scripts Panel" | ||||
| 0) Open the "Scripts Panel" folder[^15]. | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 
 | ||||
| @ -385,6 +383,16 @@ Move them to the Scripts Panel folder. | ||||
| 4) In the Scripts Panel, double-click "parse". Select the downloaded `pres.xlsx` | ||||
| in the file picker. | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| If the InDesign version does not support UXP, a tooltip shows a message: | ||||
| 
 | ||||
| > This file is not executable by any supported script language. | ||||
| 
 | ||||
| It is strongly recommended to upgrade to InDesign 2023. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| @ -392,9 +400,14 @@ in the file picker. | ||||
| 
 | ||||
| ### Writing Files | ||||
| 
 | ||||
| The `getFileForSaving` method resolves to a `File` object. The workbook should | ||||
| be written with `type: "buffer"` for compatibility with the `binary` format: | ||||
| The SheetJS `write` method[^16], with the option `type: "buffer"`[^17], returns | ||||
| file data stored in a `Uint8Array`. | ||||
| 
 | ||||
| The `getFileForSaving` method resolves to a `File` object. The `write` method | ||||
| accepts an options argument. If the `data: storage.formats.binary` option is | ||||
| set, the method will correctly interpret `Uint8Array` data. | ||||
| 
 | ||||
| The following snippet exports to XLSX: | ||||
| 
 | ||||
| ```js | ||||
| /* generate XLSX with type: "buffer" */ | ||||
| @ -410,11 +423,7 @@ await file.write(buf, { data: storage.formats.binary }); | ||||
| <Tabs groupId="ccapp"> | ||||
|   <TabItem value="indesign" label="InDesign"> | ||||
| 
 | ||||
| 0) Open the "Scripts Panel" folder. | ||||
| 
 | ||||
| To find this folder: Open the Scripts panel in InDesign (Window > Utilities > | ||||
| Scripts).  In the Scripts panel, right-click "User" and select "Reveal".  This | ||||
| will open a Finder (macOS) or Explorer (Windows) window.  Open "Scripts Panel" | ||||
| 0) Open the "Scripts Panel" folder[^18]. | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 
 | ||||
| @ -435,3 +444,55 @@ Move them to the Scripts Panel folder. | ||||
| </Tabs> | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## Miscellany | ||||
| 
 | ||||
| ### Scripts Panel | ||||
| 
 | ||||
| The scripts panel folder is used for ExtendScript and UXP scripts. The location | ||||
| can be revealed from the relevant applications. For InDesign: | ||||
| 
 | ||||
| 1) Activate Scripts panel (Windows > Utilities > Scripts) | ||||
| 
 | ||||
| 2) In the new panel window, select the User folder | ||||
| 
 | ||||
| 3) Click `☰` and select "Reveal in Explorer" or "Reveal in Finder". | ||||
| 
 | ||||
| A new Explorer (Windows) or Finder (macOS) window will open the folder. | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| Some versions of InDesign will open the parent "Scripts" folder. If there is a | ||||
| "Scripts Panel" subdirectory, that folder should be used. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### CEP Extensions | ||||
| 
 | ||||
| CEP extension scripts are typically stored in a system-wide folder: | ||||
| 
 | ||||
| | OS        | Folder                                                      | | ||||
| |:----------|:------------------------------------------------------------| | ||||
| | Windows   | `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\` | | ||||
| | Macintosh | `/Library/Application\ Support/Adobe/CEP/extensions`        | | ||||
| 
 | ||||
| Administrator privileges are usually required for writing to the folder. | ||||
| 
 | ||||
| [^1]: Historically, Adobe applications were separate entities. Eventually they were bundled in a package called "Creative Suite". It was rebranded to "Creative Cloud" later. As ExtendScript was introduced during the Creative Suite era, this page will use the phrase "Creative Suite". | ||||
| [^2]: See [`readFile` in "Reading Files"](/docs/api/parse-options) | ||||
| [^3]: See ["Scripts Panel"](#scripts-panel) | ||||
| [^4]: See ["Scripts Panel"](#scripts-panel) | ||||
| [^5]: See [`writeFile` in "Writing Files"](/docs/api/write-options) | ||||
| [^6]: See ["Scripts Panel"](#scripts-panel) | ||||
| [^7]: See ["Scripts Panel"](#scripts-panel) | ||||
| [^8]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^9]: See [the "base64" type in "Reading Files"](/docs/api/parse-options#input-type) | ||||
| [^10]: See ["CEP Extensions"](#cep-extensions) | ||||
| [^11]: See [`write` in "Writing Files"](/docs/api/write-options) | ||||
| [^12]: See ["Supported Output Formats" type in "Writing Files"](/docs/api/write-options#supported-output-formats) | ||||
| [^13]: See ["CEP Extensions"](#cep-extensions) | ||||
| [^14]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^15]: See ["Scripts Panel"](#scripts-panel) | ||||
| [^16]: See [`write` in "Writing Files"](/docs/api/write-options) | ||||
| [^17]: See ["Supported Output Formats" type in "Writing Files"](/docs/api/write-options#supported-output-formats) | ||||
| [^18]: See ["Scripts Panel"](#scripts-panel) | ||||
| @ -119,9 +119,9 @@ This demo was tested in the following deployments: | ||||
| |:-------------|:--------|:-----------| | ||||
| | `darwin-x64` | `2.7.0` | 2023-07-24 | | ||||
| | `darwin-arm` | `2.7.0` | 2023-06-05 | | ||||
| | `win10-x64`  | `2.7.0` | 2023-07-24 | | ||||
| | `linux-x64`  | `2.7.0` | 2023-09-22 | | ||||
| | `linux-arm`  | `2.7.0` | 2023-08-30 | | ||||
| | `win10-x64`  | `2.7.0` | 2023-07-24 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -723,9 +723,9 @@ This demo was last tested in the following deployments: | ||||
| |:-------------|:---------|:-----------| | ||||
| | `darwin-x64` | `0.75.1` | 2023-08-26 | | ||||
| | `darwin-arm` | `0.73.0` | 2023-06-05 | | ||||
| | `win10-x64`  | `0.71.2` | 2023-05-23 | | ||||
| | `linux-x64`  | `0.71.2` | 2023-05-23 | | ||||
| | `linux-arm`  | `0.75.1` | 2023-08-30 | | ||||
| | `win10-x64`  | `0.71.2` | 2023-05-23 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -97,6 +97,7 @@ 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 | | ||||
| | `win10-arm`  | `fc55792`  | `1.21.1`   | 2023-09-25 | | ||||
| | `linux-x64`  | `81d7606`  | `1.21.0`   | 2023-08-27 | | ||||
| | `linux-arm`  | `3dbe69d`  | `1.21.1`   | 2023-08-30 | | ||||
| 
 | ||||
|  | ||||
| @ -264,14 +264,22 @@ This demo was tested in the following deployments: | ||||
| |:-------------|:-----------|:-----------| | ||||
| | `darwin-x64` | `2788d71`  | 2023-07-24 | | ||||
| | `darwin-arm` | `2788d71`  | 2023-06-05 | | ||||
| | `win10-x64`  | `2788d71`  | 2023-07-24 | | ||||
| | `win11-arm`  | `2788d71`  | 2023-09-25 | | ||||
| | `linux-x64`  | `2788d71`  | 2023-06-02 | | ||||
| | `linux-arm`  | `2788d71`  | 2023-08-29 | | ||||
| | `win10-x64`  | `2788d71`  | 2023-07-24 | | ||||
| 
 | ||||
| When the demo was tested, commit `2788d71` corresponded to the latest release. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| QuickJS does not officially support Windows. The `win10-x64` and `win11-arm` | ||||
| tests were run entirely within Windows Subsystem for Linux. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 0) Build `libquickjs.a`: | ||||
| 
 | ||||
| ```bash | ||||
|  | ||||
| @ -21,7 +21,8 @@ The main library can be loaded and compiled in a new context: | ||||
| ```rb | ||||
| require "execjs" | ||||
| 
 | ||||
| source = File.open("xlsx.full.min.js").read; | ||||
| source = File.open("xlsx.full.min.js", "rb").read; | ||||
| source.force_encoding("UTF-8"); | ||||
| context = ExecJS.compile(source); | ||||
| ``` | ||||
| 
 | ||||
| @ -42,7 +43,7 @@ and writes to `sheetjsw.xlsb`: | ||||
| require "base64" | ||||
| 
 | ||||
| # read and encode data to Base64 | ||||
| data = Base64.strict_encode64(File.open("pres.numbers").read); | ||||
| data = Base64.strict_encode64(File.open("pres.numbers", "rb").read); | ||||
| 
 | ||||
| # define function and call with the data | ||||
| xlsb = context.call(<<EOF, data); | ||||
| @ -69,9 +70,14 @@ This demo was tested in the following deployments: | ||||
| 
 | ||||
| | Platform     | Ruby     | ExecJS  | Date       | | ||||
| |:-------------|:---------|:--------|:-----------| | ||||
| | `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 | | ||||
| | `darwin-x64` | `2.7.6`  | `2.9.1` | 2023-09-24 | | ||||
| | `darwin-arm` | `2.7.4`  | `2.9.1` | 2023-09-24 | | ||||
| | `win10-x64`  | `3.2.2`  | `2.9.1` | 2023-09-24 | | ||||
| | `win11-arm`  | `3.0.2`  | `2.9.1` | 2023-09-24 | | ||||
| | `linux-x64`  | `3.0.4`  | `2.9.1` | 2023-09-24 | | ||||
| | `linux-arm`  | `2.7.4`  | `2.9.1` | 2023-09-24 | | ||||
| 
 | ||||
| Note: The Windows 11 ARM64 test used the Ruby version that ships with WSL. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -118,3 +124,18 @@ ruby ExecSheetJS.rb pres.numbers | ||||
| 
 | ||||
| If the program succeeded, the CSV contents will be printed to console and the | ||||
| file `sheetjsw.xlsb` will be created.  That file can be opened with Excel. | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| If a JavaScript runtime is not available, the script will throw an error: | ||||
| 
 | ||||
| ``` | ||||
| execjs/runtimes.rb:68:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable) | ||||
| ``` | ||||
| 
 | ||||
| ExecJS 2.9.1 supports the Bun runtime. Install the Bun runtime[^1], restart the | ||||
| terminal, and re-run the script. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| [^1]: `curl -fsSL https://bun.sh/install | bash` can be run from macOS, Linux, and Windows WSL. | ||||
| @ -116,9 +116,9 @@ This demo was tested in the following deployments: | ||||
| |:-------------|:-----------| | ||||
| | `darwin-x64` | 2023-08-31 | | ||||
| | `darwin-arm` | 2023-07-05 | | ||||
| | `win10-x64`  | 2023-08-31 | | ||||
| | `linux-x64`  | 2023-07-05 | | ||||
| | `linux-arm`  | 2023-08-30 | | ||||
| | `win10-x64`  | 2023-08-31 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -3,11 +3,12 @@ | ||||
| require "execjs" | ||||
| require "base64" | ||||
| 
 | ||||
| source = File.open("xlsx.full.min.js").read; | ||||
| source = File.open("xlsx.full.min.js", "rb").read(); | ||||
| source.force_encoding("UTF-8"); | ||||
| context = ExecJS.compile(source); | ||||
| puts context.eval("XLSX.version"); | ||||
| 
 | ||||
| data = Base64.strict_encode64(File.open(ARGV[0]).read); | ||||
| data = Base64.strict_encode64(File.open(ARGV[0], "rb").read); | ||||
| result = context.call(<<EOF, data); | ||||
| function(data) { | ||||
|   var wb = XLSX.read(data, {type: 'base64'}); | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/github/viewer.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/github/viewer.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 121 KiB | 
		Loading…
	
		Reference in New Issue
	
	Block a user