forked from sheetjs/docs.sheetjs.com
		
	static-webpack
This commit is contained in:
		
							parent
							
								
									75697ac27e
								
							
						
					
					
						commit
						0acbc990f0
					
				| @ -1496,6 +1496,13 @@ Click on "Click here to export" to generate a file. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| The [Webpack section of the Content demo](/docs/demos/static/webpack) covers asset | ||||
| loaders. They are ideal for static sites pulling data from sheets at build time. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## WMR | ||||
| 
 | ||||
| WMR works with no caveats. | ||||
|  | ||||
| @ -12,7 +12,7 @@ import CodeBlock from '@theme/CodeBlock'; | ||||
| :::note | ||||
| 
 | ||||
| This demo covers static asset imports. For processing files in the browser, the | ||||
| ["Bundlers" demo](/docs/demos/bundler#vite) includes an example. | ||||
| ["Bundlers" demo](/docs/demos/frontend/bundler#vite) includes an example. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -39,6 +39,22 @@ will be included in the final bundle. | ||||
| For a pure static site, a plugin can load data into an array of row objects. The | ||||
| SheetJS work is performed in the plugin. The library is not loaded in the page! | ||||
| 
 | ||||
| The following diagram depicts the workbook waltz: | ||||
| 
 | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     buffer(NodeJS\nBuffer) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |vite.config.js\ncustom plugin| buffer | ||||
|   buffer --> |vite.config.js\ncustom plugin| aoo | ||||
|   aoo --> |main.js\nfrontend code| html | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ```js title="vite.config.js" | ||||
| import { readFileSync } from 'fs'; | ||||
| import { read, utils } from 'xlsx'; | ||||
| @ -77,6 +93,21 @@ This loader pulls in data as a Base64 string that can be read with `XLSX.read`. | ||||
| While this approach works, it is not recommended since it loads the library in | ||||
| the front-end site. | ||||
| 
 | ||||
| The following diagram depicts the workbook waltz: | ||||
| 
 | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     base64(base64\nstring) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |vite.config.js\ncustom plugin| base64 | ||||
|   base64 --> |main.js\nfrontend code| aoo | ||||
|   aoo --> |main.js\nfrontend code| html | ||||
| ``` | ||||
| 
 | ||||
| ```js title="vite.config.js" | ||||
| import { readFileSync } from 'fs'; | ||||
| import { defineConfig } from 'vite'; | ||||
| @ -121,7 +152,7 @@ ${csv} | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was tested on 2023 April 30 against `vite v4.3.3`. | ||||
| This demo was tested on 2023 May 24 against `vite v4.3.8`. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										304
									
								
								docz/docs/03-demos/04-static/06-webpack.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										304
									
								
								docz/docs/03-demos/04-static/06-webpack.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,304 @@ | ||||
| --- | ||||
| title: Webpack | ||||
| pagination_prev: demos/net/index | ||||
| pagination_next: demos/mobile/index | ||||
| sidebar_custom_props: | ||||
|   type: bundler | ||||
| --- | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo covers static asset imports. For processing files in the browser, the | ||||
| ["Bundlers" demo](/docs/demos/frontend/bundler#webpack) includes an example. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The [NodeJS Module](/docs/getting-started/installation/nodejs) can be imported | ||||
| from Webpack loader scripts. | ||||
| 
 | ||||
| ## Webpack 5 Asset Module | ||||
| 
 | ||||
| Webpack 5 supports asset modules. With a special option, the loader will receive | ||||
| NodeJS Buffers that can be parsed. The dev server will even watch the files and | ||||
| reload the page in development mode! | ||||
| 
 | ||||
| The following diagram depicts the workbook waltz: | ||||
| 
 | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     buffer(NodeJS\nBuffer) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |webpack.config.js\ncustom rule| buffer | ||||
|   buffer --> |sheetjs-loader.js\ncustom plugin| aoo | ||||
|   aoo --> |src/index.js\nfrontend code| html | ||||
| ``` | ||||
| 
 | ||||
| ### Webpack Config | ||||
| 
 | ||||
| A special rule should be added to `module.rules`: | ||||
| 
 | ||||
| ```js title="webpack.config.js" | ||||
| // ... | ||||
| module.exports = { | ||||
|   // ... | ||||
|   module: { | ||||
|     rules: [ | ||||
|       // highlight-start | ||||
|       { | ||||
|         /* `test` matches file extensions */ | ||||
|         test: /\.(numbers|xls|xlsx|xlsb)/, | ||||
|         /* use the loader script */ | ||||
|         use: [ { loader: './sheetjs-loader' } ] | ||||
|       } | ||||
|       // highlight-end | ||||
|     ] | ||||
|   } | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| Hot Module Replacement enables reloading when files are updated: | ||||
| 
 | ||||
| ```js title="webpack.config.js" | ||||
| // ... | ||||
| module.exports = { | ||||
|   // ... | ||||
|   // highlight-start | ||||
|   devServer: { | ||||
|     static: './dist', | ||||
|     hot: true, | ||||
|   } | ||||
|   // highlight-end | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| It is strongly recommended to add an alias to simplify imports: | ||||
| 
 | ||||
| ```js title="webpack.config.js" | ||||
| // ... | ||||
| module.exports = { | ||||
|   // ... | ||||
|   // highlight-start | ||||
|   resolve: { | ||||
|     alias: { | ||||
|       /* `~` root of the project */ | ||||
|       "~": __dirname | ||||
|     } | ||||
|   }, | ||||
|   // highlight-end | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| ### SheetJS Loader | ||||
| 
 | ||||
| The SheetJS loader script must export a `raw` property that is set to `true`. | ||||
| 
 | ||||
| The base export is expected to be the loader function. That function receives | ||||
| the file contents as a Buffer, which can be parsed with `XLSX.read`. Typically | ||||
| this script is CommonJS so the `require` form should be used. | ||||
| 
 | ||||
| The loader in this demo will parse the first worksheet: | ||||
| 
 | ||||
| ```js title="sheetjs-loader.js" | ||||
| const XLSX = require("xlsx"); | ||||
| 
 | ||||
| function loader(content) { | ||||
|   /* since `loader.raw` is true, `content` is a Buffer */ | ||||
|   const wb = XLSX.read(content); | ||||
|   /* pull data from first worksheet */ | ||||
|   var data = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); | ||||
|   return `export default JSON.parse('${JSON.stringify(data)}')`; | ||||
| } | ||||
| /* ensure the function receives a Buffer */ | ||||
| loader.raw = true; | ||||
| module.exports = loader; | ||||
| ``` | ||||
| 
 | ||||
| ### Asset Imports | ||||
| 
 | ||||
| Spreadsheets can be imported using the plugin.  Assuming `pres.xlsx` is stored | ||||
| in the `data` subfolder, `~/data/pres.xlsx` can be imported from any script: | ||||
| 
 | ||||
| ```js title="src/index.js" | ||||
| import data from '~/data/pres.xlsx'; | ||||
| /* `data` is an array of objects from data/pres.xlsx */ | ||||
| 
 | ||||
| const elt = document.createElement('div'); | ||||
| elt.innerHTML = "<table><tr><th>Name</th><th>Index</th></tr>" + | ||||
|   data.map((row) => `<tr> | ||||
|     <td>${row.Name}</td> | ||||
|     <td>${row.Index}</td> | ||||
|   </tr>`).join("") + | ||||
| "</table>"; | ||||
| document.body.appendChild(elt); | ||||
| ``` | ||||
| 
 | ||||
| ## Webpack 5 Demo | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 May 24 against Webpack 5.84.0 | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Initial Setup | ||||
| 
 | ||||
| 0) Create a new skeleton project: | ||||
| 
 | ||||
| ```bash | ||||
| mkdir sheetjs-wp5 | ||||
| cd sheetjs-wp5 | ||||
| npm init -y | ||||
| npm install webpack@5.84.0 webpack-cli@5.1.1 webpack-dev-server@4.15.0 --save | ||||
| mkdir -p dist | ||||
| mkdir -p src | ||||
| mkdir -p data | ||||
| ``` | ||||
| 
 | ||||
| 1) Install the SheetJS NodeJS module: | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 2) Save the following to `dist/index.html`: | ||||
| 
 | ||||
| ```html title="dist/index.html" | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <title>SheetJS + Webpack 5</title> | ||||
|   </head> | ||||
|   <body> | ||||
|    <script src="main.js"></script> | ||||
|   </body> | ||||
| </html> | ||||
| ``` | ||||
| 
 | ||||
| 3) Save the following to `src/index.js`: | ||||
| 
 | ||||
| ```js title="src/index.js" | ||||
| import data from '~/data/pres.xlsx'; | ||||
| 
 | ||||
| const elt = document.createElement('div'); | ||||
| elt.innerHTML = "<table><tr><th>Name</th><th>Index</th></tr>" + | ||||
|   data.map((row) => `<tr> | ||||
|     <td>${row.Name}</td> | ||||
|     <td>${row.Index}</td> | ||||
|   </tr>`).join("") + | ||||
| "</table>"; | ||||
| document.body.appendChild(elt); | ||||
| ``` | ||||
| 
 | ||||
| 4) Save the following to `webpack.config.js`: | ||||
| 
 | ||||
| ```js title="webpack.config.js" | ||||
| const path = require('path'); | ||||
| 
 | ||||
| module.exports = { | ||||
|   entry: './src/index.js', | ||||
|   output: { | ||||
|     filename: 'main.js', | ||||
|     path: path.resolve(__dirname, 'dist'), | ||||
|   }, | ||||
|   devServer: { | ||||
|     static: './dist', | ||||
|     hot: true, | ||||
|   }, | ||||
|   resolve: { | ||||
|     alias: { | ||||
|       "~": __dirname | ||||
|     } | ||||
|   }, | ||||
|   module: { | ||||
|     rules: [ | ||||
|       { | ||||
|         test: /\.(numbers|xls|xlsx|xlsb)/, | ||||
|         use: [ { loader: './sheetjs-loader' } ] | ||||
|       } | ||||
|     ] | ||||
|   } | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| 5) Save the following to `sheetjs-loader.js`: | ||||
| 
 | ||||
| ```js title="sheetjs-loader.js" | ||||
| const XLSX = require("xlsx"); | ||||
| 
 | ||||
| function loader(content) { | ||||
|   /* since `loader.raw` is true, `content` is a Buffer */ | ||||
|   const wb = XLSX.read(content); | ||||
|   /* pull data from first worksheet */ | ||||
|   var data = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); | ||||
|   return `export default JSON.parse('${JSON.stringify(data)}')`; | ||||
| } | ||||
| /* ensure the function receives a Buffer */ | ||||
| loader.raw = true; | ||||
| module.exports = loader; | ||||
| ``` | ||||
| 
 | ||||
| 6) Download <https://sheetjs.com/pres.xlsx> and save to the `data` folder: | ||||
| 
 | ||||
| ```bash | ||||
| curl -L -o data/pres.xlsx https://sheetjs.com/pres.xlsx | ||||
| ``` | ||||
| 
 | ||||
| ### Live Reload Test | ||||
| 
 | ||||
| 7) Open the test file `data/pres.xlsx` in a spreadsheet editor like Excel. | ||||
| 
 | ||||
