forked from sheetjs/docs.sheetjs.com
		
	worker
This commit is contained in:
		
							parent
							
								
									62cfee92ef
								
							
						
					
					
						commit
						e50dde6b20
					
				| @ -35,8 +35,6 @@ The `@deno-types` comment instructs Deno to use the type definitions. | ||||
| Older releases are technically available on [deno.land/x](https://deno.land/x/) | ||||
| but the Deno registry is out of date. | ||||
| 
 | ||||
| [This is a known registry bug](https://github.com/denoland/dotland/issues/2072) | ||||
| 
 | ||||
| <https://cdn.sheetjs.com/> is the authoritative source for SheetJS scripts. | ||||
| 
 | ||||
| ::: | ||||
|  | ||||
| @ -327,7 +327,7 @@ This example tries to separate the library-specific functions. | ||||
| 
 | ||||
| 0) **Follow the official React Native CLI Guide!** | ||||
| 
 | ||||
| Development Environment Guide: <http://reactnative.dev/docs/environment-setup> | ||||
| Development Environment Guide: <https://reactnative.dev/docs/environment-setup> | ||||
| 
 | ||||
| Follow the instructions for iOS and for Android.  They will cover installation | ||||
| and system configuration.  By the end, you should be able to run the sample app | ||||
| @ -676,7 +676,7 @@ on an iPhone SE 3rd generation. | ||||
| NativeScript will not safely transmit binary or UTF-8 strings. XLSB, NUMBERS, | ||||
| XLSX, XLS, ODS, SYLK, and DBF exports are known to be mangled. | ||||
| 
 | ||||
| [This is a known NativeScript bug](https://github.com/NativeScript/NativeScript/issues/9586) | ||||
| This is a known NativeScript bug. | ||||
| 
 | ||||
| This demo will focus on ASCII CSV files.  Once the bug is resolved, XLSX and | ||||
| other formats will be supported. | ||||
|  | ||||
| @ -142,7 +142,7 @@ This demo was tested against Electron 19.0.5 on an Intel Mac (`darwin-x64`). | ||||
| <details><summary><b>Complete Example</b> (click to show)</summary> | ||||
| 
 | ||||
| This demo includes a drag-and-drop box as well as a file input box, mirroring | ||||
| the [SheetJS Data Preview Live Demo](http://oss.sheetjs.com/sheetjs/) | ||||
| the [SheetJS Data Preview Live Demo](https://oss.sheetjs.com/sheetjs/) | ||||
| 
 | ||||
| The core data in this demo is an editable HTML table.  The readers build up the | ||||
| table using `sheet_to_html` (with `editable:true` option) and the writers scrape | ||||
| @ -336,7 +336,7 @@ backwards compatibility multiple times.  A summary of changes is noted below. | ||||
| 
 | ||||
| Electron 6.x changed the `dialog` API. Methods like `showSaveDialog` originally | ||||
| returned an array of strings, but now returns a `Promise`.  This change was not | ||||
| documented. [Electron issue](https://github.com/electron/electron/issues/24438) | ||||
| documented. | ||||
| 
 | ||||
| Electron 9.0.0 and later require the preference `nodeIntegration: true` in order | ||||
| to `require('xlsx')` in the renderer process. | ||||
| @ -1381,7 +1381,7 @@ At the time of writing, the latest supported React Native version was `v0.64.3` | ||||
| NodeJS `v16` is required.  There are OS-specific tools for downgrading: | ||||
| 
 | ||||
| - [`nvm-windows`](https://github.com/coreybutler/nvm-windows/releases) Windows | ||||
| - [`nvm`](https://github.com/nvm-sh/nvm/) Linux, MacOS, WSL, etc. | ||||
| - [`n`](https://github.com/tj/n/) Linux, MacOS, WSL, etc. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -275,9 +275,9 @@ export as XLSX. | ||||
| <Tabs> | ||||
|   <TabItem value="nodejs" label="NodeJS"> | ||||
| 
 | ||||
| [The `better-sqlite3` module](https://www.npmjs.com/package/better-sqlite3) | ||||
| provides a very simple API for working with SQLite databases.  `Statement#all` | ||||
| runs a prepared statement and returns an array of JS objects. | ||||
| The **`better-sqlite3`** module provides a very simple API for working with | ||||
| SQLite databases. `Statement#all` runs a prepared statement and returns an array | ||||
| of JS objects. | ||||
| 
 | ||||
| 1) Install the dependencies: | ||||
| 
 | ||||
| @ -440,7 +440,7 @@ WebSQL was a popular SQL-based in-browser database available on Chrome.  In | ||||
| practice, it is powered by SQLite, and most simple SQLite-compatible queries | ||||
| work as-is in WebSQL. | ||||
| 
 | ||||
| The public demo <http://sheetjs.com/sql> generates a database from workbook. | ||||
| The public demo <https://sheetjs.com/sql> generates a database from workbook. | ||||
| 
 | ||||
| Importing data from spreadsheets is straightforward using the `generate_sql` | ||||
| helper function from ["Building Schemas"](#building-schemas-from-worksheets): | ||||
| @ -783,7 +783,7 @@ MongoDB is a popular document-oriented database engine. | ||||
| It is straightforward to treat collections as worksheets.  Each object maps to | ||||
| a row in the table. | ||||
| 
 | ||||
| The official NodeJS connector is [`mongodb` on NPM](https://npm.im/mongodb). | ||||
| The official NodeJS connector is **`mongodb`**. | ||||
| 
 | ||||
| Worksheets can be generated from collections by using `Collection#find`.  A | ||||
| `projection` can suppress the object ID field: | ||||
|  | ||||
							
								
								
									
										219
									
								
								docz/docs/03-demos/07-worker.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										219
									
								
								docz/docs/03-demos/07-worker.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,219 @@ | ||||
| --- | ||||
| title: Web Workers | ||||
| --- | ||||
| 
 | ||||
| Parsing and writing large spreadsheets takes time. During the process, if the | ||||
| SheetJS library is running in the web browser, the website may freeze. | ||||
| 
 | ||||
| Workers provide a way to off-load the hard work so that the website does not | ||||
| freeze during processing. | ||||
| 
 | ||||
| :::note Browser Compatibility | ||||
| 
 | ||||
| IE10+ and modern browsers support basic Web Workers. Some APIs like `fetch` were | ||||
| added later.  Feature testing is highly recommended. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Installation | ||||
| 
 | ||||
| In all cases, `importScripts` can load the [Standalone scripts](../getting-started/installation/standalone) | ||||
| 
 | ||||
| ```js | ||||
| importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"); | ||||
| ``` | ||||
| 
 | ||||
| For production use, it is highly encouraged to download and host the script. | ||||
| 
 | ||||
| ## Downloading a Remote File | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| `fetch` was enabled in Web Workers in Chrome 42 and Safari 10.3 | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| Typically the Web Worker performs the `fetch` operation, processes the workbook, | ||||
| and sends a final result to the main browser context for processing. | ||||
| 
 | ||||
| In the following example, the script: | ||||
| 
 | ||||
| - downloads <https://sheetjs.com/pres.numbers> in a Web Worker | ||||
| - loads the SheetJS library and parses the file in the Worker | ||||
| - generates an HTML string of the first table in the Worker | ||||
| - sends the string to the main browser context | ||||
| - adds the HTML to the page in the main browser context | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSFetchDLWorker() { | ||||
|   const [html, setHTML] = React.useState(""); | ||||
| 
 | ||||
|   return ( <> | ||||
|     <button onClick={() => { | ||||
|       /* this mantra embeds the worker source in the function */ | ||||
|       const worker = new Worker(URL.createObjectURL(new Blob([`\ | ||||
| /* load standalone script from CDN */ | ||||
| importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"); | ||||
| 
 | ||||
| /* this callback will run once the main context sends a message */ | ||||
| self.addEventListener('message', async(e) => { | ||||
|   try { | ||||
|     /* Fetch file */ | ||||
|     const res = await fetch("https://sheetjs.com/pres.numbers"); | ||||
|     const ab = await res.arrayBuffer(); | ||||
| 
 | ||||
|     /* Parse file */ | ||||
|     const wb = XLSX.read(ab); | ||||
|     const ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 
 | ||||
|     /* Generate HTML */ | ||||
|     const html = XLSX.utils.sheet_to_html(ws); | ||||
| 
 | ||||
|     /* Reply with result */ | ||||
|     postMessage({html: html}); | ||||
|   } catch(e) { | ||||
|     /* Pass the error message back */ | ||||
|     postMessage({html: String(e.message || e).bold() }); | ||||
|   } | ||||
| }, false); | ||||
|       `]))); | ||||
|       /* when the worker sends back the HTML, add it to the DOM */ | ||||
|       worker.onmessage = function(e) { setHTML(e.data.html); }; | ||||
|       /* post a message to the worker */ | ||||
|       worker.postMessage({}); | ||||
|     }}><b>Click to Start</b></button> | ||||
|     <div dangerouslySetInnerHTML={{__html: html}}/> | ||||
|   </> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## Creating a Local File | ||||
| 
 | ||||
| :::caution `XLSX.writeFile` | ||||
| 
 | ||||
| `XLSX.writeFile` will not work in Web Workers!  Raw file data can be passed from | ||||
| the Web Worker to the main browser context for downloading. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| In the following example, the script: | ||||
| 
 | ||||
| - generates a workbook object in the Web Worker | ||||
| - generates a XLSB file using `XLSX.write` in the Web Worker | ||||
| - sends the file (`Uint8Array`) to the main browser context | ||||
| - performs a download action in the main browser context | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSWriteFileWorker() { | ||||
|   const [html, setHTML] = React.useState(""); | ||||
| 
 | ||||
|   return ( <> | ||||
|     <button onClick={() => { setHTML(""); | ||||
|       /* this mantra embeds the worker source in the function */ | ||||
|       const worker = new Worker(URL.createObjectURL(new Blob([`\ | ||||
| /* load standalone script from CDN */ | ||||
| importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"); | ||||
| 
 | ||||
| /* this callback will run once the main context sends a message */ | ||||
| self.addEventListener('message', async(e) => { | ||||
|   try { | ||||
|     /* Create a new Workbook (in this case, from a CSV string) */ | ||||
|     const csv = \`\ | ||||
| SheetJS,in,Web,Workers | ||||
| வணக்கம்,สวัสดี,你好,가지마 | ||||
| 1,2,3,4\`; | ||||
|     const wb = XLSX.read(csv, { type: "string" }); | ||||
| 
 | ||||
|     /* Write XLSB data */ | ||||
|     const u8 = XLSX.write(wb, { bookType: "xlsb", type: "buffer" }); | ||||
| 
 | ||||
|     /* Reply with result */ | ||||
|     postMessage({data: u8}); | ||||
|   } catch(e) { | ||||
|     /* Pass the error message back */ | ||||
|     postMessage({error: String(e.message || e).bold() }); | ||||
|   } | ||||
| }, false); | ||||
|       `]))); | ||||
|       /* when the worker sends back the data, create a download */ | ||||
|       worker.onmessage = function(e) { | ||||
|         if(e.data.error) return setHTML(e.data.error); | ||||
| 
 | ||||
|         /* this mantra is the standard HTML5 download attribute technique */ | ||||
|         const a = document.createElement("a"); | ||||
|         a.download = "SheetJSWriteFileWorker.xlsb"; | ||||
|         a.href = URL.createObjectURL(new Blob([e.data.data])); | ||||
|         document.body.appendChild(a); | ||||
|         a.click(); | ||||
|         document.body.removeChild(a); | ||||
|       }; | ||||
|       /* post a message to the worker */ | ||||
|       worker.postMessage({}); | ||||
|     }}><b>Click to Start</b></button> | ||||
|     <div dangerouslySetInnerHTML={{__html: html}}/> | ||||
|   </> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## User-Submitted File | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| Typically `FileReader` is used in the main browser context. In Web Workers, the | ||||
| synchronous version `FileReaderSync` is more efficient. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| In the following example, the script: | ||||
| 
 | ||||
| - waits for the user to drag-drop a file into a DIV | ||||
| - sends the `File` object to the Web Worker | ||||
| - loads the SheetJS library and parses the file in the Worker | ||||
| - generates an HTML string of the first table in the Worker | ||||
| - sends the string to the main browser context | ||||
| - adds the HTML to the page in the main browser context | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSDragDropWorker() { | ||||
|   const [html, setHTML] = React.useState(""); | ||||
|   /* suppress default behavior for dragover and drop */ | ||||
|   function suppress(e) { e.stopPropagation(); e.preventDefault(); } | ||||
|   return ( <> | ||||
|     <div onDragOver={suppress} onDrop={(e) => { | ||||
|       suppress(e); | ||||
| 
 | ||||
|       /* this mantra embeds the worker source in the function */ | ||||
|       const worker = new Worker(URL.createObjectURL(new Blob([`\ | ||||
| /* load standalone script from CDN */ | ||||
| importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"); | ||||
| 
 | ||||
| /* this callback will run once the main context sends a message */ | ||||
| self.addEventListener('message', async(e) => { | ||||
|   try { | ||||
|     /* Read file data */ | ||||
|     const ab = new FileReaderSync().readAsArrayBuffer(e.data.file); | ||||
| 
 | ||||
|     /* Parse file */ | ||||
|     const wb = XLSX.read(ab); | ||||
|     const ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 
 | ||||
|     /* Generate HTML */ | ||||
|     const html = XLSX.utils.sheet_to_html(ws); | ||||
| 
 | ||||
|     /* Reply with result */ | ||||
|     postMessage({html: html}); | ||||
|   } catch(e) { | ||||
|     /* Pass the error message back */ | ||||
|     postMessage({html: String(e.message || e).bold() }); | ||||
|   } | ||||
| }, false); | ||||
|       `]))); | ||||
|       /* when the worker sends back the HTML, add it to the DOM */ | ||||
|       worker.onmessage = function(e) { setHTML(e.data.html); }; | ||||
|       /* post a message with the first File to the worker */ | ||||
|       worker.postMessage({ file: e.dataTransfer.files[0] }); | ||||
|     }}>Drag a file to this DIV to process!</div> | ||||
|     <div dangerouslySetInnerHTML={{__html: html}}/> | ||||
|   </> ); | ||||
| } | ||||
| ``` | ||||
| @ -230,7 +230,7 @@ Google and the Angular team. | ||||
| 
 | ||||
| The Angular tooling provides no easy way to switch between versions! | ||||
| 
 | ||||
| [This is a known Angular problem](https://github.com/angular/angular-cli/issues/9047) | ||||
| This is a known Angular problem. | ||||
| 
 | ||||
| To work around this, [`SheetJSAngular.zip`](pathname:///angular/SheetJSAngular.zip) | ||||
| is a skeleton project designed to play nice with each Angular version. | ||||
|  | ||||
| @ -349,9 +349,8 @@ Parcel should play nice with SheetJS out of the box. | ||||
| 
 | ||||
| :::warning Parcel Bug | ||||
| 
 | ||||
| Errors of the form `Could not statically evaluate fs call` stem from a | ||||
| [parcel bug](https://github.com/parcel-bundler/parcel/pull/523). Upgrade to | ||||
| Parcel version 1.5.0 or later. | ||||
| Errors of the form `Could not statically evaluate fs call` stem from a Parcel | ||||
| bug. Upgrade to Parcel version 1.5.0 or later. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -68,24 +68,6 @@ const u8 = XLSX.write(workbook, { type: "buffer", bookType: "xlsx" }); | ||||
| const blob = new Blob([u8], { type: "application/vnd.ms-excel" }); | ||||
| ``` | ||||
| 
 | ||||
| ## Web Workers | ||||
| 
 | ||||
| :::warning | ||||
| 
 | ||||
| **None of the browser methods work from Web Worker contexts!** | ||||
| 
 | ||||
| Data operations with the Web APIs must happen in the browser main thread. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| Web Workers and main thread can transfer `ArrayBuffer` or `Uint8Array` objects. | ||||
| 
 | ||||
| When generating a file, the worker will call `XLSX.write` with type `buffer` | ||||
| and transfer the result to the main thread to initiate a download. | ||||
| 
 | ||||
| When parsing a file, the main thread will use the web API to read a `File` or | ||||
| `Blob`, extract the underlying `ArrayBuffer` and transfer to the Web Worker. | ||||
| 
 | ||||
| ## HTML5 Download Attribute | ||||
| 
 | ||||
| _Writing Files_ | ||||
|  | ||||
| @ -176,7 +176,7 @@ import * as XLSX from 'https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs'; | ||||
| ``` | ||||
| 
 | ||||
| The official registry endpoint <https://deno.land/x/sheetjs> is out of date. | ||||
| [This is a known registry bug](https://github.com/denoland/dotland/issues/2072) | ||||
| This is a known registry bug. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -12,11 +12,12 @@ run in the web browser, demos will include interactive examples. | ||||
| 
 | ||||
| - [`XMLHttpRequest and fetch`](./network) | ||||
| - [`Clipboard Data`](./clipboard) | ||||
| - [`Web Workers`](./worker) | ||||
| - [`Typed Arrays for Machine Learning`](./ml) | ||||
| - [`Local File Access`](./localfile) | ||||
| - [`LocalStorage and SessionStorage`](./database#localstorage-and-sessionstorage) | ||||
| - [`Web SQL Database`](./database#websql) | ||||
| - [`IndexedDB`](./database#indexeddb) | ||||
| - [`Local File Access`](./localfile) | ||||
| 
 | ||||
| ### Frameworks | ||||
| 
 | ||||
| @ -36,6 +37,7 @@ run in the web browser, demos will include interactive examples. | ||||
| - [`vue3-table-lite`](./grid#vue3-table-lite) | ||||
| - [`angular-ui-grid`](./grid#angular-ui-grid) | ||||
| - [`material ui`](./grid#material-ui-table) | ||||
| 
 | ||||
| ### Platforms and Integrations | ||||
| 
 | ||||
| - [`Command-Line Tools`](./cli) | ||||
|  | ||||
| @ -301,7 +301,7 @@ The [`oldie` demo](../demos/legacy#internet-explorer) shows an IE-compatible fal | ||||
|   <TabItem value="nodejs" label="NodeJS"> | ||||
| 
 | ||||
| `read` can accept a NodeJS buffer.  `readFile` can read files generated by a | ||||
| HTTP POST request body parser like [`formidable`](https://npm.im/formidable): | ||||
| HTTP POST request body parser like **`formidable`**: | ||||
| 
 | ||||
| ```js | ||||
| const XLSX = require("xlsx"); | ||||
| @ -444,7 +444,7 @@ const workbook = XLSX.read(data); | ||||
| 
 | ||||
| For broader compatibility, third-party modules are recommended. | ||||
| 
 | ||||
| [`request`](https://npm.im/request) requires a `null` encoding to yield Buffers: | ||||
| **`request`** requires a `null` encoding to yield Buffers: | ||||
| 
 | ||||
| ```js | ||||
| var XLSX = require("xlsx"); | ||||
| @ -458,7 +458,7 @@ request({url: url, encoding: null}, function(err, resp, body) { | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| [`axios`](https://axios-http.com/) works the same way in browser and in NodeJS: | ||||
| **`axios`** works the same way in browser and in NodeJS: | ||||
| 
 | ||||
| ```js | ||||
| const XLSX = require("xlsx"); | ||||
| @ -861,7 +861,7 @@ chrome.runtime.onMessage.addListener(function(msg, sender, cb) { | ||||
|   <summary><b>NodeJS HTML Tables without a browser</b> (click to show)</summary> | ||||
| 
 | ||||
| NodeJS does not include a DOM implementation and Puppeteer requires a hefty | ||||
| Chromium build.  [`jsdom`](https://npm.im/jsdom) is a lightweight alternative: | ||||
| Chromium build.  **`jsdom`** is a lightweight alternative: | ||||
| 
 | ||||
| ```js | ||||
| const XLSX = require("xlsx"); | ||||
|  | ||||
| @ -10,9 +10,9 @@ title: API Reference | ||||
| 
 | ||||
| `XLSX.version` is the version of the library (added by the build script). | ||||
| 
 | ||||
| `XLSX.SSF` is an embedded version of the [format library](https://github.com/SheetJS/sheetjs/tree/master/packages/ssf). | ||||
| `XLSX.SSF` is an embedded version of the [format library](https://git.sheetjs.com/sheetjs/sheetjs/src/branch/master/packages/ssf). | ||||
| 
 | ||||
| `XLSX.CFB` is an embedded version of the [container library](https://github.com/sheetjs/js-cfb). | ||||
| `XLSX.CFB` is an embedded version of the [container library](https://git.sheetjs.com/sheetjs/js-cfb). | ||||
| 
 | ||||
| ## Parsing functions | ||||
| 
 | ||||
|  | ||||
| @ -6,7 +6,14 @@ hide_table_of_contents: true | ||||
| 
 | ||||
| The official source code repository is <https://git.sheetjs.com/sheetjs/sheetjs> | ||||
| 
 | ||||
| Mirrors: | ||||
| :::note Mirrors | ||||
| 
 | ||||
| Older snapshots of the source code repository are available at various hosts: | ||||
| 
 | ||||
| - [GitHub](https://github.com/sheetjs/sheetjs) | ||||
| - [GitLab](https://gitlab.com/sheetjs/sheetjs) | ||||
| - [BitBucket](https://bitbucket.org/sheetjs/sheetjs) | ||||
| 
 | ||||
| <https://git.sheetjs.com/sheetjs/sheetjs> is the authoritative repository. | ||||
| 
 | ||||
| ::: | ||||
| @ -5,7 +5,7 @@ sidebar_position: 5 | ||||
| # Contributing | ||||
| 
 | ||||
| Due to the precarious nature of the Open Specifications Promise, it is very | ||||
| important to ensure code is cleanroom.  [Contribution Notes](https://raw.githubusercontent.com/SheetJS/sheetjs/master/CONTRIBUTING.md) | ||||
| important to ensure code is cleanroom.  [Contribution Notes](https://git.sheetjs.com/sheetjs/sheetjs/src/branch/master/CONTRIBUTING.md) | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>File organization</b> (click to show)</summary> | ||||
|  | ||||
							
								
								
									
										23
									
								
								docz/static/live/fetch.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										23
									
								
								docz/static/live/fetch.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| <body> | ||||
|   <style>TABLE { border-collapse: collapse; } TD { border: 1px solid; }</style> | ||||
|   <div id="tavolo"></div> | ||||
|   <script src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"></script> | ||||
|   <script type="text/javascript"> | ||||
| (async() => { | ||||
|   /* fetch and parse workbook -- see the fetch example for details */ | ||||
|   const workbook = XLSX.read(await (await fetch("https://sheetjs.com/pres.numbers")).arrayBuffer()); | ||||
| 
 | ||||
|   let output = []; | ||||
|   /* loop through the worksheet names in order */ | ||||
|   workbook.SheetNames.forEach(name => { | ||||
|     /* generate HTML from the corresponding worksheets */ | ||||
|     const worksheet = workbook.Sheets[name]; | ||||
|     const html = XLSX.utils.sheet_to_html(worksheet); | ||||
|     /* add a header with the title name followed by the table */ | ||||
|     output.push(`<H3>${name}</H3>${html}`); | ||||
|   }); | ||||
|   /* write to the DOM at the end */ | ||||
|   tavolo.innerHTML = output.join("\n"); | ||||
| })(); | ||||
|   </script> | ||||
| </body> | ||||
							
								
								
									
										38
									
								
								docz/static/react/fetch.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										38
									
								
								docz/static/react/fetch.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- sheetjs (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html lang="en" style="height: 100%"> | ||||
| <body> | ||||
| <style>TABLE { border-collapse: collapse; } TD { border: 1px solid; }</style> | ||||
| <script src="https://unpkg.com/react@17/umd/react.development.js"></script> | ||||
| <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> | ||||
| <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> | ||||
| <script src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"></script> | ||||
| <div id="root"></div> | ||||
| 
 | ||||
| <script type="text/babel"> | ||||
| function Titel(props) { return ( <h3>{props.name}</h3> ); } | ||||
| 
 | ||||
| function Tabeller(props) { | ||||
|   /* the workbook object is the state */ | ||||
|   const [workbook, setWorkbook] = React.useState(XLSX.utils.book_new()); | ||||
| 
 | ||||
|   React.useEffect(() => { (async() => { | ||||
|     /* fetch and parse workbook -- see the fetch example for details */ | ||||
|     const wb = XLSX.read(await (await fetch("https://sheetjs.com/pres.numbers")).arrayBuffer()); | ||||
|     setWorkbook(wb); | ||||
|   })(); }); | ||||
| 
 | ||||
|   return workbook.SheetNames.map((name, idx) => ( <div key={idx}> | ||||
|     <Titel name={name} /> | ||||
|     <div dangerouslySetInnerHTML={{ | ||||
|       /* this __html mantra is needed to set the inner HTML */ | ||||
|       __html: XLSX.utils.sheet_to_html(workbook.Sheets[name]) | ||||
|     }} /> | ||||
|   </div>)); | ||||
| } | ||||
| 
 | ||||
| ReactDOM.render( <Tabeller/> , root ); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										43
									
								
								docz/static/vue/fetch.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										43
									
								
								docz/static/vue/fetch.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- sheetjs (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html lang="en" style="height: 100%"> | ||||
| <body> | ||||
| <style>TABLE { border-collapse: collapse; } TD { border: 1px solid; }</style> | ||||
| <script type="importmap">{ | ||||
|   "imports": { | ||||
|     "vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js", | ||||
|     "xlsx": "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs" | ||||
|   } | ||||
| }</script> | ||||
| <div id="root"></div> | ||||
| 
 | ||||
| <script type="module"> | ||||
| import { createApp, reactive } from 'vue'; | ||||
| import { read, utils } from 'xlsx'; | ||||
| 
 | ||||
| const S5SComponent = { | ||||
|   mounted() { (async() => { | ||||
|     /* fetch and parse workbook -- see the fetch example for details */ | ||||
|     const workbook = read(await (await fetch("https://sheetjs.com/pres.numbers")).arrayBuffer()); | ||||
|     /* loop through the worksheet names in order */ | ||||
|     workbook.SheetNames.forEach(name => { | ||||
|       /* generate HTML from the corresponding worksheets */ | ||||
|       const html = utils.sheet_to_html(workbook.Sheets[name]); | ||||
|       /* add to state */ | ||||
|       this.wb.wb.push({ name, html }); | ||||
|     }); | ||||
|   })(); }, | ||||
|   /* this state mantra is required for array updates to work */ | ||||
|   setup() { return { wb: reactive({ wb: [] }) }; }, | ||||
|   template: ` | ||||
|   <div v-for="ws in wb.wb" :key="ws.name"> | ||||
|     <h3>{{ ws.name }}</h3> | ||||
|     <div v-html="ws.html"></div> | ||||
|   </div>` | ||||
| }; | ||||
| 
 | ||||
| createApp(S5SComponent).mount('#root'); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user