forked from sheetjs/docs.sheetjs.com
		
	darwin-arm
This commit is contained in:
		
							parent
							
								
									b230d64dd6
								
							
						
					
					
						commit
						2505d3b639
					
				| @ -97,6 +97,8 @@ require(['xlsx'], function(XLSX) { | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| **See the [RequireJS demo](/docs/demos/frontend/bundler/requirejs) for details** | ||||
| 
 | ||||
| ## Dojo Toolkit | ||||
| 
 | ||||
| Dojo has changed module loading strategies over the years.  These examples were | ||||
|  | ||||
| @ -448,7 +448,8 @@ In the component, `aoa_to_sheet` is used to generate the worksheet: | ||||
| The default angular-cli configuration requires no additional configuration. | ||||
| 
 | ||||
| Some deployments use the SystemJS loader, which does require configuration. | ||||
| [The SystemJS demo](/docs/demos/bundler#systemjs) describe the required settings. | ||||
| [The SystemJS demo](/docs/demos/frontend/bundler/systemjs) includes the | ||||
| required settings. | ||||
| 
 | ||||
| 
 | ||||
| ### Legacy Demo | ||||
|  | ||||
							
								
								
									
										225
									
								
								docz/docs/03-demos/01-frontend/19-bundler/11-requirejs.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										225
									
								
								docz/docs/03-demos/01-frontend/19-bundler/11-requirejs.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,225 @@ | ||||
| --- | ||||
| title: Bundling Sheets with RequireJS | ||||
| sidebar_label: RequireJS | ||||
| pagination_prev: demos/index | ||||
| pagination_next: demos/grid/index | ||||
| sidebar_position: 11 | ||||
| --- | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
| import Tabs from '@theme/Tabs'; | ||||
| import TabItem from '@theme/TabItem'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| [RequireJS](https://requirejs.org/) is a JavaScript file and module loader. It | ||||
| includes an in-browser loader as well as a static optimizer. | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| This demo uses RequireJS and SheetJS to export data. We'll explore how to load | ||||
| SheetJS in a site using RequireJS and how to use the `r.js` optimizer to create | ||||
| a bundled site. | ||||
| 
 | ||||
| The [Live demo](pathname:///requirejs/requirejs.html) loads RequireJS from the | ||||
| CDN, uses it to load the standalone script from the SheetJS CDN, and uses the | ||||
| `XLSX` variable to create a button click handler that creates a workbook. | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 October 18 against RequireJS `2.3.6` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) | ||||
| comply with AMD `define` semantics. They support RequireJS and the `r.js` | ||||
| optimizer out of the box. | ||||
| 
 | ||||
| ### Config | ||||
| 
 | ||||
| The RequireJS config should set the `xlsx` alias in the `paths` property. | ||||
| 
 | ||||
| #### SheetJS CDN | ||||
| 
 | ||||
| The SheetJS CDN URL can be directly referenced in a path alias: | ||||
| 
 | ||||
| <CodeBlock language="js">{`\ | ||||
| require.config({ | ||||
|   baseUrl: ".", | ||||
|   name: "app", | ||||
|   paths: { | ||||
|     // highlight-next-line | ||||
|     xlsx: "https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min" | ||||
|   } | ||||
| });`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 
 | ||||
| #### Vendoring | ||||
| 
 | ||||
| After downloading the SheetJS standalone script, a relative path can be used in | ||||
| the path alias. For example, if the standalone script was downloaded in the same | ||||
| directory as the HTML page, the path should be `./xlsx.full.min`: | ||||
| 
 | ||||
| ```js | ||||
| require.config({ | ||||
|   baseUrl: ".", | ||||
|   name: "app", | ||||
|   paths: { | ||||
|     // highlight-next-line | ||||
|     xlsx: "./xlsx.full.min" | ||||
|   } | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| ### Usage | ||||
| 
 | ||||
| Once the alias is set, `"xlsx"` can be required from app scripts: | ||||
| 
 | ||||
| ```js | ||||
| // highlight-next-line | ||||
| require(["xlsx"], function(XLSX) { | ||||
|   /* use XLSX here */ | ||||
|   console.log(XLSX.version); | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| Within the callback, the `XLSX` variable exposes the functions listed in the | ||||
| ["API Reference"](/docs/api/) section of the documentation. | ||||
| 
 | ||||
| ## Complete Example | ||||
| 
 | ||||
| This demo will explore the standalone RequireJS script and the `r.js` optimizer. | ||||
| 
 | ||||
| ### Standalone RequireJS | ||||
| 
 | ||||
| 0) Download the SheetJS Standalone script and move to the project directory: | ||||
| 
 | ||||
| <ul> | ||||
| <li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`}>xlsx.full.min.js</a></li> | ||||
| </ul> | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 1) Save the following to `index.html`: | ||||
| 
 | ||||
| ```html title="index.html" | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head></head> | ||||
|   <body> | ||||
|     <h1>SheetJS Presidents Demo</h1> | ||||
|     <button id="xport">Click here to export</button> | ||||
|     <script src="http://requirejs.org/docs/release/2.3.6/comments/require.js"></script> | ||||
|     <script> | ||||
| /* Wire up RequireJS */ | ||||
| require.config({ | ||||
|   baseUrl: ".", | ||||
|   name: "SheetJSRequire", | ||||
|   paths: { | ||||
|     xlsx: "./xlsx.full.min" | ||||
|   } | ||||
| }); | ||||
|     </script> | ||||
|     <script src="SheetJSRequire.js"></script> | ||||
|   </body> | ||||
| </html> | ||||
| ``` | ||||
| 
 | ||||
| 2) Save the following to `SheetJSRequire.js`: | ||||
| 
 | ||||
| ```js title="SheetJSRequire.js" | ||||
| require(["xlsx"], function(XLSX) { | ||||
|   document.getElementById("xport").addEventListener("click", function() { | ||||
|     /* fetch JSON data and parse */ | ||||
|     var url = "https://sheetjs.com/data/executive.json"; | ||||
|     fetch(url).then(function(res) { return res.json(); }).then(function(raw_data) { | ||||
| 
 | ||||
|     /* filter for the Presidents */ | ||||
|     var prez = raw_data.filter(function(row) { return row.terms.some(function(term) { return term.type === "prez"; }); }); | ||||
| 
 | ||||
|     /* flatten objects */ | ||||
|     var rows = prez.map(function(row) { return { | ||||
|       name: row.name.first + " " + row.name.last, | ||||
|       birthday: row.bio.birthday | ||||
|     }; }); | ||||
| 
 | ||||
|     /* generate worksheet and workbook */ | ||||
|     var worksheet = XLSX.utils.json_to_sheet(rows); | ||||
|     var workbook = XLSX.utils.book_new(); | ||||
|     XLSX.utils.book_append_sheet(workbook, worksheet, "Dates"); | ||||
| 
 | ||||
|     /* fix headers */ | ||||
|     XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" }); | ||||
| 
 | ||||
|     /* calculate column width */ | ||||
|     var max_width = rows.reduce(function(w, r) { return Math.max(w, r.name.length); }, 10); | ||||
|     worksheet["!cols"] = [ { wch: max_width } ]; | ||||
| 
 | ||||
|     /* create an XLSX file and try to save to Presidents.xlsx */ | ||||
|     XLSX.writeFileXLSX(workbook, "Presidents.xlsx"); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| The `r.js` optimizer does not handle `async` functions or ES6 arrow functions. | ||||
| 
 | ||||
| To demonstrate compatibility with older versions of Webpack, `SheetJSRequire.js` | ||||
| uses normal functions and traditional Promise chains. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 3) Start a local HTTP server, then go to `http://localhost:8080/` | ||||
| 
 | ||||
| ```bash | ||||
| npx http-server . | ||||
| ``` | ||||
| 
 | ||||
| Click on "Click here to export" to generate a file. | ||||
| 
 | ||||
| ### r.js Optimizer | ||||
| 
 | ||||
| 4) Create `build.js` configuration for the optimizer: | ||||
| 
 | ||||
| ```js title="build.js" | ||||
| ({ | ||||
|   baseUrl: ".", | ||||
|   name: "SheetJSRequire", | ||||
|   paths: { | ||||
|     xlsx: "./xlsx.full.min" | ||||
|   }, | ||||
|   out: "SheetJSRequire.min.js" | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| 5) Run the `r.js` optimizer to create `SheetJSRequire.min.js`: | ||||
| 
 | ||||
| ```bash | ||||
| npx -p requirejs@2.3.6 r.js -o build.js | ||||
| ``` | ||||
| 
 | ||||
| 6) Save the following to `optimized.html`: | ||||
| 
 | ||||
| ```html title="optimized.html" | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head></head> | ||||
|   <body> | ||||
|     <h1>SheetJS Presidents Demo</h1> | ||||
|     <button id="xport">Click here to export</button> | ||||
|     <script src="http://requirejs.org/docs/release/2.3.3/comments/require.js"></script> | ||||
|     <script src="SheetJSRequire.min.js"></script> | ||||
|   </body> | ||||
| </html> | ||||
| ``` | ||||
| 
 | ||||
| 7) Open `http://localhost:8080/optimized.html` | ||||
| 
 | ||||
| Click on "Click here to export" to generate a file. | ||||
							
								
								
									
										225
									
								
								docz/docs/03-demos/01-frontend/19-bundler/12-systemjs.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										225
									
								
								docz/docs/03-demos/01-frontend/19-bundler/12-systemjs.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,225 @@ | ||||
| --- | ||||
| title: Bundling Sheets with SystemJS | ||||
| sidebar_label: SystemJS | ||||
| pagination_prev: demos/index | ||||
| pagination_next: demos/grid/index | ||||
| sidebar_position: 12 | ||||
| --- | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
| import Tabs from '@theme/Tabs'; | ||||
| import TabItem from '@theme/TabItem'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| SystemJS[^1] is a module loader for NodeJS and browsers. | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| This demo uses SystemJS and SheetJS to export data. We'll explore two workflows: | ||||
| 
 | ||||
| - ["Browser"](#browser) explores how to load SheetJS with SystemJS using the | ||||
| in-browser dynamic loader | ||||
| 
 | ||||
| - ["NodeJS"](#nodejs) explores how to load SheetJS with SystemJS in NodeJS. | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| This demo was originally written for SystemJS 0.19, the most popular SystemJS | ||||
| version used with Angular projects. In the years since the release, Angular and | ||||
| other tools using SystemJS have switched to Webpack. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was tested against the following SystemJS versions: | ||||
| 
 | ||||
| | Version   | Date       | | ||||
| |:----------|:-----------| | ||||
| | `0.19.47` | 2023-10-18 | | ||||
| | `0.20.19` | 2023-10-18 | | ||||
| | `0.21.6`  | 2023-10-18 | | ||||
| | `6.14.2`  | 2023-10-18 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Browser | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| The [Live demo](pathname:///systemjs/systemjs.html) loads SystemJS from the | ||||
| CDN, uses it to load the standalone script from the SheetJS CDN and emulate | ||||
| a `require` implementation when loading [`main.js`](pathname:///systemjs/main.js) | ||||
| 
 | ||||
| "View Source" works on the main HTML page and the `main.js` script. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| SystemJS fails by default because the library does not export anything in the | ||||
| web browser.  The `meta` configuration option can be used to expose `XLSX`: | ||||
| 
 | ||||
| <CodeBlock language="js">{`\ | ||||
| SystemJS.config({ | ||||
|   meta: { | ||||
|     'xlsx': { | ||||
|       exports: 'XLSX' // <-- tell SystemJS to expose the XLSX variable | ||||
|     } | ||||
|   }, | ||||
|   map: { | ||||
|     'xlsx': 'https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js', | ||||
|     'fs': '',     // <--| | ||||
|     'crypto': '', // <--| suppress native node modules | ||||
|     'stream': ''  // <--| | ||||
|   } | ||||
| }); | ||||
| SystemJS.import('main.js'); // load \`main.js\``} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| With this import, the `main.js` script can freely `require("xlsx")`. | ||||
| 
 | ||||
| :::caution Web Workers | ||||
| 
 | ||||
| Web Workers can load the SystemJS library with `importScripts`, but the imported | ||||
| code cannot assign the original worker's `onmessage` callback.  The recommended | ||||
| approach is to expose a global from the required script,  For example, supposing | ||||
| the shared name is `_cb`, the primary worker script would call the callback: | ||||
| 
 | ||||
| ```js title="worker.js" | ||||
| /* main worker script */ | ||||
| importScripts('system.js'); | ||||
| 
 | ||||
| SystemJS.config({ /* ... browser config ... */ }); | ||||
| 
 | ||||
| onmessage = function(evt) { | ||||
|   SystemJS.import('workermain.js').then(function() { _cb(evt); }); | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| The worker script would define and expose the function: | ||||
| 
 | ||||
| ```js title="workermain.js" | ||||
| /* Loaded with SystemJS import */ | ||||
| var XLSX = require('xlsx'); | ||||
| 
 | ||||
| _cb = function(evt) { /* ... do work here ... */ }; | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## NodeJS | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| While SystemJS works in NodeJS, the built-in `require` should be preferred. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Old Style | ||||
| 
 | ||||
| The NodeJS module main script is `xlsx/xlsx.js` and should be mapped: | ||||
| 
 | ||||
| ```js | ||||
| SystemJS.config({ | ||||
|   map: { | ||||
|     "xlsx": "./node_modules/xlsx/xlsx.js" | ||||
|   } | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| The standalone scripts can be required, but SystemJS config must include a hint | ||||
| that the script assigns a global: | ||||
| 
 | ||||
| ```js | ||||
| SystemJS.config({ | ||||
|   meta: { | ||||
|     "standalone": { format: "global" } | ||||
|   }, | ||||
|   map: { | ||||
|     "standalone": "xlsx.full.min.js" | ||||
|   } | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| ### New Style | ||||
| 
 | ||||
| Newer versions of SystemJS supports "import maps" through `applyImportMap`: | ||||
| 
 | ||||
| ```js | ||||
| const SystemJS = require('systemjs'); | ||||
| const src = require("path").join(process.cwd(), 'node_modules/xlsx/xlsx.js'); | ||||
| SystemJS.applyImportMap(SystemJS.System, { | ||||
|   imports: { | ||||
|     'xlsx': "file://" + src, | ||||
|     'fs': 'node:fs', | ||||
|     'crypto': 'node:crypto', | ||||
|     'stream': 'node:stream' | ||||
|   } | ||||
| }); | ||||
| ```` | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| In the modern style, importing to the name `XLSX` will cause conflicts. | ||||
| 
 | ||||
| **It is strongly recommended to import to the name `_XLSX`!** | ||||
| 
 | ||||
| ```js | ||||
| SystemJS.System.import("xlsx").then(function( | ||||
| // highlight-next-line | ||||
|   _XLSX // use _XLSX instead of XLSX | ||||
| ) { | ||||
|   if(typeof XLSX == "undefined") throw "Import failed!"; | ||||
| 
 | ||||
|   // XLSX is defined here | ||||
|   console.log(XLSX.version); | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### NodeJS Demo | ||||
| 
 | ||||
| 0) Prepare a blank project: | ||||
| 
 | ||||
| ```bash | ||||
| mkdir sheetjs-systemjs | ||||
| cd sheetjs-systemjs | ||||
| npm init -y | ||||
| ``` | ||||
| 
 | ||||
| 1) Install the dependencies: | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz systemjs@6.14.2`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 2) Download [`SheetJSystem.js`](pathname:///systemjs/SheetJSystem.js) and move | ||||
| to the project folder: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://docs.sheetjs.com/systemjs/SheetJSystem.js | ||||
| ``` | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| The script is handles both old-style and new-style SystemJS loaders. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 3) Run in NodeJS: | ||||
| 
 | ||||
| ```bash | ||||
| node SheetJSystem.js | ||||
| ``` | ||||
| 
 | ||||
| If the demo worked, `Presidents.xlsx` will be created. | ||||
| 
 | ||||
| :::note pass | ||||
| 
 | ||||
| As it uses `fetch`, this demo requires Node 18. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 
 | ||||
| [^1]: The project does not have a separate website. The source repository is hosted on [GitHub](https://github.com/systemjs/systemjs) | ||||
| @ -11,6 +11,7 @@ import current from '/version.js'; | ||||
| import Tabs from '@theme/Tabs'; | ||||
| import TabItem from '@theme/TabItem'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; | ||||
| 
 | ||||
| SheetJS predates ECMAScript modules and most bundler tools. As best practices | ||||
| have evolved, stress testing SheetJS libraries have revealed bugs in bundlers | ||||
| @ -23,6 +24,16 @@ considered a bundler bug if the tool cannot properly handle JS libraries. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The following tools are covered in separate pages: | ||||
| 
 | ||||
| <ul>{useCurrentSidebarCategory().items.filter(item => !item?.customProps?.skip).map((item, index) => { | ||||
|   const listyle = (item.customProps?.icon) ? { | ||||
|     listStyleImage: `url("${item.customProps.icon}")` | ||||
|   } : {}; | ||||
|   return (<li style={listyle} {...(item.customProps?.class ? {className: item.customProps.class}: {})}> | ||||
|     <a href={item.href}>{item.label}</a>{item.customProps?.summary && (" - " + item.customProps.summary)} | ||||
|   </li>); | ||||
| })}</ul> | ||||
| 
 | ||||
| ## Browserify | ||||
| 
 | ||||
| @ -481,167 +492,7 @@ click the "Click to Export!" button to generate a file. | ||||
| 
 | ||||
| ## RequireJS | ||||
| 
 | ||||
| The [SheetJS Standalone scripts](/docs/getting-started/installation/standalone) | ||||
| comply with AMD `define` semantics. They support RequireJS out of the box. | ||||
| 
 | ||||
| The RequireJS config should set the `xlsx` alias in the `paths` property: | ||||
| 
 | ||||
| ```js | ||||
| require.config({ | ||||
|   baseUrl: ".", | ||||
|   name: "app", | ||||
|   paths: { | ||||
|     // highlight-next-line | ||||
|     xlsx: "xlsx.full.min" | ||||
|   } | ||||
| }); | ||||
| // highlight-next-line | ||||
| require(["xlsx"], function(XLSX) { | ||||
|   /* use XLSX here */ | ||||
|   console.log(XLSX.version); | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| The [Live demo](pathname:///requirejs/requirejs.html) loads RequireJS from the | ||||
| CDN, uses it to load the standalone script from the SheetJS CDN, and uses the | ||||
| `XLSX` variable to create a button click handler that creates a workbook. | ||||
| 
 | ||||
| The `r.js` optimizer also supports the standalone scripts. | ||||
| 
 | ||||
| <details><summary><b>Complete Example</b> (click to show)</summary> | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 May 07 against RequireJS `2.3.3` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| The `r.js` optimizer does not support ES6 syntax including arrow functions and | ||||
| the `async` keyword! The demo JS code uses traditional functions. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 0) Download the SheetJS Standalone script and move to the project directory: | ||||
| 
 | ||||
| <ul> | ||||
| <li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`}>xlsx.full.min.js</a></li> | ||||
| </ul> | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 1) Save the following to `index.html`: | ||||
| 
 | ||||
| ```html title="index.html" | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head></head> | ||||
|   <body> | ||||
|     <h1>SheetJS Presidents Demo</h1> | ||||
|     <button id="xport">Click here to export</button> | ||||
|     <script src="http://requirejs.org/docs/release/2.3.3/comments/require.js"></script> | ||||
|     <script> | ||||
| /* Wire up RequireJS */ | ||||
| require.config({ | ||||
|   baseUrl: ".", | ||||
|   name: "SheetJSRequire", | ||||
|   paths: { | ||||
|     xlsx: "./xlsx.full.min" | ||||
|   } | ||||
| }); | ||||
|     </script> | ||||
|     <script src="SheetJSRequire.js"></script> | ||||
|   </body> | ||||
| </html> | ||||
| ``` | ||||
| 
 | ||||
| 2) Save the following to `SheetJSRequire.js`: | ||||
| 
 | ||||
| ```js title="SheetJSRequire.js" | ||||
| require(["xlsx"], function(XLSX) { | ||||
|   document.getElementById("xport").addEventListener("click", function() { | ||||
|     /* fetch JSON data and parse */ | ||||
|     var url = "https://sheetjs.com/data/executive.json"; | ||||
|     fetch(url).then(function(res) { return res.json(); }).then(function(raw_data) { | ||||
| 
 | ||||
|     /* filter for the Presidents */ | ||||
|     var prez = raw_data.filter(function(row) { return row.terms.some(function(term) { return term.type === "prez"; }); }); | ||||
| 
 | ||||
|     /* flatten objects */ | ||||
|     var rows = prez.map(function(row) { return { | ||||
|       name: row.name.first + " " + row.name.last, | ||||
|       birthday: row.bio.birthday | ||||
|     }; }); | ||||
| 
 | ||||
|     /* generate worksheet and workbook */ | ||||
|     var worksheet = XLSX.utils.json_to_sheet(rows); | ||||
|     var workbook = XLSX.utils.book_new(); | ||||
|     XLSX.utils.book_append_sheet(workbook, worksheet, "Dates"); | ||||
| 
 | ||||
|     /* fix headers */ | ||||
|     XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" }); | ||||
| 
 | ||||
|     /* calculate column width */ | ||||
|     var max_width = rows.reduce(function(w, r) { return Math.max(w, r.name.length); }, 10); | ||||
|     worksheet["!cols"] = [ { wch: max_width } ]; | ||||
| 
 | ||||
|     /* create an XLSX file and try to save to Presidents.xlsx */ | ||||
|     XLSX.writeFileXLSX(workbook, "Presidents.xlsx"); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| 3) Start a local HTTP server, then go to `http://localhost:8080/` | ||||
| 
 | ||||
| ```bash | ||||
| npx http-server . | ||||
| ``` | ||||
| 
 | ||||
| Click on "Click here to export" to generate a file. | ||||
| 
 | ||||
| 4) Create `build.js` configuration for the optimizer: | ||||
| 
 | ||||
| ```js title="build.js" | ||||
| ({ | ||||
|   baseUrl: ".", | ||||
|   name: "SheetJSRequire", | ||||
|   paths: { | ||||
|     xlsx: "./xlsx.full.min" | ||||
|   }, | ||||
|   out: "SheetJSRequire.min.js" | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| 5) Run the `r.js` optimizer to create `SheetJSRequire.min.js`: | ||||
| 
 | ||||
| ```bash | ||||
| npx -p requirejs@2.3.3 r.js -o build.js | ||||
| ``` | ||||
| 
 | ||||
| 6) Save the following to `optimized.html`: | ||||
| 
 | ||||
| ```html title="optimized.html" | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head></head> | ||||
|   <body> | ||||
|     <h1>SheetJS Presidents Demo</h1> | ||||
|     <button id="xport">Click here to export</button> | ||||
|     <script src="http://requirejs.org/docs/release/2.3.3/comments/require.js"></script> | ||||
|     <script src="SheetJSRequire.min.js"></script> | ||||
|   </body> | ||||
| </html> | ||||
| ``` | ||||
| 
 | ||||
| 7) Open `http://localhost:8080/optimized.html` | ||||
| 
 | ||||
| Click on "Click here to export" to generate a file. | ||||
| 
 | ||||
| </details> | ||||
| **[The exposition has been moved to a separate page.](/docs/demos/frontend/bundler/requirejs)** | ||||
| 
 | ||||
| ## Rollup | ||||
| 
 | ||||
| @ -978,206 +829,9 @@ Click on "Click here to export" to generate a file. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## SystemJS | ||||
| #### SystemJS | ||||
| 
 | ||||
| With configuration, SystemJS supports both browser and NodeJS deployments. | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| This demo was written against SystemJS 0.19, the most popular SystemJS version | ||||
| used with Angular applications.  In the years since the release, Angular and | ||||
| other tools using SystemJS have switched to Webpack. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| <Tabs> | ||||
|   <TabItem value="browser" label="Browser"> | ||||
| 
 | ||||
| SystemJS fails by default because the library does not export anything in the | ||||
| web browser.  The `meta` configuration option can be used to expose `XLSX`: | ||||
| 
 | ||||
| <CodeBlock language="js">{`\ | ||||
| SystemJS.config({ | ||||
|   meta: { | ||||
|     'xlsx': { | ||||
|       exports: 'XLSX' // <-- tell SystemJS to expose the XLSX variable | ||||
|     } | ||||
|   }, | ||||
|   map: { | ||||
|     'xlsx': 'https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js', | ||||
|     'fs': '',     // <--| | ||||
|     'crypto': '', // <--| suppress native node modules | ||||
|     'stream': ''  // <--| | ||||
|   } | ||||
| }); | ||||
| SystemJS.import('main.js'); // load \`main.js\``} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| The `main.js` script can freely `require("xlsx")`. | ||||
| 
 | ||||
| :::caution Web Workers | ||||
| 
 | ||||
| Web Workers can load the SystemJS library with `importScripts`, but the imported | ||||
| code cannot assign the original worker's `onmessage` callback.  The recommended | ||||
| approach is to expose a global from the required script,  For example, supposing | ||||
| the shared name is `_cb`, the primary worker script would call the callback: | ||||
| 
 | ||||
| ```js title="worker.js" | ||||
| /* main worker script */ | ||||
| importScripts('system.js'); | ||||
| 
 | ||||
| SystemJS.config({ /* ... browser config ... */ }); | ||||
| 
 | ||||
| onmessage = function(evt) { | ||||
|   SystemJS.import('workermain.js').then(function() { _cb(evt); }); | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| The worker script would define and expose the function: | ||||
| 
 | ||||
| ```js title="workermain.js" | ||||
| /* Loaded with SystemJS import */ | ||||
| var XLSX = require('xlsx'); | ||||
| 
 | ||||
| _cb = function(evt) { /* ... do work here ... */ }; | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem value="nodejs" label="NodeJS"> | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| While SystemJS works in NodeJS, the built-in `require` should be preferred. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The NodeJS module main script is `xlsx/xlsx.js` and should be mapped: | ||||
| 
 | ||||
| ```js | ||||
| SystemJS.config({ | ||||
|   map: { | ||||
|     "xlsx": "./node_modules/xlsx/xlsx.js" | ||||
|   } | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| The standalone scripts require a hint that the script assigns a global: | ||||
| 
 | ||||
| ```js | ||||
| SystemJS.config({ | ||||
|   meta: { | ||||
|     "standalone": { format: "global" } | ||||
|   }, | ||||
|   map: { | ||||
|     "standalone": "xlsx.full.min.js" | ||||
|   } | ||||
| }); | ||||
| ``` | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| <details><summary><b>Complete Example</b> (click to show)</summary> | ||||
| 
 | ||||
| <Tabs> | ||||
|   <TabItem value="browser" label="Browser"> | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 May 07 against SystemJS 0.20.16 | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The [Live demo](pathname:///systemjs/systemjs.html) loads SystemJS from the | ||||
| CDN, uses it to load the standalone script from the SheetJS CDN and emulate | ||||
| a `require` implementation when loading [`main.js`](pathname:///systemjs/main.js) | ||||
| 
 | ||||
| "View Source" works on the main HTML page and the `main.js` script. | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem value="nodejs" label="NodeJS"> | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 May 07 against SystemJS 0.19.47 | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 1) Install the dependencies: | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| npm init -y | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz systemjs@0.19.47`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| 2) Save the following script to `SheetJSystem.js`: | ||||
| 
 | ||||
| ```js title="SheetJSystem.js" | ||||
| const SystemJS = require('systemjs'); | ||||
| 
 | ||||
| // highlight-start | ||||
| SystemJS.config({ | ||||
|   map: { | ||||
|     'xlsx': 'node_modules/xlsx/xlsx.js', | ||||
|     'fs': '@node/fs', | ||||
|     'crypto': '@node/crypto', | ||||
|     'stream': '@node/stream' | ||||
|   } | ||||
| }); | ||||
| // highlight-end | ||||
| 
 | ||||
| SystemJS.import('xlsx').then(async function(XLSX) { | ||||
| 
 | ||||
|   /* fetch JSON data and parse */ | ||||
|   const url = "https://sheetjs.com/data/executive.json"; | ||||
|   const raw_data = await (await fetch(url)).json(); | ||||
| 
 | ||||
|   /* filter for the Presidents */ | ||||
|   const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez")); | ||||
| 
 | ||||
|   /* flatten objects */ | ||||
|   const rows = prez.map(row => ({ | ||||
|     name: row.name.first + " " + row.name.last, | ||||
|     birthday: row.bio.birthday | ||||
|   })); | ||||
| 
 | ||||
|   /* generate worksheet and workbook */ | ||||
|   const worksheet = XLSX.utils.json_to_sheet(rows); | ||||
|   const workbook = XLSX.utils.book_new(); | ||||
|   XLSX.utils.book_append_sheet(workbook, worksheet, "Dates"); | ||||
| 
 | ||||
|   /* fix headers */ | ||||
|   XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" }); | ||||
| 
 | ||||
|   /* calculate column width */ | ||||
|   const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); | ||||
|   worksheet["!cols"] = [ { wch: max_width } ]; | ||||
| 
 | ||||
|   /* create an XLSX file and try to save to Presidents.xlsx */ | ||||
|   XLSX.writeFile(workbook, "Presidents.xlsx"); | ||||
| 
 | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| 3) Run in NodeJS: | ||||
| 
 | ||||
| ```bash | ||||
| node SheetJSystem.js | ||||
| ``` | ||||
| 
 | ||||
| If the demo worked, `Presidents.xlsx` will be created. | ||||
| 
 | ||||
| :::note pass | ||||
| 
 | ||||
| As it uses `fetch`, this demo requires Node 18. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| </details> | ||||
| **[The exposition has been moved to a separate page.](/docs/demos/frontend/bundler/systemjs)** | ||||
| 
 | ||||
| ## Vite | ||||
| 
 | ||||
|  | ||||
| @ -258,7 +258,7 @@ This demo was tested in the following environments: | ||||
| | OS and Version | Arch | Tauri    | Date       | | ||||
| |:---------------|:-----|:---------|:-----------| | ||||
| | macOS 13.5.1   | x64  | `v1.5.0` | 2023-09-30 | | ||||
| | macOS 13.4.1   | ARM  | `v1.4.0` | 2023-06-29 | | ||||
| | macOS 14.0     | ARM  | `v1.5.2` | 2023-10-18 | | ||||
| | Windows 10     | x64  | `v1.5.0` | 2023-10-01 | | ||||
| | Windows 11     | ARM  | `v1.4.1` | 2023-09-26 | | ||||
| | Linux (HoloOS) | x64  | `v1.5.2` | 2023-10-11 | | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| --- | ||||
| title: NeutralinoJS | ||||
| title: Data Munging in NeutralinoJS | ||||
| sidebar_label: NeutralinoJS | ||||
| description: Build data-intensive desktop apps using NeutralinoJS. Seamlessly integrate spreadsheets into your app using SheetJS. Quickly modernize Excel-powered business processes. | ||||
| pagination_prev: demos/mobile/index | ||||
| @ -9,8 +9,6 @@ sidebar_custom_props: | ||||
|   summary: Webview + Lightweight Extensions | ||||
| --- | ||||
| 
 | ||||
| # Data Munging in NeutralinoJS | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
| import Tabs from '@theme/Tabs'; | ||||
| import TabItem from '@theme/TabItem'; | ||||
| @ -195,7 +193,7 @@ This demo was tested in the following environments: | ||||
| | 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 | | ||||
| | macOS 14.0     | ARM  | `v4.14.1` | `v3.12.0` | 2023-10-18 | | ||||
| | 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.14.1` | `v3.12.0` | 2023-10-11 | | ||||
| @ -385,7 +383,8 @@ save as `SheetJSNeu` will not automatically add the `.xlsx` extension! | ||||
| npx @neutralinojs/neu build | ||||
| ``` | ||||
| 
 | ||||
| Platform-specific programs will be created in the `dist` folder. | ||||
| Platform-specific programs will be created in the `dist` folder. For example, | ||||
| the `darwin-arm` program will be `./dist/sheetjs-neu/sheetjs-neu-mac_arm64` | ||||
| 
 | ||||
| [^1]: See [`nativeAllowList`](https://neutralino.js.org/docs/configuration/neutralino.config.json#nativeallowlist-string) in the NeutralinoJS documentation | ||||
| [^2]: See [`os.showOpenDialog`](https://neutralino.js.org/docs/api/os#osshowopendialogtitle-options) in the NeutralinoJS documentation | ||||
|  | ||||
| @ -240,7 +240,7 @@ This demo was last tested in the following deployments: | ||||
| | Architecture | V8 Version    | Crate    | Date       | | ||||
| |:-------------|:--------------|:---------|:-----------| | ||||
| | `darwin-x64` | `11.8.172.13` | `0.79.2` | 2023-10-12 | | ||||
| | `darwin-arm` | `11.4.183.2`  | `0.71.2` | 2023-05-22 | | ||||
| | `darwin-arm` | `11.8.172.13` | `0.79.2` | 2023-10-18 | | ||||
| | `win10-x64`  | `11.8.172.13` | `0.79.2` | 2023-10-09 | | ||||
| | `win11-x64`  | `11.8.172.13` | `0.79.2` | 2023-10-14 | | ||||
| | `linux-x64`  | `11.8.172.13` | `0.79.2` | 2023-10-11 | | ||||
| @ -351,7 +351,7 @@ This demo was last tested in the following deployments: | ||||
| | Architecture | Version  | Date       | | ||||
| |:-------------|:---------|:-----------| | ||||
| | `darwin-x64` | `1.37.1` | 2023-10-12 | | ||||
| | `darwin-arm` | `1.34.1` | 2023-06-05 | | ||||
| | `darwin-arm` | `1.37.2` | 2023-10-18 | | ||||
| | `win10-x64`  | `1.37.1` | 2023-10-09 | | ||||
| | `win11-x64`  | `1.37.2` | 2023-10-14 | | ||||
| | `win11-arm`  | `1.37.0` | 2023-09-26 | | ||||
|  | ||||
| @ -39,7 +39,11 @@ production sites. | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 June 1 with `localForage` 1.10.0 | ||||
| This demo was last tested in the following environments: | ||||
| 
 | ||||
| | Browser     | Date       | `localForage` | | ||||
| |:------------|:-----------|:--------------| | ||||
| | Chrome 117  | 2023-10-18 | 1.10.0        | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -106,7 +110,11 @@ function SheetJSLocalForage() { | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested on 2023 June 1 with DexieJS 3.2.4 | ||||
| This demo was last tested in the following environments: | ||||
| 
 | ||||
| | Browser     | Date       | DexieJS | | ||||
| |:------------|:-----------|:--------| | ||||
| | Chrome 117  | 2023-10-18 | 3.2.4   | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -7,10 +7,36 @@ pagination_next: demos/extensions/index | ||||
| import current from '/version.js'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| Deno Deploy offers "Serverless Functions" powered by Deno. | ||||
| [Deno Deploy](https://dash.deno.com/) offers distributed "Serverless Functions" | ||||
| powered by Deno. | ||||
| 
 | ||||
| The [Deno installation](/docs/getting-started/installation/deno) instructions | ||||
| apply to Deno Deploy scripts. | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| This demo covers integration details. We'll explore how to load and use SheetJS | ||||
| scripts in Deno Deploy functions. | ||||
| 
 | ||||
| The ["Demo"](#demo) section includes build a sample service that converts XLSX | ||||
| and other types of spreadsheets to HTML tables and CSV rows. | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| When the demo was last tested, Deno Deploy required a GitHub account. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was last tested by SheetJS users on 2023 October 18. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Integration Details | ||||
| 
 | ||||
| The [SheetJS Deno module](/docs/getting-started/installation/nodejs) can be | ||||
| imported from Deno Deploy server scripts. | ||||
| 
 | ||||
| ### Supported Frameworks | ||||
| 
 | ||||
| :::warning pass | ||||
| 
 | ||||
| @ -20,17 +46,11 @@ This breaks web frameworks that use the filesystem in body parsing. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| When the demo was last tested, Deno Deploy required a GitHub account. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Supported Frameworks | ||||
| 
 | ||||
| When the demo was last tested, the `drash` server framework used an in-memory | ||||
| approach for parsing POST request bodies. | ||||
| 
 | ||||
| The [Drash demo](/docs/demos/net/server/drash) covers the framework in detail. | ||||
| 
 | ||||
| ### Parsing Data | ||||
| 
 | ||||
| When files are submitted via HTTP POST, the `bodyParam` method can fetch data. | ||||
| @ -41,7 +61,7 @@ The following example assumes the file is submitted at field name `file`: | ||||
| <CodeBlock language="ts">{`\ | ||||
| // @deno-types="https://cdn.sheetjs.com/xlsx-${current}/package/types/index.d.ts" | ||||
| import { read, utils } from 'https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs'; | ||||
| import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.0/mod.ts"; | ||||
| import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.1/mod.ts"; | ||||
| \n\ | ||||
| class SheetJSResource extends Drash.Resource { | ||||
|   public paths = ["/"]; | ||||
| @ -61,39 +81,43 @@ class SheetJSResource extends Drash.Resource { | ||||
| 
 | ||||
| ## Demo | ||||
| 
 | ||||
| :::note | ||||
| 0) Create a new GitHub account or sign into an existing account. | ||||
| 
 | ||||
| This demo was last tested on 2023 June 05. The service <https://s2c.sheetjs.com> | ||||
| was implemented using this exact sequence. | ||||
| 1) Open the [main Deno Deploy portal](https://dash.deno.com/) in a browser. | ||||
| 
 | ||||
| ::: | ||||
| 2) If the account never signed into Deno Deploy, click "Continue with Github". | ||||
| 
 | ||||
| 1) Register and Sign in. | ||||
| In the next screen, review the prompt and click "Authorize Deno Deploy" | ||||
| 
 | ||||
| 2) Click "New Project" to create a new Project. In the next screen, look for the | ||||
| "Hello World" sample and click the corresponding "Fork" button. | ||||
| 3) Click "New Playground" to create a new Playground. | ||||
| 
 | ||||
| 3) Download [`s2c.ts`](pathname:///deno/s2c.ts).  Open with a text editor and | ||||
| copy the contents into the playground editor (left pane). | ||||
| 4) Download [`s2c.ts`](pathname:///deno/s2c.ts). | ||||
| 
 | ||||
| 4) Click "Save and Deploy". | ||||
| 5) Open `s2c.ts` with a text editor and copy the contents of the source file | ||||
| into the playground editor (left pane in the browser). | ||||
| 
 | ||||
| 6) Click "Save and Deploy". When the demo was last tested, it was a blue button. | ||||
| 
 | ||||
| ### Testing | ||||
| 
 | ||||
| 5) Download the test file <https://sheetjs.com/pres.xlsx> | ||||
| 7) Wait until the server is deployed. When it is deployed, the right panel will | ||||
| show "SheetJS Spreadsheet Conversion Service": | ||||
| 
 | ||||
| 6) In the browser window, click "Choose File" and select the downloaded file. | ||||
| Click "Submit" and the page will show the contents in a HTML TABLE. | ||||
| >  | ||||
| 
 | ||||
| 7) Click the "Fullscreen" icon in the top-right corner of the page window. | ||||
| 8) Download the test file <https://sheetjs.com/pres.xlsx> | ||||
| 
 | ||||