| 8) Start the development server: | ||||
| 
 | ||||
| ```bash | ||||
| npx webpack serve --mode=development | ||||
| ``` | ||||
| 
 | ||||
| The terminal will print URLs for the development server: | ||||
| 
 | ||||
| ``` | ||||
| <i> [webpack-dev-server] Project is running at: | ||||
| <i> [webpack-dev-server] Loopback: http://localhost:8080/ | ||||
| ``` | ||||
| 
 | ||||
| 9) Open the `Loopback` address (`http://localhost:8080`) in a web browser. | ||||
| 
 | ||||
| It should display a table of Presidents with "Name" and "Index" columns | ||||
| 
 | ||||
| 10) Add a new row to the spreadsheet and save the file. | ||||
| 
 | ||||
| Upon saving, the page should refresh with the new data. | ||||
| 
 | ||||
| ### Static Site Test | ||||
| 
 | ||||
| 11) Stop Webpack and build the site: | ||||
| 
 | ||||
| ```bash | ||||
| npx webpack --mode=production | ||||
| ``` | ||||
| 
 | ||||
| The final site will be placed in the `dist` folder. | ||||
| 
 | ||||
| 12) Start a local web server to host the `dist` folder: | ||||
| 
 | ||||
| ```bash | ||||
| npx http-server dist | ||||
| ``` | ||||
| 
 | ||||
