forked from sheetjs/sheetjs
		
	XLSX custprops strip ns [ci skip]
This commit is contained in:
		
							parent
							
								
									838ee58a49
								
							
						
					
					
						commit
						917a69e394
					
				| @ -5,7 +5,7 @@ function parse_cust_props(data/*:string*/, opts) { | ||||
| 	var m = data.match(custregex); | ||||
| 	if(m) for(var i = 0; i != m.length; ++i) { | ||||
| 		var x = m[i], y = parsexmltag(x); | ||||
| 		switch(y[0]) { | ||||
| 		switch(strip_ns(y[0])) { | ||||
| 			case '<?xml': break; | ||||
| 			case '<Properties': break; | ||||
| 			case '<property': name = unescapexml(y.name); break; | ||||
|  | ||||
| @ -18,57 +18,60 @@ can be installed with Bash on Windows or with `cygwin`. | ||||
| ### Included Demos | ||||
| 
 | ||||
| **JavaScript APIs** | ||||
| - [`XMLHttpRequest and fetch`](https://docs.sheetjs.com/docs/getting-started/demos/network) | ||||
| - [`Clipboard Data`](https://docs.sheetjs.com/docs/getting-started/demos/clipboard) | ||||
| - [`Typed Arrays for Machine Learning`](https://docs.sheetjs.com/docs/getting-started/demos/ml) | ||||
| - [`LocalStorage and SessionStorage`](https://docs.sheetjs.com/docs/getting-started/demos/database#localstorage-and-sessionstorage) | ||||
| - [`Web SQL Database`](https://docs.sheetjs.com/docs/getting-started/demos/database#websql) | ||||
| - [`IndexedDB`](https://docs.sheetjs.com/docs/getting-started/demos/database#indexeddb) | ||||
| - [`XMLHttpRequest and fetch`](https://docs.sheetjs.com/docs/demos/network) | ||||
| - [`Clipboard Data`](https://docs.sheetjs.com/docs/demos/clipboard) | ||||
| - [`Typed Arrays for Machine Learning`](https://docs.sheetjs.com/docs/demos/ml) | ||||
| - [`LocalStorage and SessionStorage`](https://docs.sheetjs.com/docs/demos/database#localstorage-and-sessionstorage) | ||||
| - [`Web SQL Database`](https://docs.sheetjs.com/docs/demos/database#websql) | ||||
| - [`IndexedDB`](https://docs.sheetjs.com/docs/demos/database#indexeddb) | ||||
| 
 | ||||
| **Frameworks** | ||||
| - [`Angular.JS`](https://docs.sheetjs.com/docs/getting-started/demos/legacy#angularjs) | ||||
| - [`Angular.JS`](https://docs.sheetjs.com/docs/demos/legacy#angularjs) | ||||
| - [`Angular 2+ and Ionic`](angular2/) | ||||
| - [`Knockout`](https://docs.sheetjs.com/docs/getting-started/demos/legacy#knockoutjs) | ||||
| - [`React, React Native and NextJS`](react/) | ||||
| - [`VueJS, WeeX and NuxtJS`](vue/) | ||||
| - [`Knockout`](https://docs.sheetjs.com/docs/demos/legacy#knockoutjs) | ||||
| - [`React and NextJS`](react/) | ||||
| - [`VueJS`](vue/) | ||||
| 
 | ||||
| **Front-End UI Components** | ||||
| - [`canvas-datagrid`](https://docs.sheetjs.com/docs/getting-started/demos/grid#canvas-datagrid) | ||||
| - [`canvas-datagrid`](https://docs.sheetjs.com/docs/demos/grid#canvas-datagrid) | ||||
| - [`x-spreadsheet`](xspreadsheet/) | ||||
| - [`react-data-grid`](react/modify/) | ||||
| - [`vue3-table-light`](vue/modify/) | ||||
| - [`angular-ui-grid`](https://docs.sheetjs.com/docs/getting-started/demos/grid#angular-ui-grid) | ||||
| - [`angular-ui-grid`](https://docs.sheetjs.com/docs/demos/grid#angular-ui-grid) | ||||
| 
 | ||||
| **Platforms and Integrations** | ||||
| - [`Command-Line Tools`](https://docs.sheetjs.com/docs/getting-started/demos/cli) | ||||
| - [`Command-Line Tools`](https://docs.sheetjs.com/docs/demos/cli) | ||||
| - [`iOS and Android Mobile Applications`](https://docs.sheetjs.com/docs/demos/mobile) | ||||
| - [`NodeJS Server-Side Processing`](server/) | ||||
| - [`Electron`](https://docs.sheetjs.com/docs/getting-started/demos/desktop#electron) | ||||
| - [`NW.js`](https://docs.sheetjs.com/docs/getting-started/demos/desktop#nwjs) | ||||
| - [`Chrome / Chromium Extension`](https://docs.sheetjs.com/docs/getting-started/demos/chromium) | ||||
| - [`Google Sheets API`](https://docs.sheetjs.com/docs/getting-started/demos/gsheet) | ||||
| - [`ExtendScript for Adobe Apps`](https://docs.sheetjs.com/docs/getting-started/demos/extendscript) | ||||
| - [`NetSuite SuiteScript`](https://docs.sheetjs.com/docs/getting-started/demos/netsuite) | ||||
| - [`SalesForce Lightning Web Components`](https://docs.sheetjs.com/docs/getting-started/demos/salesforce) | ||||
| - [`Excel JavaScript API`](https://docs.sheetjs.com/docs/getting-started/demos/excel) | ||||
| - [`Headless Automation`](https://docs.sheetjs.com/docs/getting-started/demos/headless) | ||||
| - [`Swift JSC and Other JavaScript Engines`](https://docs.sheetjs.com/docs/getting-started/demos/engines) | ||||
| - [`Content Management and Static Sites`](https://docs.sheetjs.com/docs/demos/content) | ||||
| - [`Electron`](https://docs.sheetjs.com/docs/demos/desktop#electron) | ||||
| - [`NW.js`](https://docs.sheetjs.com/docs/demos/desktop#nwjs) | ||||
| - [`Tauri`](https://docs.sheetjs.com/docs/demos/desktop#tauri) | ||||
| - [`Chrome and Chromium Extensions`](https://docs.sheetjs.com/docs/demos/chromium) | ||||
| - [`Google Sheets API`](https://docs.sheetjs.com/docs/demos/gsheet) | ||||
| - [`ExtendScript for Adobe Apps`](https://docs.sheetjs.com/docs/demos/extendscript) | ||||
| - [`NetSuite SuiteScript`](https://docs.sheetjs.com/docs/demos/netsuite) | ||||
| - [`SalesForce Lightning Web Components`](https://docs.sheetjs.com/docs/demos/salesforce) | ||||
| - [`Excel JavaScript API`](https://docs.sheetjs.com/docs/demos/excel) | ||||
| - [`Headless Automation`](https://docs.sheetjs.com/docs/demos/headless) | ||||
| - [`Swift JSC and Other JavaScript Engines`](https://docs.sheetjs.com/docs/demos/engines) | ||||
| - [`"serverless" functions`](function/) | ||||
| - [`Databases and Structured Data Stores`](https://docs.sheetjs.com/docs/getting-started/demos/database) | ||||
| - [`NoSQL, K/V, and Unstructured Data Stores`](https://docs.sheetjs.com/docs/getting-started/demos/nosql) | ||||
| - [`Legacy Internet Explorer`](oldie/) | ||||
| - [`Databases and Structured Data Stores`](https://docs.sheetjs.com/docs/demos/database) | ||||
| - [`NoSQL and Unstructured Data Stores`](https://docs.sheetjs.com/docs/demos/nosql) | ||||
| - [`Legacy Internet Explorer`](https://docs.sheetjs.com/docs/demos/legacy#internet-explorer) | ||||
| 
 | ||||
| **Bundlers and Tooling** | ||||
| - [`browserify`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#browserify) | ||||
| - [`bun`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#bun) | ||||
| - [`esbuild`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#esbuild) | ||||
| - [`parcel`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#parcel) | ||||
| - [`requirejs`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#requirejs) | ||||
| - [`rollup`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#rollup) | ||||
| - [`snowpack`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#snowpack) | ||||
| - [`swc`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#swc) | ||||
| - [`systemjs`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#systemjs) | ||||
| - [`vite`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#vite) | ||||
| - [`webpack`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#webpack) | ||||
| - [`wmr`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#wmr) | ||||
| - [`browserify`](https://docs.sheetjs.com/docs/demos/bundler#browserify) | ||||
| - [`bun`](https://docs.sheetjs.com/docs/demos/bundler#bun) | ||||
| - [`esbuild`](https://docs.sheetjs.com/docs/demos/bundler#esbuild) | ||||
| - [`parcel`](https://docs.sheetjs.com/docs/demos/bundler#parcel) | ||||
| - [`requirejs`](https://docs.sheetjs.com/docs/demos/bundler#requirejs) | ||||
| - [`rollup`](https://docs.sheetjs.com/docs/demos/bundler#rollup) | ||||
| - [`snowpack`](https://docs.sheetjs.com/docs/demos/bundler#snowpack) | ||||
| - [`swc`](https://docs.sheetjs.com/docs/demos/bundler#swc) | ||||
| - [`systemjs`](https://docs.sheetjs.com/docs/demos/bundler#systemjs) | ||||
| - [`vite`](https://docs.sheetjs.com/docs/demos/bundler#vite) | ||||
| - [`webpack`](https://docs.sheetjs.com/docs/demos/bundler#webpack) | ||||
| - [`wmr`](https://docs.sheetjs.com/docs/demos/bundler#wmr) | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Other JS Engines and Deployments | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/engines) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/engines) | ||||
| includes more detailed instructions and more JS engines. | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -2,9 +2,9 @@ | ||||
| 
 | ||||
| The content has been reorganized; | ||||
| 
 | ||||
| - [The "Legacy Frameworks" section](https://docs.sheetjs.com/docs/getting-started/demos/legacy#angularjs) | ||||
| - [The "Legacy Frameworks" section](https://docs.sheetjs.com/docs/demos/legacy#angularjs) | ||||
|   covers the AngularJS basics. | ||||
| - [The "Angular UI Grid" section](https://docs.sheetjs.com/docs/getting-started/demos/legacy#angularjs) | ||||
| - [The "Angular UI Grid" section](https://docs.sheetjs.com/docs/demos/legacy#angularjs) | ||||
|   covers the integration with Angular UI Grid. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -32,14 +32,3 @@ ios browser: ionic | ||||
| android: ionic | ||||
| 	cd SheetJSIonic; ionic cordova prepare $@ </dev/null; ionic cordova emulate $@ </dev/null; cd - | ||||
| 
 | ||||
| 
 | ||||
| .PHONY: nativescript | ||||
| nativescript: | ||||
| 	bash ./nscript.sh | ||||
| 
 | ||||
| .PHONY: ns-ios ns-android | ||||
| ns-ios: nativescript | ||||
| 	cd SheetJSNS; ns run ios; cd - | ||||
| ns-android: nativescript | ||||
| 	cd SheetJSNS; ns run android; cd - | ||||
| 
 | ||||
|  | ||||
| @ -101,24 +101,9 @@ $ npm install --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz | ||||
| 
 | ||||
| The default angular-cli configuration requires no additional configuration. | ||||
| 
 | ||||
| Some deployments use the SystemJS loader, which does require configuration.  The | ||||
| SystemJS example shows the required meta and map settings: | ||||
| 
 | ||||
| ```js | ||||
| SystemJS.config({ | ||||
|   meta: { | ||||
|     'xlsx': { | ||||
|       exports: 'XLSX' // <-- tell SystemJS to expose the XLSX variable | ||||
|     } | ||||
|   }, | ||||
|   map: { | ||||
|     'xlsx': 'xlsx.full.min.js', // <-- make sure xlsx.full.min.js is in same dir | ||||
|     'fs': '',     // <--| | ||||
|     'crypto': '', // <--| suppress native node modules | ||||
|     'stream': ''  // <--| | ||||
|   } | ||||
| }); | ||||
| ``` | ||||
| Some deployments use the SystemJS loader, which does require configuration. | ||||
| [SystemJS](https://docs.sheetjs.com/docs/demos/bundler#systemjs) | ||||
| demo in the SheetJS CE docs describe the required settings. | ||||
| 
 | ||||
| ## Ionic | ||||
| 
 | ||||
| @ -157,29 +142,7 @@ this.file.writeFile(url, filename, blob, {replace: true}); | ||||
| 
 | ||||
| ## NativeScript | ||||
| 
 | ||||
| Reproducing the full project is a little bit tricky.  The included `nscript.sh` | ||||
| script performs the necessary installation steps and adds the necessary shims | ||||
| for `async` support.  Due to incompatibilities with NativeScript and TypeScript | ||||
| definitions, apps should require the `xlsx.full.min.js` file directly: | ||||
| 
 | ||||
| ```typescript | ||||
| const XLSX = require("./xlsx.full.min.js"); | ||||
| ``` | ||||
| 
 | ||||
| The `ISO_8859_1` encoding from the text module specifies `"binary"` strings. | ||||
| `File#readText` and `File#writeText` reads and writes files: | ||||
| 
 | ||||
| ```typescript | ||||
| /* read a workbook */ | ||||
| const bstr: string = await file.readText(encoding.ISO_8859_1); | ||||
| const wb = XLSX.read(bstr, { type: "binary" }); | ||||
| 
 | ||||
| /* write a workbook */ | ||||
| const wbout: string = XLSX.write(wb, { bookType: 'xlsx', type: 'binary' }); | ||||
| await file.writeText(wbout, encoding.ISO_8859_1); | ||||
| ``` | ||||
| 
 | ||||
| Note: some versions of NativeScript do not properly support typed arrays or | ||||
| binary strings.  See <https://github.com/NativeScript/NativeScript/issues/9586> | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/mobile#nativescript) | ||||
| is updated for NativeScript 8 and uses more idiomatic data patterns. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,10 +0,0 @@ | ||||
| #!/bin/bash | ||||
| if [ ! -e SheetJSNS ]; then | ||||
| 	ns create SheetJSNS --ng | ||||
| 	cd SheetJSNS | ||||
| 	npm install --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz | ||||
| 	cd .. | ||||
| fi | ||||
| 
 | ||||
| <../../dist/xlsx.full.min.js sed 's/require("fs")/null/g' > SheetJSNS/src/app/xlsx.full.min.js | ||||
| cp nscript.ts SheetJSNS/src/app/app.component.ts | ||||
| @ -1,82 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| 
 | ||||
| import { Component } from '@angular/core'; | ||||
| import { encoding } from '@nativescript/core/text'; | ||||
| import { File, Folder, knownFolders, path } from '@nativescript/core/file-system'; | ||||
| import { Dialogs } from '@nativescript/core'; | ||||
| import { Page, GridLayout, WebView, DockLayout, Button } from '@nativescript/core'; | ||||
| 
 | ||||
| import * as XLSX from './xlsx.full.min'; | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'ns-app', | ||||
|   template: ` | ||||
|   <Page> | ||||
|     <GridLayout rows="auto, *, auto"> | ||||
| 
 | ||||
|       <!-- data converted to HTML and rendered in web view --> | ||||
|       <WebView row="1" src="{{html}}"></WebView> | ||||
| 
 | ||||
|       <DockLayout row="2" dock="bottom" stretchLastChild="false"> | ||||
|         <Button text="Import File" (tap)="import()" style="padding: 10px"></Button> | ||||
|         <Button text="Export File" (tap)="export()" style="padding: 10px"></Button> | ||||
|       </DockLayout> | ||||
|     </GridLayout> | ||||
|   </Page> | ||||
|   ` | ||||
| }) | ||||
| 
 | ||||
| export class AppComponent { | ||||
|   html: string = ""; | ||||
|   constructor() { | ||||
|     const ws = XLSX.utils.aoa_to_sheet([[1,2],[3,4]]); | ||||
|     this.html = XLSX.utils.sheet_to_html(ws); | ||||
|   }; | ||||
| 
 | ||||
|   /* Import button */ | ||||
|   async import() { | ||||
|     const filename: string = "SheetJSNS.csv"; | ||||
| 
 | ||||
|     /* find appropriate path */ | ||||
|     const target: Folder = knownFolders.documents() || knownFolders.ios.sharedPublic(); | ||||
|     const url: string = path.normalize(target.path + "///" + filename); | ||||
|     const file: File = File.fromPath(url); | ||||
| 
 | ||||
|     try { | ||||
|       /* get binary string */ | ||||
|       const bstr: string = await file.readText(encoding.ISO_8859_1); | ||||
| 
 | ||||
|       /* read workbook */ | ||||
|       const wb = XLSX.read(bstr, { type: "binary" }); | ||||
| 
 | ||||
|       /* grab first sheet */ | ||||
|       const wsname: string = wb.SheetNames[0]; | ||||
|       const ws = wb.Sheets[wsname]; | ||||
| 
 | ||||
|       /* update table */ | ||||
|       this.html = XLSX.utils.sheet_to_html(ws); | ||||
|       Dialogs.alert(`Attempting to read to ${filename} in ${url}`); | ||||
|     } catch(e) { | ||||
|       Dialogs.alert(e.message); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   /* Export button */ | ||||
|   async export() { | ||||
|     const wb = XLSX.read(this.html, { type: "string" }); | ||||
|     const filename: string = "SheetJSNS.csv"; | ||||
| 
 | ||||
|     /* generate binary string */ | ||||
|     const wbout: string = XLSX.write(wb, { bookType: 'csv', type: 'binary' }); | ||||
| 
 | ||||
|     /* find appropriate path */ | ||||
|     const target: Folder = knownFolders.documents() || knownFolders.ios.sharedPublic(); | ||||
|     const url: string = path.normalize(target.path + "///" + filename); | ||||
|     const file: File = File.fromPath(url); | ||||
| 
 | ||||
|     /* attempt to save binary string to file */ | ||||
|     await file.writeText(wbout, encoding.ISO_8859_1); | ||||
|     Dialogs.alert(`Wrote to ${filename} in ${url}`); | ||||
|   }; | ||||
| } | ||||
| @ -1,6 +1,6 @@ | ||||
| # Typed Arrays and Math | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/ml) includes  | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/ml) includes  | ||||
| interactive examples as well as strategies for CSV and JS Array interchange. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Browserify | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/bundler#browserify) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/bundler#browserify) | ||||
| includes a more concise example. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Chrome and Chromium | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/chromium) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/chromium) | ||||
| includes more up-to-date details. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -2,10 +2,10 @@ | ||||
| 
 | ||||
| This demo has been split up for clarity: | ||||
| 
 | ||||
| - <https://docs.sheetjs.com/docs/getting-started/demos/database> covers SQL and | ||||
| - <https://docs.sheetjs.com/docs/demos/database> covers SQL and | ||||
|   structured data (including CRUD operations) | ||||
| 
 | ||||
| - https://docs.sheetjs.com/docs/getting-started/demos/nosql covers unstructured | ||||
| - https://docs.sheetjs.com/docs/demos/nosql covers unstructured | ||||
|   data including "NoSQL" data stores. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # canvas-datagrid | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/grid#canvas-datagrid) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/grid#canvas-datagrid) | ||||
| includes a live example and improved explanations. | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -8,6 +8,6 @@ Demos have been integrated in the [documentation](https://docs.sheetjs.com) : | ||||
| - <https://docs.sheetjs.com/docs/example> writing JS data to a spreadsheet | ||||
| - <https://docs.sheetjs.com/docs/solutions/input> input strategies | ||||
| - <https://docs.sheetjs.com/docs/solutions/output> output strategies | ||||
| - <https://docs.sheetjs.com/docs/getting-started/demos/cli#deno> `deno compile` | ||||
| - <https://docs.sheetjs.com/docs/demos/cli#deno> `deno compile` | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Electron | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/desktop#electron) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/desktop#electron) | ||||
| includes an improved example and detailed explanations. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Adobe ExtendScript | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/extendscript) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/extendscript) | ||||
| has a more focused Photoshop example as well as notes about other extensibility | ||||
| frameworks shipping with newer versions of Creative Cloud apps. | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,3 @@ | ||||
| .PHONY: microcule | ||||
| microcule: mcstream.js | ||||
| 	microcule $< | ||||
| 
 | ||||
| .PHONY: aws | ||||
| aws: lambda-proxy | ||||
| 
 | ||||
|  | ||||
| @ -43,32 +43,6 @@ var workbook = XLSX.readFile("path/to/file.xlsb"); | ||||
| XLSX.writeFile(workbook, "output/path/file.csv"); | ||||
| ``` | ||||
| 
 | ||||
| The `mcstream.js` demo uses the `microcule` framework to show a simple body | ||||
| converter.  It accepts raw data from a POST connection, parses as a workbook, | ||||
| and streams back the first worksheet as CSV: | ||||
| 
 | ||||
| <details> | ||||
| 	<summary><b>Code Sketch</b> (click to show)</summary> | ||||
| 
 | ||||
| ```js | ||||
| const XLSX = require('xlsx'); | ||||
| 
 | ||||
| module.exports = (hook) => { | ||||
| 	/* process_RS from the main README under "Streaming Read" section */ | ||||
| 	process_RS(hook.req, (wb) => { | ||||
| 		hook.res.writeHead(200, { 'Content-Type': 'text/csv' }); | ||||
| 		/* get first worksheet */ | ||||
| 		const ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 		/* generate CSV stream and pipe to response */ | ||||
| 		const stream = XLSX.stream.to_csv(ws); | ||||
| 		stream.pipe(hook.res); | ||||
| 	}); | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| 
 | ||||
| #### Report Generation | ||||
| 
 | ||||
| For an existing platform that already generates JSON or CSV or HTML output, the | ||||
|  | ||||
| @ -1,22 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* eslint-env node */ | ||||
| // cat file.xlsx | curl --header 'content-type: application/octet-stream' --data-binary @- "http://localhost:3000/"
 | ||||
| const XLSX = require('xlsx'); | ||||
| 
 | ||||
| const process_RS = (stream, cb) => { | ||||
|   var buffers = []; | ||||
|   stream.on('data', function(data) { buffers.push(data); }); | ||||
|   stream.on('end', function() { | ||||
|     var buffer = Buffer.concat(buffers); | ||||
|     var workbook = XLSX.read(buffer, {type:"buffer"}); | ||||
|     cb(workbook); | ||||
|   }); | ||||
| }; | ||||
| 
 | ||||
| module.exports = (hook) => { | ||||
| 	process_RS(hook.req, (wb) => { | ||||
| 		hook.res.writeHead(200, { 'Content-Type': 'text/csv' }); | ||||
| 		const stream = XLSX.stream.to_csv(wb.Sheets[wb.SheetNames[0]]); | ||||
| 		stream.pipe(hook.res); | ||||
| 	}); | ||||
| }; | ||||
| @ -3,7 +3,7 @@ | ||||
| The old demo used a deprecated version of the Google Sheets API to export data | ||||
| from Google Sheets Documents. | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/gsheet) uses | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/gsheet) uses | ||||
| the new Google Sheets API to read and write data. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Headless Browsers | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/headless) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/headless) | ||||
| has a more focused table export example as well as a demo script for Chromium | ||||
| automation with Puppeteer and multi-browser automation with Playwright. | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Knockout | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/legacy#knockoutjs) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/legacy#knockoutjs) | ||||
| includes a live example and improved explanations. | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # NW.js | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/desktop#nwjs) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/desktop#nwjs) | ||||
| includes an improved example and detailed explanations. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,156 +1,6 @@ | ||||
| # Internet Explorer | ||||
| 
 | ||||
| The modern upload and download strategies are not available in older versions of | ||||
| IE, but there are approaches using older technologies like ActiveX and Flash. | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Live Demos</b> (click to show)</summary> | ||||
| 
 | ||||
| <http://oss.sheetjs.com/sheetjs/ajax.html> uses XMLHttpRequest to download test | ||||
| files and convert to CSV. | ||||
| 
 | ||||
| <https://oss.sheetjs.com/sheetjs/> demonstrates reading files with `FileReader`. | ||||
| 
 | ||||
| Older versions of IE do not support HTML5 File API but do support Base64. | ||||
| 
 | ||||
| On OSX you can get the Base64 encoding with: | ||||
| 
 | ||||
| ```bash | ||||
| $ <target_file base64 | pbcopy | ||||
| ``` | ||||
| 
 | ||||
| On Windows XP and up you can get the Base64 encoding using `certutil`: | ||||
| 
 | ||||
| ```cmd | ||||
| > certutil -encode target_file target_file.b64 | ||||
| ``` | ||||
| 
 | ||||
| (note: You have to open the file and remove the header and footer lines) | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## Upload Strategies | ||||
| 
 | ||||
| #### IE10 and IE11 FileReader | ||||
| 
 | ||||
| IE10 and IE11 support the standard HTML5 FileReader API: | ||||
| 
 | ||||
| ```js | ||||
| function handle_fr(e) { | ||||
|   var files = e.target.files, f = files[0]; | ||||
|   var reader = new FileReader(); | ||||
|   reader.onload = function(e) { | ||||
|     var data = new Uint8Array(e.target.result); | ||||
|     var wb = XLSX.read(data, {type: 'array'}); | ||||
|     process_wb(wb); | ||||
|   }; | ||||
|   reader.readAsArrayBuffer(f); | ||||
| } | ||||
| input_dom_element.addEventListener('change', handle_fr, false); | ||||
| ``` | ||||
| 
 | ||||
| #### ActiveX-based Upload | ||||
| 
 | ||||
| Through the `Scripting.FileSystemObject` object model, a script in the VBScript | ||||
| scripting language can read from an arbitrary path on the filesystem.  The shim | ||||
| includes a special `IE_LoadFile` function to read binary strings from file. This | ||||
| should be called from a file input `onchange` event: | ||||
| 
 | ||||
| ```js | ||||
| var input_dom_element = document.getElementById("file"); | ||||
| function handle_ie() { | ||||
|   /* get data from selected file */ | ||||
|   var path = input_dom_element.value; | ||||
|   var bstr = IE_LoadFile(path); | ||||
|   /* read workbook */ | ||||
|   var wb = XLSX.read(bstr, {type: 'binary'}); | ||||
|   /* DO SOMETHING WITH workbook HERE */ | ||||
| } | ||||
| input_dom_element.attachEvent('onchange', handle_ie); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## Download Strategies | ||||
| 
 | ||||
| #### IE10 and IE11 File API | ||||
| 
 | ||||
| As part of the File API implementation, IE10 and IE11 provide the `msSaveBlob` | ||||
| and `msSaveOrOpenBlob` functions to save blobs to the client computer.  This | ||||
| approach is embedded in `XLSX.writeFile` and no additional shims are necessary. | ||||
| 
 | ||||
| #### Flash-based Download | ||||
| 
 | ||||
| It is possible to write to the file system using a SWF.  `Downloadify` library | ||||
| implements one solution.  Since a genuine click is required, there is no way to | ||||
| force a download.  The demo generates a button for each desired output format. | ||||
| 
 | ||||
| #### ActiveX-based Download | ||||
| 
 | ||||
| Through the `Scripting.FileSystemObject` object model, a script in the VBScript | ||||
| scripting language can write to an arbitrary path on the filesystem.  The shim | ||||
| includes a special `IE_SaveFile` function to write binary strings to file.  It | ||||
| attempts to write to the Downloads folder or Documents folder or Desktop. | ||||
| 
 | ||||
| This approach can be triggered, but it requires the user to enable ActiveX.  It | ||||
| is embedded as a strategy in `writeFile` and used only if the shim script is | ||||
| included in the page and the relevant features are enabled on the target system. | ||||
| 
 | ||||
| 
 | ||||
| ## Demo | ||||
| 
 | ||||
| #### Download | ||||
| 
 | ||||
| The included demo starts from an array of arrays, generating an editable HTML | ||||
| table with `aoa_to_sheet` and adding it to the page: | ||||
| 
 | ||||
| ```js | ||||
| var ws = XLSX.utils.aoa_to_sheet(aoa); | ||||
| var html_string = XLSX.utils.sheet_to_html(ws, { id: "table", editable: true }); | ||||
| document.getElementById("container").innerHTML = html_string; | ||||
| ``` | ||||
| 
 | ||||
| The included download buttons use `table_to_book` to construct a new workbook | ||||
| based on the table and `writeFile` to force a download: | ||||
| 
 | ||||
| 
 | ||||
| ```js | ||||
| var elt = document.getElementById('table'); | ||||
| var wb = XLSX.utils.table_to_book(elt, { sheet: "Sheet JS" }); | ||||
| XLSX.writeFile(wb, filename); | ||||
| ``` | ||||
| 
 | ||||
| The shim is included in the HTML page, unlocking the ActiveX pathway if enabled | ||||
| in browser settings. | ||||
| 
 | ||||
| The corresponding SWF buttons are displayed in environments where Flash is | ||||
| available and `Downloadify` is supported.  The easiest solution involves writing | ||||
| to a Base64 string and passing to the library: | ||||
| 
 | ||||
| ```js | ||||
| Downloadify.create(element_id, { | ||||
|   /* the demo includes the other options required by Downloadify */ | ||||
|   filename: "test.xlsx", | ||||
|   data: function() { return XLSX.write(wb, {bookType:"xlsx", type:'base64'}); }, | ||||
|   dataType: 'base64' | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| #### Upload | ||||
| 
 | ||||
| The demo also includes an HTML file input element for updating the data table: | ||||
| 
 | ||||
| ```js | ||||
| var ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| var html_string = XLSX.utils.sheet_to_html(ws, { id: "table", editable: true }); | ||||
| document.getElementById("container").innerHTML = html_string; | ||||
| ``` | ||||
| 
 | ||||
| The specific strategy is determined based on the presence of `IE_LoadFile`: | ||||
| 
 | ||||
| ```js | ||||
| var handler = typeof IE_LoadFile !== 'undefined' ? handle_ie : handle_fr; | ||||
| if(input_dom_element.attachEvent) input_dom_element.attachEvent('onchange', handler); | ||||
| else input_dom_element.addEventListener('change', handler, false); | ||||
| ``` | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/legacy#internet-explorer) | ||||
| includes a live example and easier integration bundle. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
							
								
								
									
										1
									
								
								demos/oldie/base64.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/oldie/base64.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| !function(){function t(t){this.message=t}var r="undefined"!=typeof exports?exports:self,e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.prototype=new Error,t.prototype.name="InvalidCharacterError",r.btoa||(r.btoa=function(r){for(var o,n,a=String(r),i=0,c=e,d="";a.charAt(0|i)||(c="=",i%1);d+=c.charAt(63&o>>8-i%1*8)){if(n=a.charCodeAt(i+=.75),n>255)throw new t("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");o=o<<8|n}return d}),r.atob||(r.atob=function(r){var o=String(r).replace(/=+$/,"");if(o.length%4==1)throw new t("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,a,i=0,c=0,d="";a=o.charAt(c++);~a&&(n=i%4?64*n+a:a,i++%4)?d+=String.fromCharCode(255&n>>(-2*i&6)):0)a=e.indexOf(a);return d})}(); | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										3
									
								
								demos/oldie/downloadify.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								demos/oldie/downloadify.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | ||||
| /* Downloadify 0.2 (c) 2009 by Douglas Neiner. Licensed under the MIT license */ | ||||
| /* See http://github.com/dcneiner/Downloadify for license and more info */ | ||||
| (function(){Downloadify=window.Downloadify={queue:{},uid:new Date().getTime(),getTextForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getData();return""},getFileNameForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getFilename();return""},getDataTypeForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getDataType();return""},saveComplete:function(a){var b=Downloadify.queue[a];if(b)b.complete();return true},saveCancel:function(a){var b=Downloadify.queue[a];if(b)b.cancel();return true},saveError:function(a){var b=Downloadify.queue[a];if(b)b.error();return true},addToQueue:function(a){Downloadify.queue[a.queue_name]=a},getUID:function(a){if(a.id=="")a.id='downloadify_'+Downloadify.uid++;return a.id}};Downloadify.create=function(a,b){var c=(typeof(a)=="string"?document.getElementById(a):a);return new Downloadify.Container(c,b)};Downloadify.Container=function(d,e){var f=this;f.el=d;f.enabled=true;f.dataCallback=null;f.filenameCallback=null;f.data=null;f.filename=null;var g=function(){f.options=e;if(!f.options.append)f.el.innerHTML="";f.flashContainer=document.createElement('span');f.el.appendChild(f.flashContainer);f.queue_name=Downloadify.getUID(f.flashContainer);if(typeof(f.options.filename)==="function")f.filenameCallback=f.options.filename;else if(f.options.filename)f.filename=f.options.filename;if(typeof(f.options.data)==="function")f.dataCallback=f.options.data;else if(f.options.data)f.data=f.options.data;var a={queue_name:f.queue_name,width:f.options.width,height:f.options.height};var b={allowScriptAccess:'always'};var c={id:f.flashContainer.id,name:f.flashContainer.id};if(f.options.enabled===false)f.enabled=false;if(f.options.transparent===true)b.wmode="transparent";if(f.options.downloadImage)a.downloadImage=f.options.downloadImage;swfobject.embedSWF(f.options.swf,f.flashContainer.id,f.options.width,f.options.height,"10",null,a,b,c);Downloadify.addToQueue(f)};f.enable=function(){var a=document.getElementById(f.flashContainer.id);a.setEnabled(true);f.enabled=true};f.disable=function(){var a=document.getElementById(f.flashContainer.id);a.setEnabled(false);f.enabled=false};f.getData=function(){if(!f.enabled)return"";if(f.dataCallback)return f.dataCallback();else if(f.data)return f.data;else return""};f.getFilename=function(){if(f.filenameCallback)return f.filenameCallback();else if(f.filename)return f.filename;else return""};f.getDataType=function(){if(f.options.dataType)return f.options.dataType;return"string"};f.complete=function(){if(typeof(f.options.onComplete)==="function")f.options.onComplete()};f.cancel=function(){if(typeof(f.options.onCancel)==="function")f.options.onCancel()};f.error=function(){if(typeof(f.options.onError)==="function")f.options.onError()};g()};Downloadify.defaultOptions={swf:'media/downloadify.swf',downloadImage:'images/download.png',width:100,height:30,transparent:true,append:false,dataType:"string"}})();if(typeof(jQuery)!="undefined"){(function($){$.fn.downloadify=function(b){return this.each(function(){b=$.extend({},Downloadify.defaultOptions,b);var a=Downloadify.create(this,b);$(this).data('Downloadify',a)})}})(jQuery)};if(typeof(MooTools)!='undefined'){Element.implement({downloadify:function(a){a=$merge(Downloadify.defaultOptions,a);return this.store('Downloadify',Downloadify.create(this,a))}})}; | ||||
										
											Binary file not shown.
										
									
								
							| @ -1,152 +0,0 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html> | ||||
| <head> | ||||
| <title>SheetJS JS-XLSX In-Browser HTML Table Demo</title> | ||||
| <meta charset="utf-8" /> | ||||
| <style> | ||||
| .xport, .btn { | ||||
| 	display: inline; | ||||
| 	text-align:center; | ||||
| } | ||||
| a { text-decoration: none } | ||||
| #data-table, #data-table th, #data-table td { border: 1px solid black } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <!-- SheetJS js-xlsx library --> | ||||
| <script type="text/javascript" src="shim.min.js"></script> | ||||
| <script type="text/javascript" src="xlsx.full.min.js"></script> | ||||
| 
 | ||||
| <!-- Downloadify Flash fallback for IE 9 and below if ActiveX is unavailable --> | ||||
| <!--[if lte IE 9]> | ||||
| <script type="text/javascript" src="swfobject.js"></script> | ||||
| <script type="text/javascript" src="downloadify.min.js"></script> | ||||
| <script type="text/javascript" src="base64.min.js"></script> | ||||
| <![endif]--> | ||||
| 
 | ||||
| <script> | ||||
| function doit(type, fn, dl) { | ||||
| 	var elt = document.getElementById('data-table'); | ||||
| 	var wb = XLSX.utils.table_to_book(elt, {sheet:"Sheet JS"}); | ||||
| 	return dl ? | ||||
| 		XLSX.write(wb, {bookType:type, bookSST:true, type: 'base64'}) : | ||||
| 		XLSX.writeFile(wb, fn || ('test.' + (type || 'xlsx'))); | ||||
| } | ||||
| </script> | ||||
| <pre> | ||||
| <h3><a href="//sheetjs.com/">SheetJS</a> JS-XLSX In-Browser HTML Table Demo</h3> | ||||
| <b>Compatibility notes:</b> | ||||
| - Editable table leverages the HTML5 contenteditable feature, supported in most browsers. | ||||
| - IE6-9 requires ActiveX to upload files and ActiveX or Flash to download files. | ||||
| - iOS Safari file download may not work. <a href="https://github.com/eligrey/FileSaver.js/issues/12">This is a known issue</a>. | ||||
| 
 | ||||
| <b>Update Spreadsheet:</b> (submit file to update table; file parsed in browser) | ||||
| <input type="file" id="file" /> | ||||
| 
 | ||||
| <b>Editable Data Table:</b> (click a cell to edit it) | ||||
| </pre> | ||||
| <div id="container"></div> | ||||
| <script type="text/javascript"> | ||||
| /* initial table */ | ||||
| var aoa = [ | ||||
| 	["This",   "is",     "a",    "Test"], | ||||
| 	["வணக்கம்", "สวัสดี", "你好", "가지마"], | ||||
| 	[1,        2,        3,      4], | ||||
| 	["Click",  "to",     "edit", "cells"] | ||||
| ]; | ||||
| var ws = XLSX.utils.aoa_to_sheet(aoa); | ||||
| var html_string = XLSX.utils.sheet_to_html(ws, { id: "data-table", editable: true }); | ||||
| document.getElementById("container").innerHTML = html_string; | ||||
| </script> | ||||
| <br /> | ||||
| <pre><b>Export it!</b></pre> | ||||
| <table id="xport"> | ||||
| <tr><td><pre>XLSX Excel 2007+ XML</pre></td><td> | ||||
| 	<p id="xportxlsx" class="xport"><input type="submit" value="Export to XLSX!" onclick="doit('xlsx');"></p> | ||||
| 	<p id="xlsxbtn" class="btn">Flash required for actually downloading the generated file.</p> | ||||
| </td></tr> | ||||
| <tr><td><pre>XLSB Excel 2007+ Binary</pre></td><td> | ||||
| 	<p id="xportxlsb" class="xport"><input type="submit" value="Export to XLSB!" onclick="doit('xlsb');"></p> | ||||
| 	<p id="xlsbbtn" class="btn">Flash required for actually downloading the generated file.</p> | ||||
| </td></tr> | ||||
| <tr><td><pre>XLS Excel 97-2004 Binary</pre></td><td> | ||||
| 	<p id="xportbiff8" class="xport"><input type="submit" value="Export to XLS!"  onclick="doit('biff8', 'test.xls');"></p> | ||||
| 	<p id="biff8btn" class="btn">Flash required for actually downloading the generated file.</p> | ||||
| </td></tr> | ||||
| <tr><td><pre>ODS</pre></td><td> | ||||
| 	<p id="xportods" class="xport"><input type="submit" value="Export to ODS!"  onclick="doit('ods');"></p> | ||||
| 	<p id="odsbtn" class="btn">Flash required for actually downloading the generated file.</p> | ||||
| </td></tr> | ||||
| <tr><td><pre>Flat ODS</pre></td><td> | ||||
| 	<p id="xportfods" class="xport"><input type="submit" value="Export to FODS!"  onclick="doit('fods', 'test.fods');"></p> | ||||
| 	<p id="fodsbtn" class="btn">Flash required for actually downloading the generated file.</p> | ||||
| </td></tr> | ||||
| </table> | ||||
| <pre><b>Powered by the <a href="//sheetjs.com/opensource">community version of js-xlsx</a></b></pre> | ||||
| <script type="text/javascript"> | ||||
| var input_dom_element = document.getElementById("file"); | ||||
| function process_wb(wb) { | ||||
| 	var ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 	var html_string = XLSX.utils.sheet_to_html(ws, { id: "data-table", editable: true }); | ||||
| 	document.getElementById("container").innerHTML = html_string; | ||||
| } | ||||
| function handle_ie() { | ||||
| 	var path = input_dom_element.value; | ||||
| 	var data = IE_LoadFile(path); | ||||
| 	var wb = XLSX.read(data, {type: 'binary'}); | ||||
| 	process_wb(wb); | ||||
| } | ||||
| function handle_fr(e) { | ||||
| 	var files = e.target.files, f = files[0]; | ||||
| 	var reader = new FileReader(); | ||||
| 	reader.onload = function(e) { | ||||
| 		var data = e.target.result; | ||||
| 		data = new Uint8Array(data); | ||||
| 		var wb = XLSX.read(data, {type: 'array'}); | ||||
| 		process_wb(wb); | ||||
| 	}; | ||||
| 	reader.readAsArrayBuffer(f); | ||||
| } | ||||
| var handler = typeof IE_LoadFile !== 'undefined' ? handle_ie : handle_fr; | ||||
| if(input_dom_element.attachEvent) input_dom_element.attachEvent('onchange', handler); | ||||
| else input_dom_element.addEventListener('change', handler, false); | ||||
| 
 | ||||
| function tableau(pid, iid, fmt, ofile) { | ||||
| 	if(typeof Downloadify !== 'undefined') Downloadify.create(pid,{ | ||||
| 			swf: 'downloadify.swf', | ||||
| 			downloadImage: 'download.png', | ||||
| 			width: 100, | ||||
| 			height: 30, | ||||
| 			filename: ofile, data: function() { return doit(fmt, ofile, true); }, | ||||
| 			transparent: false, | ||||
| 			append: false, | ||||
| 			dataType: 'base64', | ||||
| 			onComplete: function(){ alert('Your File Has Been Saved!'); }, | ||||
| 			onCancel: function(){ alert('You have cancelled the saving of this file.'); }, | ||||
| 			onError: function(){ alert('You must put something in the File Contents or there will be nothing to save!'); } | ||||
| 	}); else document.getElementById(pid).innerHTML = ""; | ||||
| } | ||||
| tableau('biff8btn', 'xportbiff8', 'biff8', 'test.xls'); | ||||
| tableau('odsbtn',   'xportods',   'ods',   'test.ods'); | ||||
| tableau('fodsbtn',  'xportfods',  'fods',  'test.fods'); | ||||
| tableau('xlsbbtn',  'xportxlsb',  'xlsb',  'test.xlsb'); | ||||
| tableau('xlsxbtn',  'xportxlsx',  'xlsx',  'test.xlsx'); | ||||
| 
 | ||||
| </script> | ||||
| <script type="text/javascript"> | ||||
|   var _gaq = _gaq || []; | ||||
|   _gaq.push(['_setAccount', 'UA-36810333-1']); | ||||
|   _gaq.push(['_setDomainName', 'sheetjs.com']); | ||||
|   _gaq.push(['_setAllowLinker', true]); | ||||
|   _gaq.push(['_trackPageview']); | ||||
| 
 | ||||
|   (function() { | ||||
|     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||||
|     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||||
|     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||||
|   })(); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										1
									
								
								demos/oldie/shim.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/oldie/shim.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| ../../dist/shim.min.js | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								demos/oldie/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/oldie/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| ../../dist/xlsx.full.min.js | ||||
| @ -1,6 +1,6 @@ | ||||
| # Parcel | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/bundler#parcel) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/bundler#parcel) | ||||
| includes a more concise example. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -74,33 +74,8 @@ function make_cols(refstr/*:string*/) { | ||||
| 
 | ||||
| ## React Native | ||||
| 
 | ||||
| <img src="screen.png" width="400px"/> | ||||
| 
 | ||||
| Reproducing the full project is straightforward: | ||||
| 
 | ||||
| ```bash | ||||
| $ make native     # build the project | ||||
| $ make ios        # build and run the iOS demo | ||||
| $ make android    # build and run the android demo | ||||
| ``` | ||||
| 
 | ||||
| The app will prompt before reading and after writing data.  The printed location | ||||
| depends on the environment: | ||||
| 
 | ||||
| - android: path in the device filesystem | ||||
| - iOS simulator: local path to file | ||||
| - iOS device: a path accessible from iTunes App Documents view | ||||
| 
 | ||||
| Components used in the demo: | ||||
| - [`react-native-table-component`](https://npm.im/react-native-table-component) | ||||
| - [`react-native-file-access`](https://npm.im/react-native-file-access) | ||||
| 
 | ||||
| React Native does not provide a native component for reading and writing files. | ||||
| The sample script `react-native.js` uses `react-native-file-access` and has | ||||
| notes for integrations with `react-native-fetch-blob` and `react-native-fs`. | ||||
| 
 | ||||
| Note: for real app deployments, the `UIFileSharingEnabled` flag must be manually | ||||
| set in the iOS project `Info.plist` file. | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/mobile#react-native) uses | ||||
| up-to-date file I/O and file picker libraries. | ||||
| 
 | ||||
| ## Server-Rendered React Components with Next.js | ||||
| 
 | ||||
|  | ||||
| @ -1,27 +0,0 @@ | ||||
| #!/bin/bash | ||||
| # xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| 
 | ||||
| # Create starter project | ||||
| if [ ! -e SheetJS ]; then react-native init SheetJS --version="0.67.2"; fi | ||||
| 
 | ||||
| # Install dependencies | ||||
| cd SheetJS; npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz react-native-table-component; cd - | ||||
| 
 | ||||
| cd SheetJS; npm i -S react-native-file-access@2.x; cd - | ||||
| # cd SheetJS; npm i -S react-native-fs; cd - | ||||
| # cd SheetJS; npm i -S react-native-fetch-blob; cd - | ||||
| 
 | ||||
| # Copy demo assets | ||||
| if [ ! -e SheetJS/logo.png ]; then | ||||
| 	curl -O http://oss.sheetjs.com/assets/img/logo.png | ||||
| 	mv logo.png SheetJS/logo.png | ||||
| fi | ||||
| if [ -e SheetJS/index.ios.js ]; then | ||||
| 	cp react-native.js SheetJS/index.ios.js | ||||
| 	cp react-native.js SheetJS/index.android.js | ||||
| else | ||||
| 	cp react-native.js SheetJS/index.js | ||||
| fi | ||||
| 
 | ||||
| # Link | ||||
| cd SheetJS; RNFB_ANDROID_PERMISSIONS=true react-native link; cd - | ||||
							
								
								
									
										179
									
								
								demos/react/react-native.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										179
									
								
								demos/react/react-native.js
									
									
									
									
										vendored
									
									
								
							| @ -1,179 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| import * as XLSX from 'xlsx'; | ||||
| import React, { Component } from 'react'; | ||||
| import { | ||||
| 	AppRegistry, | ||||
| 	StyleSheet, | ||||
| 	Text, | ||||
| 	View, | ||||
| 	Button, | ||||
| 	Alert, | ||||
| 	Image, | ||||
| 	ScrollView, | ||||
| 	TouchableWithoutFeedback | ||||
| } from 'react-native'; | ||||
| import { Table, Row, Rows, TableWrapper } from 'react-native-table-component'; | ||||
| 
 | ||||
| // react-native-file-access
 | ||||
| var Base64 = function() { | ||||
|   var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | ||||
|   return { | ||||
|     encode: function(input) { | ||||
|       var o = ""; | ||||
|       var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; | ||||
|       for (var i = 0; i < input.length; ) { | ||||
|         c1 = input.charCodeAt(i++); | ||||
|         e1 = c1 >> 2; | ||||
|         c2 = input.charCodeAt(i++); | ||||
|         e2 = (c1 & 3) << 4 | c2 >> 4; | ||||
|         c3 = input.charCodeAt(i++); | ||||
|         e3 = (c2 & 15) << 2 | c3 >> 6; | ||||
|         e4 = c3 & 63; | ||||
|         if (isNaN(c2)) { | ||||
|           e3 = e4 = 64; | ||||
|         } else if (isNaN(c3)) { | ||||
|           e4 = 64; | ||||
|         } | ||||
|         o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4); | ||||
|       } | ||||
|       return o; | ||||
|     }, | ||||
|     decode: function(input) { | ||||
|       var o = ""; | ||||
|       var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; | ||||
|       input = input.replace(/[^\w\+\/\=]/g, ""); | ||||
|       for (var i = 0; i < input.length; ) { | ||||
|         e1 = map.indexOf(input.charAt(i++)); | ||||
|         e2 = map.indexOf(input.charAt(i++)); | ||||
|         c1 = e1 << 2 | e2 >> 4; | ||||
|         o += String.fromCharCode(c1); | ||||
|         e3 = map.indexOf(input.charAt(i++)); | ||||
|         c2 = (e2 & 15) << 4 | e3 >> 2; | ||||
|         if (e3 !== 64) { | ||||
|           o += String.fromCharCode(c2); | ||||
|         } | ||||
|         e4 = map.indexOf(input.charAt(i++)); | ||||
|         c3 = (e3 & 3) << 6 | e4; | ||||
|         if (e4 !== 64) { | ||||
|           o += String.fromCharCode(c3); | ||||
|         } | ||||
|       } | ||||
|       return o; | ||||
|     } | ||||
|   }; | ||||
| }(); | ||||
| 
 | ||||
| import { Dirs, FileSystem } from 'react-native-file-access'; | ||||
| const DDP = Dirs.DocumentDir + "/"; | ||||
| const readFile = (path, enc) => FileSystem.readFile(path, "base64"); | ||||
| const writeFile = (path, data, enc) => FileSystem.writeFile(path, data, "base64"); | ||||
| const input = res => Base64.decode(res); | ||||
| const output = str => Base64.encode(str); | ||||
| 
 | ||||
| // react-native-fs
 | ||||
| /* | ||||
| import { writeFile, readFile, DocumentDirectoryPath } from 'react-native-fs'; | ||||
| const DDP = DocumentDirectoryPath + "/"; | ||||
| const input = res => res; | ||||
| const output = str => str; | ||||
| */ | ||||
| // react-native-fetch-blob
 | ||||
| /* | ||||
| import RNFetchBlob from 'react-native-fetch-blob'; | ||||
| const { writeFile, readFile, dirs:{ DocumentDir } } = RNFetchBlob.fs; | ||||
| const DDP = DocumentDir + "/"; | ||||
| const input = res => res.map(x => String.fromCharCode(x)).join(""); | ||||
| const output = str => str.split("").map(x => x.charCodeAt(0)); | ||||
| */ | ||||
| 
 | ||||
| const make_cols = refstr => Array.from({length: XLSX.utils.decode_range(refstr).e.c + 1}, (x,i) => XLSX.utils.encode_col(i)); | ||||
| const make_width = refstr => Array.from({length: XLSX.utils.decode_range(refstr).e.c + 1}, () => 60); | ||||
| 
 | ||||
| export default class SheetJS extends Component { | ||||
| 	constructor(props) { | ||||
| 		super(props); | ||||
| 		this.state = { | ||||
| 			data: [[2,3,4],[3,4,5]], | ||||
| 			widthArr: [60, 60, 60], | ||||
| 			cols: make_cols("A1:C2") | ||||
| 		}; | ||||
| 		this.importFile = this.importFile.bind(this); | ||||
| 		this.exportFile = this.exportFile.bind(this); | ||||
| 	}; | ||||
| 	importFile() { | ||||
| 		Alert.alert("Rename file to sheetjs.xlsx", "Copy to " + DDP, [ | ||||
| 			{text: 'Cancel', onPress: () => {}, style: 'cancel' }, | ||||
| 			{text: 'Import', onPress: () => { | ||||
| 				readFile(DDP + "sheetjs.xlsx", 'ascii').then((res) => { | ||||
| 					/* parse file */ | ||||
| 					const wb = XLSX.read(input(res), {type:'binary'}); | ||||
| 
 | ||||
| 					/* convert first worksheet to AOA */ | ||||
| 					const wsname = wb.SheetNames[0]; | ||||
| 					const ws = wb.Sheets[wsname]; | ||||
| 					const data = XLSX.utils.sheet_to_json(ws, {header:1}); | ||||
| 
 | ||||
| 					/* update state */ | ||||
| 					this.setState({ data: data, cols: make_cols(ws['!ref']), widthArr: make_width(ws['!ref']) }); | ||||
| 				}).catch((err) => { Alert.alert("importFile Error", "Error " + err.message); }); | ||||
| 			}} | ||||
| 		]); | ||||
| 	} | ||||
| 	exportFile() { | ||||
| 		/* convert AOA back to worksheet */ | ||||
| 		const ws = XLSX.utils.aoa_to_sheet(this.state.data); | ||||
| 
 | ||||
| 		/* build new workbook */ | ||||
| 		const wb = XLSX.utils.book_new(); | ||||
| 		XLSX.utils.book_append_sheet(wb, ws, "SheetJS"); | ||||
| 
 | ||||
| 		/* write file */ | ||||
| 		const wbout = XLSX.write(wb, {type:'binary', bookType:"xlsx"}); | ||||
| 		const file = DDP + "sheetjsw.xlsx"; | ||||
| 		writeFile(file, output(wbout), 'ascii').then((res) =>{ | ||||
| 				Alert.alert("exportFile success", "Exported to " + file); | ||||
| 		}).catch((err) => { Alert.alert("exportFile Error", "Error " + err.message); }); | ||||
| 	}; | ||||
| 
 | ||||
| 	render() { | ||||
| 		return ( | ||||
| 			<ScrollView contentContainerStyle={styles.container} vertical={true}> | ||||
| 				<Text style={styles.welcome}> </Text> | ||||
| 				<Text style={styles.welcome}>SheetJS React Native Demo</Text> | ||||
| 				<Text style={styles.instructions}>Import Data</Text> | ||||
| 				<Button onPress={this.importFile} title="Import data from a spreadsheet" color="#841584" /> | ||||
| 				<Text style={styles.instructions}>Export Data</Text> | ||||
| 				<Button disabled={!this.state.data.length} onPress={this.exportFile} title="Export data to XLSX" color="#841584" /> | ||||
| 
 | ||||
| 				<Text style={styles.instructions}>Current Data</Text> | ||||
| 
 | ||||
| 				<ScrollView style={styles.table} horizontal={true} > | ||||
| 					<Table style={styles.table}> | ||||
| 						<TableWrapper> | ||||
| 							<Row data={this.state.cols} style={styles.thead} textStyle={styles.text} widthArr={this.state.widthArr}/> | ||||
| 						</TableWrapper> | ||||
| 						<TouchableWithoutFeedback> | ||||
| 							<ScrollView vertical={true}> | ||||
| 								<TableWrapper> | ||||
| 									<Rows data={this.state.data} style={styles.tr} textStyle={styles.text} widthArr={this.state.widthArr}/> | ||||
| 								</TableWrapper> | ||||
| 							</ScrollView> | ||||
| 						</TouchableWithoutFeedback> | ||||
| 					</Table> | ||||
| 				</ScrollView> | ||||
| 			</ScrollView> | ||||
| 		); | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| const styles = StyleSheet.create({ | ||||
| 	container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF' }, | ||||
| 	welcome: { fontSize: 20, textAlign: 'center', margin: 10 }, | ||||
| 	instructions: { textAlign: 'center', color: '#333333', marginBottom: 5 }, | ||||
| 	thead: { height: 40, backgroundColor: '#f1f8ff' }, | ||||
| 	tr: { height: 30 }, | ||||
| 	text: { marginLeft: 5 }, | ||||
| 	table: { width: "100%" } | ||||
| }); | ||||
| 
 | ||||
| AppRegistry.registerComponent('SheetJS', () => SheetJS); | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 68 KiB | 
| @ -1,6 +1,6 @@ | ||||
| # RequireJS | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/bundler#requirejs) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/bundler#requirejs) | ||||
| includes a live example and improved explanations. | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # Rollup | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/bundler#rollup) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/bundler#rollup) | ||||
| includes a simple example and improved explanations. | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										2
									
								
								demos/systemjs/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								demos/systemjs/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +0,0 @@ | ||||
| systemjs/ | ||||
| xlsx.full.min.js | ||||
| @ -1,6 +1,6 @@ | ||||
| # SystemJS Demos | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/bundler#systemjs) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/bundler#systemjs) | ||||
| includes a live example and improved explanations. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
							
								
								
									
										2
									
								
								demos/vue/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								demos/vue/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +0,0 @@ | ||||
| SheetJS | ||||
| .nuxt | ||||
| @ -1,16 +1,3 @@ | ||||
| .PHONY: vue | ||||
| vue: ## Simple server for vue
 | ||||
| 	python -mSimpleHTTPServer | ||||
| 
 | ||||
| .PHONY: nuxt | ||||
| nuxt: ## nuxt.js demo
 | ||||
| 	npm i https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz @nuxt/content | ||||
| 	npx nuxt | ||||
| 
 | ||||
| .PHONY: weex | ||||
| weex: ## Build weex project
 | ||||
| 	bash ./weex.sh | ||||
| 
 | ||||
| .PHONY: ios | ||||
| ios: weex ## weex ios sim
 | ||||
| 	cd SheetJS; weexpack run ios; cd - | ||||
| 	python -mSimpleHTTPServer || python3 -mhttp.server | ||||
|  | ||||
| @ -70,57 +70,14 @@ function make_cols(refstr/*:string*/) { | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## WeeX | ||||
| ## Mobile Apps | ||||
| 
 | ||||
| <img src="screen.png" width="400px"/> | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/mobile#quasar) uses the | ||||
| Quasar Framework in a VueJS + Vite project to generate a native iOS app. | ||||
| 
 | ||||
| Reproducing the full project is a little bit tricky.  The included `weex.sh` | ||||
| script performs the necessary installation steps. | ||||
| ## Nuxt Content | ||||
| 
 | ||||
| WeeX is a framework for building real mobile apps, akin to React Native.  The | ||||
| ecosystem is not quite as mature as React Native, missing basic features like | ||||
| document access.  As a result, this demo uses the `stream.fetch` API to upload | ||||
| Base64-encoded documents to <https://hastebin.com> and download a precomputed | ||||
| [Base64-encoded workbook](http://sheetjs.com/sheetjs.xlsx.b64). | ||||
| 
 | ||||
| Using NodeJS it is straightforward to convert to/from Base64: | ||||
| 
 | ||||
| ```js | ||||
| /* convert sheetjs.xlsx -> sheetjs.xlsx.b64 */ | ||||
| var buf = fs.readFileSync("sheetjs.xlsx"); | ||||
| fs.writeFileSync("sheetjs.xlsx.b64", buf.toString("base64")); | ||||
| 
 | ||||
| /* convert sheetjs.xls.b64 -> sheetjs.xls */ | ||||
| var str = fs.readFileSync("sheetjs.xls.b64").toString(); | ||||
| fs.writeFileSync("sheetjs.xls", new Buffer(str, "base64")); | ||||
| ``` | ||||
| 
 | ||||
| ## Other Demos | ||||
| 
 | ||||
| ### Nuxt Content | ||||
| 
 | ||||
| `@nuxt/content` parser can be extended to support spreadsheet hot reload: | ||||
| 
 | ||||
| ```js | ||||
| // nuxt.config.js | ||||
| import { readFile, utils } from 'xlsx'; | ||||
| 
 | ||||
| const parseXLSX = (file, { path }) => { | ||||
|   const wb = readFile(path); | ||||
|   const o = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])})); | ||||
|   return { data: o }; | ||||
| } | ||||
| 
 | ||||
| export default { | ||||
|   content: { | ||||
|     extendParser: { | ||||
|       ".numbers": parseXLSX, | ||||
|       ".xlsx": parseXLSX, | ||||
|       ".xls": parseXLSX | ||||
|       // ... other extensions | ||||
|     } | ||||
|   } | ||||
| } | ||||
| ``` | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/content#nuxtjs) includes a | ||||
| complete example starting from `create-nuxt-app`. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| @ -25,7 +25,7 @@ | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS + VueJS2 demo</a></b> | ||||
| <b><a href="http://sheetjs.com">SheetJS + VueJS3 demo</a></b> | ||||
| 
 | ||||
| The core library can be used as-is in Vue applications. | ||||
| The <a href="https://github.com/sheetjs/js-xlsx">Community Edition README</a> details some common use cases. | ||||
|  | ||||
| @ -1,66 +0,0 @@ | ||||
| <!-- xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com --> | ||||
| <template> | ||||
| 	<div class="container"> | ||||
| 		<image :src="logoUrl" class="logo"></image> | ||||
| 		<text class="welcome">SheetJS WeeX Demo {{version}}</text> | ||||
| 		<text class="instructions">Import Data</text> | ||||
| 		<text :style="{ color: '#841584' }" @click="importFile">Download spreadsheet</text> | ||||
| 		<text class="instructions">Export Data</text> | ||||
| 		<text :style="{ color: data.length ? '#841584' : '#CDCDCD', disabled: !data.length }" @click="exportFile">Upload XLSX</text> | ||||
| 		<text style="instructions">Current Data</text> | ||||
| 		<scroller class="scroller"> | ||||
| 			<div class="row" v-for="(row, ridx) in data" :key="ridx"> | ||||
| 				<text>ROW {{ridx + 1}}</text> | ||||
| 				<text v-for="(cell, cidx) in row" :key="cidx">CELL {{get_label(ridx, cidx)}}:{{cell}}</text> | ||||
| 			</div> | ||||
| 		</scroller> | ||||
| 	</div> | ||||
| </template> | ||||
| 
 | ||||
| <style> | ||||
| .container { height: 100%; flex: 1; justify-content: center; align-items: center; background-color: '#F5FCFF'; } | ||||
| .logo { width: 256px; height: 256px; } | ||||
| .welcome { font-size: 40; text-align: 'center'; margin: 10; } | ||||
| .instructions { padding-top: 20px; color:#888; font-size: 24px;} | ||||
| .scroller { height: 500px; border-width: 3px; width: 700px; } | ||||
| .loading { justify-content: center; } | ||||
| </style> | ||||
| 
 | ||||
| <script> | ||||
| import * as XLSX from 'xlsx'; | ||||
| const modal = weex.requireModule('modal'); | ||||
| const stream = weex.requireModule('stream'); | ||||
| export default { | ||||
| 	data: { | ||||
| 		data: [[1,2,3],[4,5,6]], | ||||
| 		logoUrl: 'http://oss.sheetjs.com/assets/img/logo.png', | ||||
| 		version: XLSX.version, | ||||
| 		fileUrl: 'http://sheetjs.com/sheetjs.xlsx.b64', | ||||
| 		binUrl: 'https://hastebin.com/documents' | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		importFile: function (e) { | ||||
| 			modal.toast({ message: 'getting ' + this.fileUrl, duration: 1 }); | ||||
| 			var self = this; | ||||
| 			stream.fetch({method:'GET', type:'text', url:this.fileUrl}, function(res){ | ||||
| 				const wb = XLSX.read(res.data, {type:'base64'}); | ||||
| 				const ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 				self.data = XLSX.utils.sheet_to_json(ws, {header:1}); | ||||
| 			}); | ||||
| 		}, | ||||
| 		exportFile: function (e) { | ||||
| 			var self = this; | ||||
| 			const ws = XLSX.utils.aoa_to_sheet(this.data); | ||||
| 			const wb = XLSX.utils.book_new(); | ||||
| 			XLSX.utils.book_append_sheet(wb, ws, "SheetJS"); | ||||
| 			const wbout = XLSX.write(wb, {type:"base64", bookType:"xlsx"}); | ||||
| 			const body = wbout; | ||||
| 			stream.fetch({method:'POST', type:'json', url:this.binUrl, body:body}, function(res) { | ||||
| 				modal.toast({ message: 'KEY: ' + res.data.key, duration: 10 }); | ||||
| 				self.version = res.data.key; | ||||
| 			}); | ||||
| 		}, | ||||
| 		get_label: function(r, c) { return XLSX.utils.encode_cell({r:r, c:c})} | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
| @ -1,20 +0,0 @@ | ||||
| // nuxt.config.js
 | ||||
| import { readFile, utils } from 'xlsx'; | ||||
| 
 | ||||
| const parseXLSX = (file, { path }) => { | ||||
|   const wb = readFile(path); | ||||
|   const o = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])})); | ||||
|   return { data: o }; | ||||
| } | ||||
| 
 | ||||
| export default { | ||||
|   modules: [ '@nuxt/content' ], | ||||
|   content: { | ||||
|     extendParser: { | ||||
|       ".numbers": parseXLSX, | ||||
|       ".xlsx": parseXLSX, | ||||
|       ".xls": parseXLSX | ||||
|       // ...
 | ||||
|     } | ||||
|   }, | ||||
| } | ||||
| @ -1,7 +0,0 @@ | ||||
| { | ||||
|   "dependencies": { | ||||
|     "@nuxt/content": "1.15.1", | ||||
|     "nuxt": "2.15.8", | ||||
|     "xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz" | ||||
|   } | ||||
| } | ||||
| @ -1,24 +0,0 @@ | ||||
| <!-- xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com --> | ||||
| <template> | ||||
| <div> | ||||
|   <div v-for="item in data.data" v-bind:key="item.name"> | ||||
|     <h2>{{ item.name }}</h2> | ||||
|     <table> | ||||
|       <tr v-for="row in item.data" v-bind:key="row.Index"> | ||||
|         <td>{{ row.Name }}</td> | ||||
|         <td>{{ row.Index }}</td> | ||||
|       </tr> | ||||
|     </table> | ||||
|   </div> | ||||
| </div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
|   async asyncData ({$content}) { | ||||
|     return { | ||||
|       data: await $content('sheetjs').fetch() | ||||
|     }; | ||||
|   } | ||||
| } | ||||
| </script> | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 97 KiB | 
| @ -1 +0,0 @@ | ||||
| ../shim.js | ||||
							
								
								
									
										1
									
								
								demos/vue/static/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/vue/static/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| ../xlsx.full.min.js | ||||
| @ -1,16 +0,0 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| if [ ! -e SheetJS ]; then | ||||
| 	weexpack create SheetJS | ||||
| 	cd SheetJS | ||||
| 	npm install | ||||
| 	weexpack platform add ios | ||||
| 	# see https://github.com/weexteam/weex-pack/issues/133#issuecomment-295806132 | ||||
| 	sed -i.bak 's/ATSDK-Weex/ATSDK/g' platforms/ios/Podfile | ||||
| 	cd - | ||||
| fi | ||||
| cp native.vue SheetJS/src/index.vue | ||||
| if [ ! -e SheetJS/web/bootstrap.min.css ]; then | ||||
| 	curl -O https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css | ||||
| 	mv bootstrap.min.css SheetJS/web/ | ||||
| fi | ||||
| @ -1,6 +1,6 @@ | ||||
| # Webpack | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/bundler#webpack) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/bundler#webpack) | ||||
| reflects the new default behavior to use the ESM build. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| # XMLHttpRequest and fetch | ||||
| 
 | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/network) | ||||
| [The new demo](https://docs.sheetjs.com/docs/demos/network) | ||||
| includes interactive demos and improved explanations. | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user