| 8) Open a terminal window and download <https://sheetjs.com/pres.numbers>: | ||||
| 9) In the browser window, click "Choose File" and select the downloaded file. | ||||
| 
 | ||||
| 10) Click "Submit". The right panel will show the contents in a HTML TABLE. | ||||
| 
 | ||||
| 11) Open a terminal window and download <https://sheetjs.com/pres.numbers>: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://sheetjs.com/pres.numbers | ||||
| ``` | ||||
| 
 | ||||
| 9) Copy the first `curl` line from the page and run in the terminal. For | ||||
| 12) Copy the first `curl` line from the page and run in the terminal. For | ||||
| example, if the deployment is `clean-badger-69`, the command would be | ||||
| 
 | ||||
| ```bash | ||||
| @ -102,7 +126,7 @@ curl -X POST -F"file=@pres.numbers" https://clean-badger-69.deno.dev/ | ||||
| 
 | ||||
| The output will be an HTML table | ||||
| 
 | ||||
| 10) Copy the second `curl` line from the page and run in the terminal. For | ||||
| 13) Copy the second `curl` line from the page and run in the terminal. For | ||||
| example, if the deployment is `clean-badger-69`, the command would be | ||||
| 
 | ||||
| ```bash | ||||
|  | ||||
| @ -120,7 +120,7 @@ This demo was tested in the following deployments: | ||||
| | Architecture | Version | Date       | | ||||
| |:-------------|:--------|:-----------| | ||||
| | `darwin-x64` | `2.7.0` | 2023-07-24 | | ||||
| | `darwin-arm` | `2.7.0` | 2023-06-05 | | ||||
| | `darwin-arm` | `2.7.0` | 2023-10-18 | | ||||
| | `win10-x64`  | `2.7.0` | 2023-07-24 | | ||||
| | `win11-arm`  | `2.7.0` | 2023-09-26 | | ||||
| | `linux-x64`  | `2.7.0` | 2023-10-11 | | ||||
| @ -173,6 +173,20 @@ curl -LO https://docs.sheetjs.com/duk/sheetjs.duk.c | ||||
| gcc -std=c99 -Wall -osheetjs.duk sheetjs.duk.c duktape.c -lm | ||||
| ``` | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| GCC may generate a warning: | ||||
| 
 | ||||