| The command will print a list of URLs. | ||||
| 
 | ||||
| 13) Open one of the URLs printed in the previous step (`http://localhost:8080`) | ||||
| and confirm that the same data is displayed. | ||||
| 
 | ||||
| To verify that the page is independent of the spreadsheet, make some changes to | ||||
| the file and save.  The page will not automatically update. | ||||
| 
 | ||||
| To verify that the data was added to the page, append `main.js` to the URL | ||||
| (`http://localhost:8080/main.js`) and view the source.  The source will include | ||||
| president names.  It will not include SheetJS library references! | ||||
| @ -12,6 +12,21 @@ Eleventy is a static site generator. | ||||
| The [NodeJS module](/docs/getting-started/installation/nodejs) can be loaded in | ||||
| `.eleventy.js` and used in custom data file format parsers. | ||||
| 
 | ||||
| The following diagram depicts the workbook waltz: | ||||
| 
 | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     buffer(NodeJS\nBuffer) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |.eleventy.js\ncustom parser| buffer | ||||
|   buffer --> |.eleventy.js\ncustom parser| aoo | ||||
|   aoo --> |index.njk\ntemplate| html | ||||
| ``` | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| ### Data File Parser | ||||
|  | ||||
| @ -25,6 +25,21 @@ The following deployments were tested: | ||||
| 
 | ||||
| Nuxt Content v1 is designed to work with Nuxt v2. | ||||
| 
 | ||||
| The following diagram depicts the workbook waltz: | ||||
| 
 | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     buffer(NodeJS\nBuffer) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |nuxt.config.js\ncustom parser| buffer | ||||
|   buffer --> |nuxt.config.js\ncustom parser| aoo | ||||
|   aoo --> |index.vue\ntemplate| html | ||||
| ``` | ||||
| 
 | ||||