| ``` | ||||
| duk_js_compiler.c:5628:13: warning: variable 'num_stmts' set but not used [-Wunused-but-set-variable] | ||||
|                 duk_int_t num_stmts; | ||||
|                           ^ | ||||
| ``` | ||||
| 
 | ||||
| This warning can be ignored. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem value="win" label="Windows"> | ||||
| 
 | ||||
|  | ||||
| @ -808,7 +808,7 @@ This demo was last tested in the following deployments: | ||||
| | Architecture | V8 Crate | Date       | | ||||
| |:-------------|:---------|:-----------| | ||||
| | `darwin-x64` | `0.75.1` | 2023-08-26 | | ||||
| | `darwin-arm` | `0.73.0` | 2023-06-05 | | ||||
| | `darwin-arm` | `0.79.2` | 2023-10-18 | | ||||
| | `win10-x64`  | `0.79.2` | 2023-10-09 | | ||||
| | `linux-x64`  | `0.79.2` | 2023-10-11 | | ||||
| | `linux-arm`  | `0.75.1` | 2023-08-30 | | ||||
|  | ||||
| @ -134,7 +134,7 @@ This demo was tested in the following environments: | ||||
| | Architecture | Swift   | Date       | | ||||
| |:-------------|:--------|:-----------| | ||||
| | `darwin-x64` | `5.8.1` | 2023-07-24 | | ||||
| | `darwin-arm` | `5.8.1` | 2023-06-05 | | ||||
| | `darwin-arm` | `5.9.0` | 2023-10-18 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -95,7 +95,7 @@ This demo was tested in the following deployments: | ||||
| | Architecture | Git Commit | Go version | Date       | | ||||
| |:-------------|:-----------|:-----------|:-----------| | ||||
| | `darwin-x64` | `873a149`  | `1.21.3`   | 2023-10-14 | | ||||
| | `darwin-arm` | `28ee0ee`  | `1.20.4`   | 2023-06-05 | | ||||
| | `darwin-arm` | `873a149`  | `1.21.3`   | 2023-10-18 | | ||||
| | `win10-x64`  | `81d7606`  | `1.20.2`   | 2023-08-27 | | ||||
| | `win11-arm`  | `fc55792`  | `1.21.1`   | 2023-09-25 | | ||||
| | `linux-x64`  | `fc55792`  | `1.21.3`   | 2023-10-11 | | ||||
|  | ||||
| @ -263,7 +263,7 @@ This demo was tested in the following deployments: | ||||
| | Architecture | Git Commit | Date       | | ||||
| |:-------------|:-----------|:-----------| | ||||
| | `darwin-x64` | `2788d71`  | 2023-07-24 | | ||||
| | `darwin-arm` | `2788d71`  | 2023-06-05 | | ||||
| | `darwin-arm` | `2788d71`  | 2023-10-18 | | ||||
| | `win10-x64`  | `2788d71`  | 2023-10-09 | | ||||
| | `win11-arm`  | `2788d71`  | 2023-09-25 | | ||||
| | `linux-x64`  | `2788d71`  | 2023-10-11 | | ||||
|  | ||||
| @ -363,7 +363,7 @@ This demo was tested in the following deployments: | ||||
| | Architecture | Git Commit | Date       | | ||||
| |:-------------|:-----------|:-----------| | ||||
| | `darwin-x64` | `70af78b`  | 2023-08-27 | | ||||
| | `darwin-arm` | `869312f`  | 2023-06-05 | | ||||
| | `darwin-arm` | `2b4f949`  | 2023-10-18 | | ||||
| | `linux-x64`  | `2b4f949`  | 2023-10-11 | | ||||
| | `linux-arm`  | `70af78b`  | 2023-08-27 | | ||||
| 
 | ||||