| ### Configuration | ||||
| 
 | ||||
| Through an override in `nuxt.config.js`, Nuxt Content will use custom parsers. | ||||
| @ -246,6 +261,21 @@ will not change. | ||||
| 
 | ||||
| Nuxt Content v2 is designed to work with Nuxt v3. | ||||
| 
 | ||||
| The following diagram depicts the workbook waltz: | ||||
| 
 | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     buffer(NodeJS\nBuffer) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |custom module\ntransformer| buffer | ||||
|   buffer --> |custom module\ntransformer| aoo | ||||
|   aoo --> |index.vue\nContentRenderer| html | ||||
| ``` | ||||
| 
 | ||||
| ### Overview | ||||
| 
 | ||||
| Nuxt Content `v2` supports custom transformers for controlling data.  Although | ||||
|  | ||||
| @ -27,12 +27,12 @@ flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     base64(base64\nstring) | ||||
|     aoa(array of\nobjects) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |vite.config.js\ndata loader| base64 | ||||
|   base64 --> |+page.server.js\nload function| aoa | ||||
|   aoa --> |+page.svelte\ncomponent| html | ||||
|   base64 --> |+page.server.js\nload function| aoo | ||||
|   aoo --> |+page.svelte\ncomponent| html | ||||
| ``` | ||||
| 
 | ||||
| ## Integration | ||||
|  | ||||
| @ -18,6 +18,21 @@ Astro is a site generator. Astro projects use ViteJS under the hood. They expose | ||||
| project configuration through the `vite` property in `astro.config.mjs`. The | ||||
| [ViteJS demo](/docs/demos/static/vitejs) examples work as expected! | ||||
| 
 | ||||
| The following diagram depicts the workbook waltz: | ||||
| 
 | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   file[(workbook\nfile)] | ||||
|   subgraph SheetJS operations | ||||
|     base64(base64\nstring) | ||||
|     aoo(array of\nobjects) | ||||
|   end | ||||
|   html{{HTML\nTABLE}} | ||||
|   file --> |astro.config.mjs\nvite data loader| base64 | ||||
|   base64 --> |index.astro\nfrontmatter| aoo | ||||
|   aoo --> |index.astro\ntemplate body| html | ||||
| ``` | ||||
| 
 | ||||
| ## Integration | ||||
| 
 | ||||
| :::note | ||||
|  | ||||
| @ -60,6 +60,7 @@ npx @capacitor/cli telemetry | ||||
| :::caution | ||||
| 
 | ||||
| The latest version of Ionic uses CapacitorJS. These notes are for Cordova apps. | ||||
| The [CapacitorJS demo](/docs/demos/mobile/capacitor) covers CapacitorJS apps. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -17,68 +17,6 @@ it is feasible to build command-line tools for various workflows. | ||||
| This demo covers a number of strategies for building standalone processors. The | ||||
| goal is to generate CSV output from an arbitrary spreadsheet file. | ||||
| 
 | ||||
| ## V8 | ||||
| 
 | ||||
| The [V8](/docs/demos/engines/v8) demo covers standalone programs that embed the | ||||
| V8 engine. This demo uses the Rust integration to generate a command line tool. | ||||
| 
 | ||||
| <details><summary><b>Tested Deployments</b> (click to show)</summary> | ||||
| 
 | ||||
| This demo was last tested in the following deployments: | ||||
| 
 | ||||
| | Architecture | V8 Version   | Date       | | ||||
| |:-------------|:-------------|:-----------| | ||||
| | `darwin-x64` | `11.4.183.2` | 2023-05-22 | | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| 0) Make a new folder for the project: | ||||
| 
 | ||||
| ```bash | ||||
| mkdir sheetjs2csv | ||||
| cd sheetjs2csv | ||||
| ``` | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 
 | ||||
| - [`Cargo.toml`](pathname:///cli/Cargo.toml) | ||||
| - [`snapshot.rs`](pathname:///cli/snapshot.rs) | ||||
| - [`sheet2csv.rs`](pathname:///cli/sheet2csv.rs) | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://docs.sheetjs.com/cli/Cargo.toml | ||||
| curl -LO https://docs.sheetjs.com/cli/snapshot.rs | ||||
| curl -LO https://docs.sheetjs.com/cli/sheet2csv.rs | ||||
| ``` | ||||
| 
 | ||||
| 2) Download the [standalone build](/docs/getting-started/installation/standalone): | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 3) Build the V8 snapshot: | ||||
| 
 | ||||
| ```bash | ||||
| cargo build --bin snapshot | ||||
| cargo run --bin snapshot | ||||
| ``` | ||||
| 
 | ||||
| 4) Build `sheet2csv`: | ||||
| 
 | ||||
| ```bash | ||||
| cargo build --release --bin sheet2csv | ||||
| mv target/release/sheet2csv . | ||||
| ``` | ||||
| 
 | ||||
| 5) Download the test file <https://sheetjs.com/pres.numbers>: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://sheetjs.com/pres.numbers | ||||
| ``` | ||||
| 
 | ||||
| Test by running `./sheet2csv pres.numbers` | ||||
| 
 | ||||
| ## NodeJS | ||||
| 
 | ||||
| There are a few popular tools for compiling NodeJS scripts to CLI programs. | ||||
| @ -200,6 +138,88 @@ example, on an Intel Mac, `nexe` generates `xlsx-cli` so the command is: | ||||
| ./xlsx-cli pres.numbers | ||||
| ``` | ||||
| 
 | ||||