|  | ||||
| @ -120,11 +120,11 @@ in the [issue tracker](https://git.sheetjs.com/sheetjs/docs.sheetjs.com/issues) | ||||
| - [`bun`](/docs/demos/frontend/bundler#bun) | ||||
| - [`esbuild`](/docs/demos/frontend/bundler#esbuild) | ||||
| - [`parcel`](/docs/demos/frontend/bundler#parcel) | ||||
| - [`requirejs`](/docs/demos/frontend/bundler#requirejs) | ||||
| - [`requirejs`](/docs/demos/frontend/bundler/requirejs) | ||||
| - [`rollup`](/docs/demos/frontend/bundler#rollup) | ||||
| - [`snowpack`](/docs/demos/frontend/bundler#snowpack) | ||||
| - [`swc`](/docs/demos/frontend/bundler#swc) | ||||
| - [`systemjs`](/docs/demos/frontend/bundler#systemjs) | ||||
| - [`systemjs`](/docs/demos/frontend/bundler/systemjs) | ||||
| - [`vite`](/docs/demos/frontend/bundler#vite) | ||||
| - [`webpack`](/docs/demos/frontend/bundler/webpack) | ||||
| - [`wmr`](/docs/demos/frontend/bundler#wmr) | ||||
| @ -132,6 +132,7 @@ in the [issue tracker](https://git.sheetjs.com/sheetjs/docs.sheetjs.com/issues) | ||||
| ### Other Programming Languages | ||||
| 
 | ||||
| - [`JavaScript Engines`](/docs/demos/engines) | ||||
| - [`V8 (C++ / Rust)`](/docs/demos/engines/v8) | ||||
| - [`Duktape (C / Perl)`](/docs/demos/engines/duktape) | ||||
| - [`JavaScriptCore (Swift)`](/docs/demos/engines/jsc) | ||||
| - [`Rhino (Java)`](/docs/demos/engines/rhino) | ||||
|  | ||||
| @ -344,7 +344,7 @@ import * as XLSX from 'https://cdn.sheetjs.com/xlsx-${current}/package/xlsx.mjs' | ||||
| import * as cptable from 'https://cdn.sheetjs.com/xlsx-${current}/package/dist/cpexcel.full.mjs'; | ||||
| XLSX.set_cptable(cptable); | ||||
| \n\ | ||||
| import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.0/mod.ts"; | ||||
| import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.1/mod.ts"; | ||||
| \n\ | ||||
| class SheetResource extends Drash.Resource { | ||||
|   public paths = ["/"]; | ||||
|  | ||||
| @ -3,7 +3,7 @@ import { read, utils, set_cptable, version } from 'https://cdn.sheetjs.com/xlsx- | ||||
| import * as cptable from 'https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/cpexcel.full.mjs'; | ||||
| set_cptable(cptable); | ||||
| 
 | ||||
| import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.0/mod.ts"; | ||||
| import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.1/mod.ts"; | ||||
| 
 | ||||
| class SheetJSResource extends Drash.Resource { | ||||
|   public paths = ["/"]; | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								docz/static/deno/sshot.png
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/deno/sshot.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 170 KiB | 
| @ -4,7 +4,7 @@ | ||||
|   <body> | ||||
|     <h1>SheetJS Presidents Demo</h1> | ||||
|     <button id="xport">Click here to export</button> | ||||
|     <script src="http://requirejs.org/docs/release/2.3.3/comments/require.js"></script> | ||||
|     <script src="http://requirejs.org/docs/release/2.3.6/comments/require.js"></script> | ||||
|     <script> | ||||
| /* Wire up RequireJS */ | ||||
| require.config({ | ||||
| @ -14,7 +14,7 @@ require.config({ | ||||
|     xlsx: "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min" | ||||
|   } | ||||
| }); | ||||
| require(["xlsx"], function(XLSX) { | ||||
| require(["xlsx"], function(_XLSX) { | ||||
|   document.getElementById("xport").addEventListener("click", async() => { | ||||
|     /* fetch JSON data and parse */ | ||||
|     const url = "https://sheetjs.com/data/executive.json"; | ||||
|  | ||||
							
								
								
									
										55
									
								
								docz/static/systemjs/SheetJSystem.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										55
									
								
								docz/static/systemjs/SheetJSystem.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| const SystemJS = require('systemjs'); | ||||
| 
 | ||||
| /* old SystemJS behavior */ | ||||
| if(typeof SystemJS.config != "undefined") SystemJS.config({ map: { | ||||
|   'xlsx': 'node_modules/xlsx/xlsx.js', | ||||
|   'fs': '@node/fs', | ||||
|   'crypto': '@node/crypto', | ||||
|   'stream': '@empty' | ||||
| } }); | ||||
| /* new SystemJS behavior */ | ||||
| else SystemJS.applyImportMap(SystemJS.System, { | ||||
|   imports: { | ||||
|     'xlsx': "file://" + require("path").join(process.cwd(), 'node_modules/xlsx/xlsx.js'), | ||||
|     'fs': 'node:fs', | ||||
|     'crypto': 'node:crypto', | ||||
|     'stream': 'node:stream' | ||||
|   } | ||||
| }); | ||||
| 
 | ||||
| (typeof SystemJS.System != "undefined" ? SystemJS.System : SystemJS).import('xlsx').then(async function(_XLSX) { | ||||
|   if(typeof XLSX == "undefined") XLSX = _XLSX; | ||||
|   /* fetch JSON data and parse */ | ||||
|   const url = "https://sheetjs.com/data/executive.json"; | ||||
|   const raw_data = await (await fetch(url)).json(); | ||||
| 
 | ||||
|   /* filter for the Presidents */ | ||||
|   const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez")); | ||||
| 
 | ||||
|   /* sort by first presidential term */ | ||||
|   prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start); | ||||
|   prez.sort((l,r) => l.start.localeCompare(r.start)); | ||||
| 
 | ||||
|   /* flatten objects */ | ||||
|   const rows = prez.map(row => ({ | ||||
|     name: row.name.first + " " + row.name.last, | ||||
|     birthday: row.bio.birthday | ||||
|   })); | ||||
| 
 | ||||
|   /* generate worksheet and workbook */ | ||||
|   const worksheet = XLSX.utils.json_to_sheet(rows); | ||||
|   const workbook = XLSX.utils.book_new(); | ||||
|   XLSX.utils.book_append_sheet(workbook, worksheet, "Dates"); | ||||
| 
 | ||||
|   /* fix headers */ | ||||
|   XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" }); | ||||
| 
 | ||||
|   /* calculate column width */ | ||||
|   const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); | ||||
|   worksheet["!cols"] = [ { wch: max_width } ]; | ||||
| 
 | ||||
|   /* create an XLSX file and try to save to Presidents.xlsx */ | ||||
|   if(typeof XLSX.set_fs != "undefined") XLSX.set_fs(require("fs")); | ||||
|   XLSX.writeFile(workbook, "Presidents.xlsx"); | ||||
| 
 | ||||
| }); | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user