| ## V8 | ||||
| 
 | ||||
| The [V8](/docs/demos/engines/v8) demo covers standalone programs that embed the | ||||
| V8 engine. This demo uses the Rust integration to generate a command line tool. | ||||
| 
 | ||||
| <details><summary><b>Tested Deployments</b> (click to show)</summary> | ||||
| 
 | ||||
| This demo was last tested in the following deployments: | ||||
| 
 | ||||
| | Architecture | V8 Version   | Date       | | ||||
| |:-------------|:-------------|:-----------| | ||||
| | `darwin-x64` | `11.4.183.2` | 2023-05-22 | | ||||
| | `linux-x64`  | `11.4.183.2` | 2023-05-23 | | ||||
| | `win32-x64`  | `11.4.183.2` | 2023-05-23 | | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| 0) Make a new folder for the project: | ||||
| 
 | ||||
| ```bash | ||||
| mkdir sheetjs2csv | ||||
| cd sheetjs2csv | ||||
| ``` | ||||
| 
 | ||||
| 1) Download the following scripts: | ||||
| 
 | ||||
| - [`Cargo.toml`](pathname:///cli/Cargo.toml) | ||||
| - [`snapshot.rs`](pathname:///cli/snapshot.rs) | ||||
| - [`sheet2csv.rs`](pathname:///cli/sheet2csv.rs) | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://docs.sheetjs.com/cli/Cargo.toml | ||||
| curl -LO https://docs.sheetjs.com/cli/snapshot.rs | ||||
| curl -LO https://docs.sheetjs.com/cli/sheet2csv.rs | ||||
| ``` | ||||
| 
 | ||||
| 2) Download the [standalone build](/docs/getting-started/installation/standalone): | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 3) Build the V8 snapshot: | ||||
| 
 | ||||
| ```bash | ||||
| cargo build --bin snapshot | ||||
| cargo run --bin snapshot | ||||
| ``` | ||||
| 
 | ||||
| 4) Build `sheet2csv` (`sheet2csv.exe` in Windows): | ||||
| 
 | ||||
| ```bash | ||||
| cargo build --release --bin sheet2csv | ||||
| ``` | ||||
| 
 | ||||
| 5) Download the test file <https://sheetjs.com/pres.numbers>: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://sheetjs.com/pres.numbers | ||||
| ``` | ||||
| 
 | ||||
| 6) Test the application: | ||||
| 
 | ||||
| <Tabs groupId="os"> | ||||
|   <TabItem value="unix" label="Linux/MacOS"> | ||||
| 
 | ||||
| ```bash | ||||
| mv target/release/sheet2csv . | ||||
| ./sheet2csv pres.numbers | ||||
| ``` | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem value="win" label="Windows"> | ||||
| 
 | ||||
| ```bash | ||||
| mv target/release/sheet2csv.exe . | ||||
| ./sheet2csv pres.numbers | ||||
| ``` | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| ## Deno | ||||
| 
 | ||||
| `deno compile` generates a standalone executable that includes the entire JS | ||||
|  | ||||
| @ -289,6 +289,14 @@ fn eval_code_ab(scope: &mut v8::HandleScope, code: &str) -> Vec<u8> { | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested in the following deployments: | ||||
| 
 | ||||
| | Architecture | V8 Crate | Date       | | ||||
| |:-------------|:---------|:-----------| | ||||
| | `darwin-x64` | `0.71.2` | 2023-05-22 | | ||||
| | `linux-x64`  | `0.71.2` | 2023-05-23 | | ||||
| | `win32-x64`  | `0.71.2` | 2023-05-23 | | ||||
| 
 | ||||
| This demo was last tested on 2023 May 22 against `v8` crate version `0.71.2` | ||||
| 
 | ||||
| ::: | ||||
|  | ||||
| @ -17,8 +17,8 @@ parsed and evaluated in a JSC context. | ||||
| :::warning Platform Limitations | ||||
| 
 | ||||
| JavaScriptCore is primarily deployed in MacOS and iOS applications.  There is | ||||
| some experimental support through the Bun runtime, but production applications | ||||
| intending to support Windows / Linux / Android should try to embed V8. | ||||
| some experimental support through the Bun runtime, but apps intending to support | ||||
| Windows / Linux / Android should try to embed [V8](/docs/demos/engines/v8). | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -77,6 +77,32 @@ context.setObject(data, forKeyedSubscript: "payload" as (NSCopying & NSObjectPro | ||||
| context.evaluateScript("var wb = XLSX.read(payload, {type:'binary'});"); | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Direct Read</b> (click to show)</summary> | ||||
| 
 | ||||
| `Uint8Array` data can be passed directly, skipping string encoding and decoding: | ||||
| 
 | ||||
| ```swift | ||||
| let url = URL(fileURLWithPath: file) | ||||
| var data: Data! = try Data(contentsOf: url); | ||||
| let count = data.count; | ||||
| /* Note: the operations must be performed in the closure! */ | ||||
| let wb: JSValue! = data.withUnsafeMutableBytes { (dataPtr: UnsafeMutableRawBufferPointer) in | ||||
| // highlight-next-line | ||||
|   let ab: JSValue! = JSValue(jsValueRef: JSObjectMakeTypedArrayWithBytesNoCopy(context.jsGlobalContextRef, kJSTypedArrayTypeUint8Array, dataPtr.baseAddress, count, nil, nil, nil), in: context) | ||||
|   /* prepare options argument */ | ||||
|   context.evaluateScript(String(format: "var readopts = {type:'array', dense:true}")); | ||||
|   let readopts: JSValue = context.objectForKeyedSubscript("readopts"); | ||||
|   /* call XLSX.read */ | ||||
|   let XLSX: JSValue! = context.objectForKeyedSubscript("XLSX"); | ||||
|   let readfunc: JSValue = XLSX.objectForKeyedSubscript("read"); | ||||
|   return readfunc.call(withArguments: [ab, readopts]); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| For broad compatibility with Swift versions, the demo uses the String method. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ### Writing Files | ||||
| 
 | ||||
| When writing to binary string in JavaScriptCore, the result should be stored in | ||||
|  | ||||
| @ -34,17 +34,13 @@ const config = { | ||||
|       ({ | ||||
|         docs: { | ||||
|           sidebarPath: require.resolve('./sidebars.js'), | ||||
|           // Please change this to your repo.
 | ||||
|           // Remove this to remove the "edit this page" links.
 | ||||
|           // editUrl:
 | ||||
|             // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
 | ||||
|           // editUrl: 'https://git.sheetjs.com/sheetjs/docs.sheetjs.com/src/branch/master/docz',
 | ||||
|         }, | ||||
|         //blog: {
 | ||||
|         //  showReadingTime: true,
 | ||||
|           // Please change this to your repo.
 | ||||
|           // Remove this to remove the "edit this page" links.
 | ||||
|           // editUrl:
 | ||||
|             // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
 | ||||
|           // editUrl: 'https://git.sheetjs.com/sheetjs/docs.sheetjs.com/src/branch/master/docz/',
 | ||||
|         //},
 | ||||
|         theme: { | ||||
|           customCss: require.resolve('./src/css/custom.css'), | ||||
| @ -60,6 +56,13 @@ const config = { | ||||
|   themeConfig: | ||||
|     /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ | ||||
|     ({ | ||||
|       mermaid: { | ||||
|         options: { | ||||
|           themeVariables: { | ||||
|             edgeLabelBackground: "" | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       navbar: { | ||||
|         title: 'SheetJS CE Docs', | ||||
|         logo: { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user