forked from sheetjs/docs.sheetjs.com
		
	spellcheck
This commit is contained in:
		
							parent
							
								
									4c92216ebe
								
							
						
					
					
						commit
						eb096bf09c
					
				
							
								
								
									
										177
									
								
								.spelling
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										177
									
								
								.spelling
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
# xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com
 | 
			
		||||
# SheetJS (C) 2013-present SheetJS -- http://sheetjs.com
 | 
			
		||||
SheetJS
 | 
			
		||||
sheetjs
 | 
			
		||||
docs.sheetjs.com
 | 
			
		||||
@ -10,18 +10,19 @@ DocCardList
 | 
			
		||||
# Excel-related terms
 | 
			
		||||
A1-Style
 | 
			
		||||
AutoFilter
 | 
			
		||||
BIFF12
 | 
			
		||||
BIFF2
 | 
			
		||||
BIFF3
 | 
			
		||||
BIFF4
 | 
			
		||||
BIFF5
 | 
			
		||||
BIFF8
 | 
			
		||||
BIFF12
 | 
			
		||||
CFB
 | 
			
		||||
CSV
 | 
			
		||||
Chartsheet
 | 
			
		||||
Chartsheets
 | 
			
		||||
DBF
 | 
			
		||||
DIF
 | 
			
		||||
DSV
 | 
			
		||||
Dialogsheet
 | 
			
		||||
Dialogsheets
 | 
			
		||||
ECMA-376
 | 
			
		||||
@ -51,6 +52,7 @@ SYLK
 | 
			
		||||
SpreadsheetML
 | 
			
		||||
TSV
 | 
			
		||||
TXT
 | 
			
		||||
Tooltips
 | 
			
		||||
UOS
 | 
			
		||||
UOS1
 | 
			
		||||
UOS2
 | 
			
		||||
@ -76,10 +78,10 @@ WQ3
 | 
			
		||||
XLML
 | 
			
		||||
XLR
 | 
			
		||||
XLS
 | 
			
		||||
XLW
 | 
			
		||||
XLSB
 | 
			
		||||
XLSM
 | 
			
		||||
XLSX
 | 
			
		||||
XLW
 | 
			
		||||
chartsheet
 | 
			
		||||
chartsheets
 | 
			
		||||
dBASE
 | 
			
		||||
@ -103,85 +105,155 @@ tooltips
 | 
			
		||||
9.x
 | 
			
		||||
APIs
 | 
			
		||||
ActiveX
 | 
			
		||||
AngularJS
 | 
			
		||||
ArrayBuffer
 | 
			
		||||
Auth
 | 
			
		||||
BOM
 | 
			
		||||
Base64
 | 
			
		||||
Base64-encoded
 | 
			
		||||
Booleans
 | 
			
		||||
Browserify
 | 
			
		||||
Bundlers
 | 
			
		||||
CDN
 | 
			
		||||
CEP
 | 
			
		||||
CLI
 | 
			
		||||
CMS
 | 
			
		||||
CORS
 | 
			
		||||
CRX
 | 
			
		||||
CS6
 | 
			
		||||
CapacitorJS
 | 
			
		||||
Chakra
 | 
			
		||||
ChakraCore
 | 
			
		||||
CommonJS
 | 
			
		||||
Cordova
 | 
			
		||||
DOM
 | 
			
		||||
DPI
 | 
			
		||||
DataGrid
 | 
			
		||||
Deno
 | 
			
		||||
Downloadify
 | 
			
		||||
Drash
 | 
			
		||||
Duktape
 | 
			
		||||
ES3
 | 
			
		||||
ES5
 | 
			
		||||
ES6
 | 
			
		||||
ESM
 | 
			
		||||
ETH
 | 
			
		||||
Ethercalc
 | 
			
		||||
ExpressJS
 | 
			
		||||
ExtendScript
 | 
			
		||||
Fastify
 | 
			
		||||
FileReader
 | 
			
		||||
GatsbyJS
 | 
			
		||||
Goja
 | 
			
		||||
HTML
 | 
			
		||||
HTML5
 | 
			
		||||
HTTP
 | 
			
		||||
HTTPS
 | 
			
		||||
IE
 | 
			
		||||
IE8
 | 
			
		||||
IE10
 | 
			
		||||
IE11
 | 
			
		||||
IE6
 | 
			
		||||
IE8
 | 
			
		||||
IE9
 | 
			
		||||
InDesign
 | 
			
		||||
IndexedDB
 | 
			
		||||
Integrations
 | 
			
		||||
JDK
 | 
			
		||||
JS
 | 
			
		||||
JSX
 | 
			
		||||
JavaScriptCore
 | 
			
		||||
JerryScript
 | 
			
		||||
Knex
 | 
			
		||||
KnockoutJS
 | 
			
		||||
LLC
 | 
			
		||||
LWC
 | 
			
		||||
Lifecycle
 | 
			
		||||
LocalStorage
 | 
			
		||||
LowDB
 | 
			
		||||
Lume
 | 
			
		||||
MVC
 | 
			
		||||
MVVM
 | 
			
		||||
MacOS
 | 
			
		||||
MariaDB
 | 
			
		||||
Meridiem
 | 
			
		||||
MongoDB
 | 
			
		||||
MySQL
 | 
			
		||||
NPM
 | 
			
		||||
NW.js
 | 
			
		||||
Nashorn
 | 
			
		||||
NativeScript
 | 
			
		||||
NestJS
 | 
			
		||||
NetSuite
 | 
			
		||||
NextJS
 | 
			
		||||
NoSQL
 | 
			
		||||
NodeJS
 | 
			
		||||
Northwind
 | 
			
		||||
Nunjucks
 | 
			
		||||
Nuxt
 | 
			
		||||
NuxtJS
 | 
			
		||||
PPI
 | 
			
		||||
PhantomJS
 | 
			
		||||
Photoshop
 | 
			
		||||
PostgreSQL
 | 
			
		||||
PowerShell
 | 
			
		||||
Preact
 | 
			
		||||
QuickJS
 | 
			
		||||
R1
 | 
			
		||||
R2
 | 
			
		||||
R5
 | 
			
		||||
R9
 | 
			
		||||
RDBMS
 | 
			
		||||
README
 | 
			
		||||
RESTlets
 | 
			
		||||
ReactJS
 | 
			
		||||
Redis
 | 
			
		||||
RequireJS
 | 
			
		||||
Roadmap
 | 
			
		||||
Rollup
 | 
			
		||||
S3
 | 
			
		||||
SDK
 | 
			
		||||
SQLite
 | 
			
		||||
SSL
 | 
			
		||||
SWC
 | 
			
		||||
SWF
 | 
			
		||||
Schemas
 | 
			
		||||
Serverless
 | 
			
		||||
SessionStorage
 | 
			
		||||
SlimerJS
 | 
			
		||||
Snowpack
 | 
			
		||||
SuiteScript
 | 
			
		||||
SuiteScripts
 | 
			
		||||
Suitelets
 | 
			
		||||
SystemJS
 | 
			
		||||
Tauri
 | 
			
		||||
TensorFlow
 | 
			
		||||
UI
 | 
			
		||||
UI5
 | 
			
		||||
URI
 | 
			
		||||
UTF-16
 | 
			
		||||
UTF-8
 | 
			
		||||
UXP
 | 
			
		||||
V2
 | 
			
		||||
V8
 | 
			
		||||
VBScript
 | 
			
		||||
VSCodium
 | 
			
		||||
Vendoring
 | 
			
		||||
Vite
 | 
			
		||||
ViteJS
 | 
			
		||||
VueJS
 | 
			
		||||
VueJS-friendly
 | 
			
		||||
WMR
 | 
			
		||||
WSL
 | 
			
		||||
WebAssembly
 | 
			
		||||
WebGL
 | 
			
		||||
WebKit
 | 
			
		||||
WebSQL
 | 
			
		||||
Webpack
 | 
			
		||||
XHR
 | 
			
		||||
XMLHttpRequest
 | 
			
		||||
XP
 | 
			
		||||
Xcode
 | 
			
		||||
angular-cli
 | 
			
		||||
async
 | 
			
		||||
axios
 | 
			
		||||
bundler
 | 
			
		||||
@ -196,8 +268,10 @@ dataset
 | 
			
		||||
deduplication
 | 
			
		||||
destructuring
 | 
			
		||||
disambiguate
 | 
			
		||||
disambiguated
 | 
			
		||||
embeddable
 | 
			
		||||
encodings
 | 
			
		||||
esbuild
 | 
			
		||||
filesystem
 | 
			
		||||
globals
 | 
			
		||||
iOS
 | 
			
		||||
@ -205,9 +279,12 @@ iWork
 | 
			
		||||
javascript
 | 
			
		||||
lifecycle
 | 
			
		||||
metadata
 | 
			
		||||
microcontrollers
 | 
			
		||||
middleware
 | 
			
		||||
minified
 | 
			
		||||
minifier
 | 
			
		||||
namespace
 | 
			
		||||
natively
 | 
			
		||||
node.js
 | 
			
		||||
nodejs
 | 
			
		||||
npm
 | 
			
		||||
parsers
 | 
			
		||||
@ -216,78 +293,32 @@ pre-generated
 | 
			
		||||
prepend
 | 
			
		||||
prepended
 | 
			
		||||
programmatically
 | 
			
		||||
renderer
 | 
			
		||||
repo
 | 
			
		||||
runtime
 | 
			
		||||
serverless
 | 
			
		||||
subfolder
 | 
			
		||||
submodule
 | 
			
		||||
transpiled
 | 
			
		||||
uncheck
 | 
			
		||||
unpkg
 | 
			
		||||
utils
 | 
			
		||||
vendoring
 | 
			
		||||
webpack
 | 
			
		||||
weex
 | 
			
		||||
 | 
			
		||||
 - demos/altjs/README.md
 | 
			
		||||
ChakraCore
 | 
			
		||||
Duktape
 | 
			
		||||
Goja
 | 
			
		||||
Nashorn
 | 
			
		||||
QuickJS
 | 
			
		||||
 | 
			
		||||
 - demos/angular/README.md
 | 
			
		||||
AngularJS
 | 
			
		||||
 
 | 
			
		||||
 - demos/angular2/README.md
 | 
			
		||||
NativeScript
 | 
			
		||||
angular-cli
 | 
			
		||||
 | 
			
		||||
 - demos/array/README.md
 | 
			
		||||
WebGL
 | 
			
		||||
WebAssembly
 | 
			
		||||
dataset
 | 
			
		||||
TensorFlow
 | 
			
		||||
 | 
			
		||||
 - demos/database/README.md
 | 
			
		||||
Knex
 | 
			
		||||
LowDB
 | 
			
		||||
MariaDB
 | 
			
		||||
MongoDB
 | 
			
		||||
MySQL
 | 
			
		||||
PostgreSQL
 | 
			
		||||
schemaless
 | 
			
		||||
schemas
 | 
			
		||||
serverless
 | 
			
		||||
sideloaded
 | 
			
		||||
storages
 | 
			
		||||
 | 
			
		||||
 - demos/extendscript/README.md
 | 
			
		||||
Photoshop
 | 
			
		||||
InDesign
 | 
			
		||||
minifier
 | 
			
		||||
 | 
			
		||||
 - demos/function/README.md
 | 
			
		||||
microservice
 | 
			
		||||
 | 
			
		||||
 - demos/headless/README.md
 | 
			
		||||
PhantomJS
 | 
			
		||||
SlimerJS
 | 
			
		||||
subfolder
 | 
			
		||||
submodule
 | 
			
		||||
superagent
 | 
			
		||||
transpile
 | 
			
		||||
transpiled
 | 
			
		||||
transpiling
 | 
			
		||||
uncheck
 | 
			
		||||
unidimensional
 | 
			
		||||
unminified
 | 
			
		||||
unpkg
 | 
			
		||||
utils
 | 
			
		||||
v4
 | 
			
		||||
vendoring
 | 
			
		||||
vscode-data-preview
 | 
			
		||||
webpack
 | 
			
		||||
weex
 | 
			
		||||
wkhtmltopdf
 | 
			
		||||
 | 
			
		||||
 - demos/nwjs/README.md
 | 
			
		||||
NW.js
 | 
			
		||||
 | 
			
		||||
 - demos/react/README.md
 | 
			
		||||
Next.js
 | 
			
		||||
Preact
 | 
			
		||||
 | 
			
		||||
 - demos/server/README.md
 | 
			
		||||
hapi
 | 
			
		||||
 | 
			
		||||
 - demos/showcase/README.md
 | 
			
		||||
vscode-data-preview
 | 
			
		||||
 | 
			
		||||
 - demos/xhr/README.md
 | 
			
		||||
axios
 | 
			
		||||
superagent
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# frontmatter noise
 | 
			
		||||
api
 | 
			
		||||
csf
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@ -12,7 +12,7 @@ serve:
 | 
			
		||||
 | 
			
		||||
.PHONY: spell
 | 
			
		||||
spell:
 | 
			
		||||
	npx spellchecker-cli -d .spelling -f 'docz/**/*.md*' --no-suggestions
 | 
			
		||||
	npx spellchecker-cli -q -d .spelling -f 'docz/**/*.md*' --no-suggestions
 | 
			
		||||
 | 
			
		||||
.PHONY: index
 | 
			
		||||
index: readme ## Rebuild site
 | 
			
		||||
 | 
			
		||||
@ -28,8 +28,8 @@ The `latest` tag references the latest version and updates with each release:
 | 
			
		||||
 | 
			
		||||
:::warning
 | 
			
		||||
 | 
			
		||||
A number of CDNs host older versions of the SheetJS libraries.  Due to syncing
 | 
			
		||||
issues, they are generally out of date.
 | 
			
		||||
A number of services host older versions of the SheetJS libraries.  Due to
 | 
			
		||||
syncing issues, they are generally out of date.
 | 
			
		||||
 | 
			
		||||
They are known CDN bugs.
 | 
			
		||||
 | 
			
		||||
@ -105,7 +105,7 @@ importScripts("https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.mi
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
This section refers to imports using `script type="module"`.  For imports in
 | 
			
		||||
modern projects using Webpack or React or Angular or Vue, the installation is
 | 
			
		||||
modern projects using Webpack or React or Angular or VueJS, the installation is
 | 
			
		||||
described [in the next section](./frameworks).
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
@ -111,7 +111,7 @@ The package will be installed and accessible as `xlsx`.
 | 
			
		||||
#### CommonJS `require`
 | 
			
		||||
 | 
			
		||||
By default, the module supports `require` and it will automatically add support
 | 
			
		||||
for streams and filesystem access:
 | 
			
		||||
for streams and file system access:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var XLSX = require("xlsx");
 | 
			
		||||
 | 
			
		||||
@ -25,8 +25,12 @@ This demo was built on a "Developer Edition" account. At the time of writing, an
 | 
			
		||||
 | 
			
		||||
### Create Sample Project and Component
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-disable -->
 | 
			
		||||
 | 
			
		||||
Following the steps in ["Develop in Non-Scratch Orgs"](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.get_started_sfdx_deploy):
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-enable -->
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
## Login
 | 
			
		||||
sfdx force:auth:web:login -d -a LWC-Hub
 | 
			
		||||
@ -101,7 +105,7 @@ Click "Save" to activate the page, then click the left arrow to return to Setup.
 | 
			
		||||
Click the App Launcher and select "Bolt Solutions" then "SheetJS Demo".  You
 | 
			
		||||
should see a page like
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Adding the Standalone Script
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ support.  Over the years there have been a few different JavaScript platforms:
 | 
			
		||||
 | 
			
		||||
- "UXP": This is the current Adobe recommendation for new CC extensions.
 | 
			
		||||
 | 
			
		||||
This demo intends to cover the SheetJS-related parts.  General setup as well as
 | 
			
		||||
This demo intends to cover parts relevant to SheetJS.  General setup as well as
 | 
			
		||||
general Adobe considerations are not covered here.  A basic familiarity with
 | 
			
		||||
extension development is assumed.
 | 
			
		||||
 | 
			
		||||
@ -122,8 +122,8 @@ XLSX.writeFile(workbook, thisFile.absoluteURI);
 | 
			
		||||
<details open><summary><b>Complete Example</b> (click to hide)</summary>
 | 
			
		||||
 | 
			
		||||
In this example, the script will show a dialog to select an output file.  Once
 | 
			
		||||
selected, the library will create a new workbook with one worksheet.  Cell A1
 | 
			
		||||
will be "Author" and cell B1 will be the active Photoshop document Author.
 | 
			
		||||
selected, the library will create a new workbook with one worksheet.  Cell `A1`
 | 
			
		||||
will be "Author" and cell `B1` will be the active Photoshop document Author.
 | 
			
		||||
The PS author is available as `activeDocument.info.author`.
 | 
			
		||||
 | 
			
		||||
This demo was verified in Photoshop CS6 64-bit on Windows 10.
 | 
			
		||||
 | 
			
		||||
@ -231,7 +231,7 @@ documents, and other simple data files. They enable workflows where the library
 | 
			
		||||
generates CSV data for the database to process or where the library parses CSV
 | 
			
		||||
files created by the database.
 | 
			
		||||
 | 
			
		||||
#### Worksheets to CSVs
 | 
			
		||||
#### Worksheet to CSV
 | 
			
		||||
 | 
			
		||||
CSV data can be generated from worksheets using `XLSX.utils.sheet_to_csv`.
 | 
			
		||||
 | 
			
		||||
@ -243,7 +243,7 @@ const csv = XLSX.utils.sheet_to_json(ws);
 | 
			
		||||
const csv_arr = wb.SheetNames.map(n => XLSX.utils.sheet_to_json(wb.Sheets[n]));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### CSVs to Worksheets
 | 
			
		||||
#### CSV to Worksheet
 | 
			
		||||
 | 
			
		||||
`XLSX.read` can read strings with CSV data.  It will generate single-sheet
 | 
			
		||||
workbooks with worksheet name `Sheet1`.
 | 
			
		||||
@ -432,11 +432,11 @@ db.readTransaction(tx =>
 | 
			
		||||
);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The following demo generates a database with hardcoded SQL statements. Queries
 | 
			
		||||
The following demo generates a database with 5 fixed SQL statements. Queries
 | 
			
		||||
can be changed in the Live Editor.  The WebSQL database can be inspected in the
 | 
			
		||||
"WebSQL" section of the "Application" Tab of Developer Tools:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
```jsx live
 | 
			
		||||
function SheetQL() {
 | 
			
		||||
@ -735,14 +735,6 @@ async function generate_sql(knex, ws, wsname) {
 | 
			
		||||
 | 
			
		||||
### MongoDB Structured Collections
 | 
			
		||||
 | 
			
		||||
:::warning MongoDB Relicense
 | 
			
		||||
 | 
			
		||||
This demo was originally written when MongoDB was licensed under AGPLv3. It was
 | 
			
		||||
relicensed in 2018 to the Server-Side Public License. This demo was tested with
 | 
			
		||||
the "MongoDB Community Server" and may not work with the "Enterprise" Server.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
MongoDB is a popular document-oriented database engine.
 | 
			
		||||
 | 
			
		||||
It is straightforward to treat collections as worksheets.  Each object maps to
 | 
			
		||||
@ -782,7 +774,7 @@ It was verified in Node 16.16.0.
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz mongodb
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
2) Start a MongoDB server on localhost (follow official instructions)
 | 
			
		||||
2) Start a MongoDB server on `localhost` (follow official instructions)
 | 
			
		||||
 | 
			
		||||
3) Save the following to `SheetJSMongoCRUD.mjs` (the key step is highlighted):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -71,11 +71,11 @@ var workbook = XLSX.read(f.getContents(), {type: "base64"});
 | 
			
		||||
`N/file` provides [`file.create`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4223861820.html)
 | 
			
		||||
and `file.load` for creating and loading files respectively.
 | 
			
		||||
 | 
			
		||||
Binary content must be base64-encoded.  Fortunately, `XLSX.write` with `base64`
 | 
			
		||||
Binary content must be Base64-encoded.  Fortunately, `XLSX.write` with `base64`
 | 
			
		||||
type will generate compatible Base64 strings:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* write XLSX workbook as base64 string */
 | 
			
		||||
/* write XLSX workbook as Base64 string */
 | 
			
		||||
var out = XLSX.write(workbook, { bookType: "xlsx", type: "base64" });
 | 
			
		||||
/* create file */
 | 
			
		||||
var newfile = file.create({
 | 
			
		||||
 | 
			
		||||
@ -131,7 +131,7 @@ This can be converted to a SheetJS worksheet using `XLSX.utils.aoa_to_sheet`:
 | 
			
		||||
 | 
			
		||||
### Generating an XLSB file
 | 
			
		||||
 | 
			
		||||
`XLSX.writeFile` will write a file in the filesystem:
 | 
			
		||||
`XLSX.writeFile` will write a file in the file system:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* write to SheetJS.xlsb */
 | 
			
		||||
@ -235,7 +235,7 @@ includes detailed instructions for running locally.
 | 
			
		||||
 | 
			
		||||
### Reading the Workbook File
 | 
			
		||||
 | 
			
		||||
`XLSX.readFile` can read files from the filesystem.  The following line reads
 | 
			
		||||
`XLSX.readFile` can read files from the file system.  The following line reads
 | 
			
		||||
`sheetjs.xlsx` from the current directory:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,9 @@
 | 
			
		||||
sidebar_position: 7
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
import Tabs from '@theme/Tabs';
 | 
			
		||||
import TabItem from '@theme/TabItem';
 | 
			
		||||
 | 
			
		||||
# Headless Automation
 | 
			
		||||
 | 
			
		||||
Headless automation involves controlling "headless browsers" to access websites
 | 
			
		||||
@ -18,9 +21,9 @@ back to the automation script.
 | 
			
		||||
This demo focuses on exporting table data to a workbook.  Headless browsers do
 | 
			
		||||
not generally support passing objects between the browser context and the
 | 
			
		||||
automation script, so the file data must be generated in the browser context
 | 
			
		||||
and sent back to the automation script for saving in the filesystem.  Steps:
 | 
			
		||||
and sent back to the automation script for saving in the file system.  Steps:
 | 
			
		||||
 | 
			
		||||
1) Launch the headless browser and load the target webpage.
 | 
			
		||||
1) Launch the headless browser and load the target site.
 | 
			
		||||
 | 
			
		||||
2) Add the standalone SheetJS build to the page in a `SCRIPT` tag.
 | 
			
		||||
 | 
			
		||||
@ -37,7 +40,7 @@ This demo exports data from <https://sheetjs.com/demos/table>.
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
It is also possible to parse files from the browser context, but parsing from
 | 
			
		||||
the automation context is more performant and strongly recommended.
 | 
			
		||||
the automation context is more efficient and strongly recommended.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
@ -50,6 +53,9 @@ an installer script.  Installation is straightforward:
 | 
			
		||||
npm i https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz puppeteer
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
<Tabs>
 | 
			
		||||
  <TabItem value="nodejs" label="NodeJS">
 | 
			
		||||
 | 
			
		||||
Binary strings are the favored data type.  They can be safely passed from the
 | 
			
		||||
browser context to the automation script.  NodeJS provides an API to write
 | 
			
		||||
binary strings to file (`fs.writeFileSync` using encoding `binary`).
 | 
			
		||||
@ -94,6 +100,71 @@ const puppeteer = require('puppeteer');
 | 
			
		||||
})();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This script will generate `SheetJSPuppeteer.xlsb` which can be opened in Excel.
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="deno" label="Deno">
 | 
			
		||||
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
Deno Puppeteer is a fork. It is not officially supported by the Puppeteer team.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
Installation is straightforward:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
env PUPPETEER_PRODUCT=chrome deno run -A --unstable https://deno.land/x/puppeteer@14.1.1/install.ts
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Base64 strings are the favored data type.  They can be safely passed from the
 | 
			
		||||
browser context to the automation script.  Deno can decode the Base64 strings
 | 
			
		||||
and write the decoded `Uint8Array` data to file with `Deno.writeFileSync`
 | 
			
		||||
 | 
			
		||||
To run the example, after installing the packages, save the following script to
 | 
			
		||||
`SheetJSPuppeteer.ts` and run `deno run -A --unstable SheetJSPuppeteer.js`.
 | 
			
		||||
 | 
			
		||||
```js title="SheetJSPuppeteer.ts"
 | 
			
		||||
import puppeteer from "https://deno.land/x/puppeteer@14.1.1/mod.ts";
 | 
			
		||||
import { decode } from "https://deno.land/std/encoding/base64.ts"
 | 
			
		||||
 | 
			
		||||
/* (1) Load the target page */
 | 
			
		||||
const browser = await puppeteer.launch();
 | 
			
		||||
const page = await browser.newPage();
 | 
			
		||||
page.on("console", msg => console.log("PAGE LOG:", msg.text()));
 | 
			
		||||
await page.setViewport({width: 1920, height: 1080});
 | 
			
		||||
await page.goto('https://sheetjs.com/demos/table');
 | 
			
		||||
 | 
			
		||||
/* (2) Load the standalone SheetJS build from the CDN */
 | 
			
		||||
await page.addScriptTag({ url: 'https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js' });
 | 
			
		||||
 | 
			
		||||
/* (3) Run the snippet in browser and return data */
 | 
			
		||||
const b64 = await page.evaluate(() => {
 | 
			
		||||
  /* NOTE: this function will be evaluated in the browser context.
 | 
			
		||||
     `page`, `fs` and `puppeteer` are not available.
 | 
			
		||||
     `XLSX` will be available thanks to step 2 */
 | 
			
		||||
 | 
			
		||||
  /* find first table */
 | 
			
		||||
  var table = document.body.getElementsByTagName('table')[0];
 | 
			
		||||
 | 
			
		||||
  /* call table_to_book on first table */
 | 
			
		||||
  var wb = XLSX.utils.table_to_book(table);
 | 
			
		||||
 | 
			
		||||
  /* generate XLSB and return binary string */
 | 
			
		||||
  return XLSX.write(wb, {type: "base64", bookType: "xlsb"});
 | 
			
		||||
});
 | 
			
		||||
/* (4) write data to file */
 | 
			
		||||
Deno.writeFileSync("SheetJSPuppeteer.xlsb", decode(b64));
 | 
			
		||||
 | 
			
		||||
await browser.close();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This script will generate `SheetJSPuppeteer.xlsb` which can be opened in Excel.
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
</Tabs>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Playwright
 | 
			
		||||
 | 
			
		||||
Playwright presents a unified scripting framework for Chromium, WebKit, and
 | 
			
		||||
 | 
			
		||||
@ -8,8 +8,8 @@ title: Typed Arrays and ML
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
Machine learning libraries in JS typically use "Typed Arrays". Typed Arrays are
 | 
			
		||||
not JS Arrays! SheetJS expects bona fide JS Arrays. With some data wrangling,
 | 
			
		||||
translating between SheetJS worksheets and typed arrays is straightforward.
 | 
			
		||||
not JS Arrays! With some data wrangling, translating between SheetJS worksheets
 | 
			
		||||
and typed arrays is straightforward.
 | 
			
		||||
 | 
			
		||||
This demo covers conversions between worksheets and Typed Arrays for use with
 | 
			
		||||
[TensorFlow.js](https://js.tensorflow.org/js/) and other ML libraries.
 | 
			
		||||
@ -43,7 +43,7 @@ function worksheet_to_csv_url(worksheet) {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[This demo mirrors TFjs docs](https://js.tensorflow.org/api/latest/#data.csv),
 | 
			
		||||
[This demo mirrors `TFjs` docs](https://js.tensorflow.org/api/latest/#data.csv),
 | 
			
		||||
fetching [an XLSX export of the example dataset](https://sheetjs.com/data/bht.xlsx).
 | 
			
		||||
 | 
			
		||||
<details><summary><b>TF CSV Demo using XLSX files</b> (click to show)</summary>
 | 
			
		||||
@ -193,7 +193,7 @@ var sepal_lengths = [5.1, 4.9, ...];
 | 
			
		||||
var sepal_widths  = [3.5, 3, ...];
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
When a 2D tensor can be exported, it will look different from the spreadsheet:
 | 
			
		||||
When a `tensor2d` can be exported, it will look different from the spreadsheet:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var data_set_2d = [
 | 
			
		||||
@ -292,7 +292,7 @@ var col1 = tensor.slice([0,0], [1,tensor.shape[1]]).flatten();
 | 
			
		||||
var col2 = tensor.slice([1,0], [1,tensor.shape[1]]).flatten();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For exporting, `stack` can be used to linearize the columns:
 | 
			
		||||
For exporting, `stack` can be used to collapse the columns into a linear array:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* pull data into a Float32Array */
 | 
			
		||||
 | 
			
		||||
@ -169,9 +169,9 @@ bun bun.js
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## ESBuild
 | 
			
		||||
## esbuild
 | 
			
		||||
 | 
			
		||||
The `xlsx.mjs` source file are written in a subset of ES6 that ESBuild
 | 
			
		||||
The `xlsx.mjs` source file are written in a subset of ES6 that `esbuild`
 | 
			
		||||
understands and is able to transpile down for older browsers.
 | 
			
		||||
 | 
			
		||||
Both the `node` and `browser` platforms work out of the box.
 | 
			
		||||
@ -339,7 +339,7 @@ node esb.node.js
 | 
			
		||||
 | 
			
		||||
## Parcel
 | 
			
		||||
 | 
			
		||||
Parcel Bundler should play nice with SheetJS out of the box.
 | 
			
		||||
Parcel should play nice with SheetJS out of the box.
 | 
			
		||||
 | 
			
		||||
:::warning Parcel Bug
 | 
			
		||||
 | 
			
		||||
@ -846,7 +846,7 @@ While SystemJS works in NodeJS, the built-in `require` should be preferred.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
The NodeJS module entrypoint is `xlsx/xlsx.js` and should be mapped:
 | 
			
		||||
The NodeJS module main script is `xlsx/xlsx.js` and should be mapped:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
SystemJS.config({
 | 
			
		||||
 | 
			
		||||
@ -65,7 +65,7 @@ npm run build
 | 
			
		||||
npm start
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If you have [VSCodium](https://vscodium.com/) installed, the folder can be opened with
 | 
			
		||||
If [VSCodium](https://vscodium.com/) is installed, the folder can be opened:
 | 
			
		||||
 | 
			
		||||
```powershell
 | 
			
		||||
codium .
 | 
			
		||||
@ -111,8 +111,8 @@ The `manifest.xml` should also be updated to reflect the function namespace:
 | 
			
		||||
After making the change, save the files.  Close the terminal window and the
 | 
			
		||||
Excel window (do not save the Excel file).  Re-run `npm start`.
 | 
			
		||||
 | 
			
		||||
In the new Excel window, enter the formula `=SHEETJS.VERSION()` in cell E1. You
 | 
			
		||||
should see something similar to the following screenshot:
 | 
			
		||||
In the new Excel window, enter the formula `=SHEETJS.VERSION()` in cell `E1`.
 | 
			
		||||
You should see something similar to the following screenshot:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
@ -201,7 +201,7 @@ var aoa = XLSX.utils.sheet_to_json(ws, {header: 1}); // get data as array of arr
 | 
			
		||||
 | 
			
		||||
To demonstrate the parsing ability, a Base64-encoded version of the file will
 | 
			
		||||
be used.  This file contains no binary characters and should "just work".  Once
 | 
			
		||||
the aforementioned Excel bug is fixed, the non-Base64 version can be used.
 | 
			
		||||
the aforementioned Excel bug is fixed, the raw binary files can be used.
 | 
			
		||||
 | 
			
		||||
This new function should be added to `src\functions\functions.js`:
 | 
			
		||||
 | 
			
		||||
@ -239,8 +239,8 @@ async function extern() {
 | 
			
		||||
After making the change, save the files.  Close the terminal window and the
 | 
			
		||||
Excel window (do not save the Excel file).  Re-run `npm start`.
 | 
			
		||||
 | 
			
		||||
Enter the formula `=SHEETJS.EXTERN()` in cell D1 and press Enter.  Excel should
 | 
			
		||||
pull in the data and generate a dynamic array:
 | 
			
		||||
Enter the formula `=SHEETJS.EXTERN()` in cell `D1` and press Enter.  Excel
 | 
			
		||||
should pull in the data and generate a dynamic array:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -67,7 +67,7 @@ demo pages should be downloaded and hosted using a simple HTTP server.
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
<http://oss.sheetjs.com/sheetjs/ajax.html> uses XMLHttpRequest to download test
 | 
			
		||||
files and convert to CSV.
 | 
			
		||||
files and convert to CSV
 | 
			
		||||
 | 
			
		||||
<https://oss.sheetjs.com/sheetjs/> demonstrates reading files with `FileReader`.
 | 
			
		||||
 | 
			
		||||
@ -108,11 +108,11 @@ input_dom_element.addEventListener('change', handle_fr, false);
 | 
			
		||||
 | 
			
		||||
`Blob#arrayBuffer` is not supported in IE!
 | 
			
		||||
 | 
			
		||||
**ActiveX-based Upload**
 | 
			
		||||
**ActiveX 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
 | 
			
		||||
scripting language can read from an arbitrary path on the file system. The shim
 | 
			
		||||
includes a special `IE_LoadFile` function to read binary data from files. This
 | 
			
		||||
should be called from a file input `onchange` event:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
@ -136,7 +136,7 @@ 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
 | 
			
		||||
It is possible to write to the file system using a SWF file.  `Downloadify`
 | 
			
		||||
implements one solution.  Since a genuine click is required, there is no way to
 | 
			
		||||
force a download.  The safest data type is Base64:
 | 
			
		||||
 | 
			
		||||
@ -159,7 +159,7 @@ Downloadify.create(element_id, {
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**ActiveX-based Download**
 | 
			
		||||
**ActiveX 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
 | 
			
		||||
 | 
			
		||||
@ -7,8 +7,8 @@ import current from '/version.js';
 | 
			
		||||
import Tabs from '@theme/Tabs';
 | 
			
		||||
import TabItem from '@theme/TabItem';
 | 
			
		||||
 | 
			
		||||
With the availability of JS engines and the success of server-side runtimes, it
 | 
			
		||||
is natural to want command-line tools for various workflows.
 | 
			
		||||
With the availability of JS engines and the success of server-side platforms,
 | 
			
		||||
it is feasible to build command-line tools for various workflows.
 | 
			
		||||
 | 
			
		||||
This demo covers a number of strategies for building standalone processors. The
 | 
			
		||||
goal is to generate CSV output from an arbitrary spreadsheet file.
 | 
			
		||||
@ -63,7 +63,7 @@ deno compile -r --allow-read sheet2csv.ts
 | 
			
		||||
 | 
			
		||||
## NodeJS
 | 
			
		||||
 | 
			
		||||
There are a few popular tools for compiling NodeJS scripts to executables.
 | 
			
		||||
There are a few popular tools for compiling NodeJS scripts to CLI programs.
 | 
			
		||||
 | 
			
		||||
The demo script presents a friendly command line interface including flags:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ import and export data.
 | 
			
		||||
 | 
			
		||||
The `sheet_to_json` utility function generates arrays of objects, which is
 | 
			
		||||
suitable for a number of libraries.  When more advanced shapes are needed,
 | 
			
		||||
it is easier to munge the output of an array of arrays.
 | 
			
		||||
it is easier to process an array of arrays.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### x-spreadsheet
 | 
			
		||||
@ -204,7 +204,7 @@ many additional features including massive data streaming, sorting and styling.
 | 
			
		||||
### Tabulator
 | 
			
		||||
 | 
			
		||||
[Tabulator](http://tabulator.info/docs/5.3/download#xlsx) includes deep support
 | 
			
		||||
through a special Export button.  It handles the SheetJS-related operations.
 | 
			
		||||
through a special Export button.  It handles the SheetJS operations internally.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Angular UI Grid
 | 
			
		||||
@ -223,7 +223,7 @@ The [AngularJS demo](./legacy#angularjs) covers more general strategies.
 | 
			
		||||
<details><summary><b>Notes</b> (click to show)</summary>
 | 
			
		||||
 | 
			
		||||
The library does not provide any way to modify the import button, so the demo
 | 
			
		||||
includes a simple directive for a HTML File Input control.  It also includes a
 | 
			
		||||
includes a simple directive for a File Input HTML element.  It also includes a
 | 
			
		||||
sample service for export which adds an item to the export menu.
 | 
			
		||||
 | 
			
		||||
The demo `SheetJSImportDirective` follows the prescription from the README for
 | 
			
		||||
@ -276,7 +276,7 @@ export default function App() {
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The most generic data representation is an array of arrays. To sate the grid,
 | 
			
		||||
the columns must be objects whose `key` property is the stringified number:
 | 
			
		||||
columns must be objects whose `key` property is the index converted to string:
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
import { WorkSheet, utils } from 'xlsx';
 | 
			
		||||
@ -314,11 +314,15 @@ function rdg_to_ws(rows: Row[]): WorkSheet {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-disable -->
 | 
			
		||||
 | 
			
		||||
#### RDG Demo
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-enable -->
 | 
			
		||||
 | 
			
		||||
<details><summary><b>Complete Example</b> (click to show)</summary>
 | 
			
		||||
 | 
			
		||||
1) Create a new TypeScript CRA app:
 | 
			
		||||
1) Create a new TypeScript `create-react-app` app:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npx create-react-app sheetjs-cra --template typescript
 | 
			
		||||
@ -333,7 +337,7 @@ npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz react-data-grid
 | 
			
		||||
 | 
			
		||||
3) Replace the contents of `src/App.tsx` with the following code.  Note: a copy
 | 
			
		||||
to clipboard button will show up if you move your mouse over the code.  The
 | 
			
		||||
notable SheetJS-specific code is highlighted below:
 | 
			
		||||
notable SheetJS integration code is highlighted below:
 | 
			
		||||
 | 
			
		||||
```tsx title="src/App.tsx"
 | 
			
		||||
import React, { useEffect, useState, ChangeEvent } from "react";
 | 
			
		||||
@ -444,8 +448,8 @@ export default function App() {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
4) run `npm start`.  When you load the dev page in the browser, it will attempt
 | 
			
		||||
to fetch <https://sheetjs.com/pres.numbers> and load the data.
 | 
			
		||||
4) run `npm start`.  When you load the page in the browser, it will attempt to
 | 
			
		||||
   fetch <https://sheetjs.com/pres.numbers> and load the data.
 | 
			
		||||
 | 
			
		||||
The following screenshot was taken from the demo:
 | 
			
		||||
 | 
			
		||||
@ -453,8 +457,12 @@ The following screenshot was taken from the demo:
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-disable -->
 | 
			
		||||
 | 
			
		||||
### vue3-table-lite
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-enable -->
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested against `vue3-table-lite 1.2.4`, VueJS `3.2.37`, ViteJS
 | 
			
		||||
@ -462,14 +470,13 @@ This demo was tested against `vue3-table-lite 1.2.4`, VueJS `3.2.37`, ViteJS
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
[`vue3-table-lite`](https://vue3-lite-table.vercel.app/) is a data grid built
 | 
			
		||||
for Vue
 | 
			
		||||
[`vue3-table-lite`](https://vue3-lite-table.vercel.app/) is a VueJS data grid.
 | 
			
		||||
 | 
			
		||||
[A complete example is included below.](#vte-demo)
 | 
			
		||||
[A complete example is included below.](#vuejs-demo)
 | 
			
		||||
 | 
			
		||||
#### Rows and Columns Bindings
 | 
			
		||||
 | 
			
		||||
`vue3-table-lite` presents two bindable attributes: an array of column metadata
 | 
			
		||||
`vue3-table-lite` presents two attribute bindings: an array of column metadata
 | 
			
		||||
(`columns`) and an array of objects representing the displayed data (`rows`).
 | 
			
		||||
Typically both are `ref` objects:
 | 
			
		||||
 | 
			
		||||
@ -493,7 +500,7 @@ const columns = ref<Column[]>([]);
 | 
			
		||||
</template>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
These can be mutated through the `value` property in Vue lifecycle methods:
 | 
			
		||||
These can be mutated through the `value` property in VueJS lifecycle methods:
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
import { onMounted } from "vue";
 | 
			
		||||
@ -504,7 +511,7 @@ onMounted(() => {
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The most generic data representation is an array of arrays. To sate the grid,
 | 
			
		||||
the columns must be objects whose `field` property is the stringified number:
 | 
			
		||||
columns must be objects whose `field` property is the index converted to string:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import { ref } from "vue";
 | 
			
		||||
@ -548,11 +555,11 @@ function vte_to_ws(rows) {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### VTE Demo
 | 
			
		||||
#### VueJS Demo
 | 
			
		||||
 | 
			
		||||
<details><summary><b>Complete Example</b> (click to show)</summary>
 | 
			
		||||
 | 
			
		||||
1) Create a new ViteJS App using the Vue + TypeScript template:
 | 
			
		||||
1) Create a new ViteJS App using the VueJS + TypeScript template:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm create vite@latest sheetjs-vue -- --template vue-ts
 | 
			
		||||
@ -575,7 +582,7 @@ curl -LO https://docs.sheetjs.com/vtl/App.vue
 | 
			
		||||
cd ..
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
4) run `npm run dev`.  When you load the dev page in the browser, it will try
 | 
			
		||||
to fetch <https://sheetjs.com/pres.numbers> and load the data.
 | 
			
		||||
4) run `npm run dev`.  When you load the page in the browser, it will try to
 | 
			
		||||
   fetch <https://sheetjs.com/pres.numbers> and load the data.
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ This library is compatible with Chrome and Chromium extensions and should just
 | 
			
		||||
work out of the box.  Specific API support is listed in the Chrome extensions
 | 
			
		||||
API documentation.
 | 
			
		||||
 | 
			
		||||
[Right-Click and download the final crx](pathname:///chromium/SheetJSDemo.crx)
 | 
			
		||||
[Right-Click and download the final CRX](pathname:///chromium/SheetJSDemo.crx)
 | 
			
		||||
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,12 +5,12 @@ title: Desktop Applications
 | 
			
		||||
 | 
			
		||||
Web technologies like JavaScript and HTML have been adapted to the traditional
 | 
			
		||||
app space.  Typically these frameworks bundle a JavaScript engine as well as a
 | 
			
		||||
windowing framework. SheetJS is compatible with many toolkits.
 | 
			
		||||
windowing framework. SheetJS is compatible with many app frameworks.
 | 
			
		||||
 | 
			
		||||
## NW.js
 | 
			
		||||
 | 
			
		||||
The [Standalone scripts](../getting-started/installation/standalone) can be referenced in a
 | 
			
		||||
`SCRIPT` tag from the entry point HTML page.
 | 
			
		||||
The [Standalone scripts](../getting-started/installation/standalone) can be
 | 
			
		||||
referenced in a `SCRIPT` tag from the entry point HTML page.
 | 
			
		||||
 | 
			
		||||
This demo was tested against NW.js 0.66.0.
 | 
			
		||||
 | 
			
		||||
@ -151,7 +151,7 @@ The demo project is wired for `electron-forge` to build the standalone binary.
 | 
			
		||||
1) Download the demo files:
 | 
			
		||||
 | 
			
		||||
- [`package.json`](pathname:///electron/package.json) : project structure
 | 
			
		||||
- [`main.js`](pathname:///electron/main.js) : entrypoint
 | 
			
		||||
- [`main.js`](pathname:///electron/main.js) : main process script
 | 
			
		||||
- [`index.html`](pathname:///electron/index.html) : window page
 | 
			
		||||
- [`index.js`](pathname:///electron/index.js) : script loaded in render context
 | 
			
		||||
 | 
			
		||||
@ -186,7 +186,7 @@ For a recent Intel Mac, the path will be `out/sheetjs-electron-darwin-x64/`
 | 
			
		||||
 | 
			
		||||
### Writing Files
 | 
			
		||||
 | 
			
		||||
[`XLSX.writeFile`](../api/write-options) writes workbooks to the filesystem.
 | 
			
		||||
[`XLSX.writeFile`](../api/write-options) writes workbooks to the file system.
 | 
			
		||||
`showSaveDialog` shows a Save As dialog and returns the selected file name:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
@ -282,7 +282,7 @@ document.getElementById("drop").addEventListener("drop", handleDrop, false);
 | 
			
		||||
 | 
			
		||||
**Electron API**
 | 
			
		||||
 | 
			
		||||
[`XLSX.readFile`](../api/parse-options) reads workbooks from the filesystem.
 | 
			
		||||
[`XLSX.readFile`](../api/parse-options) reads workbooks from the file system.
 | 
			
		||||
`showOpenDialog` shows a Save As dialog and returns the selected file name.
 | 
			
		||||
Unlike the Web APIs, the `showOpenDialog` flow can be initiated by app code:
 | 
			
		||||
 | 
			
		||||
@ -343,20 +343,20 @@ Electron 12.0.0 and later also require `worldSafeExecuteJavascript: true` and
 | 
			
		||||
`contextIsolation: true`.
 | 
			
		||||
 | 
			
		||||
Electron 14+ must use `@electron/remote` instead of `remote`.  An `initialize`
 | 
			
		||||
call is required to enable DevTools in the window.
 | 
			
		||||
call is required to enable Developer Tools in the window.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
## Tauri
 | 
			
		||||
 | 
			
		||||
The [NodeJS Module](../getting-started/installation/nodejs) can be imported
 | 
			
		||||
from frontend code.
 | 
			
		||||
from JavaScript code.
 | 
			
		||||
 | 
			
		||||
This demo was tested against Tauri 1.0.5 on 2022 August 13.
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
Tauri currently does not provide NodeJS-esque `fs` wrapper functions.  The raw
 | 
			
		||||
Tauri currently does not provide the equivalent of NodeJS `fs` module.  The raw
 | 
			
		||||
`@tauri-apps/api` methods used in the examples are not expected to change.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
@ -396,7 +396,7 @@ When prompted:
 | 
			
		||||
- Window Title: `SheetJS + Tauri`
 | 
			
		||||
- UI recipe: `create-vite`
 | 
			
		||||
- Add "@tauri-apps/api": `Y`
 | 
			
		||||
- Vite template: `vue-ts`
 | 
			
		||||
- ViteJS template: `vue-ts`
 | 
			
		||||
 | 
			
		||||
2) Enter the directory:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,12 +8,12 @@ import Tabs from '@theme/Tabs';
 | 
			
		||||
import TabItem from '@theme/TabItem';
 | 
			
		||||
 | 
			
		||||
The most popular JavaScript engine is V8.  Designed for embedding in software,
 | 
			
		||||
it powers Chrome, NodeJS, UXP, Deno and many other platforms and runtimes.
 | 
			
		||||
it powers Chrome, NodeJS, UXP, Deno and many other platforms.
 | 
			
		||||
 | 
			
		||||
There are many other runtimes with different design goals.  Some are designed
 | 
			
		||||
There are many other JS engines with different design goals.  Some are designed
 | 
			
		||||
for low-power or low-memory environments.  Others aim for interoperability with
 | 
			
		||||
specific programming languages or environments.  Typically they support a
 | 
			
		||||
superset of ES3 and are capable of running SheetJS code.
 | 
			
		||||
specific programming languages or environments.  Typically they support ES3 and
 | 
			
		||||
are capable of running SheetJS code.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## General Caveats
 | 
			
		||||
@ -40,9 +40,9 @@ var console = { log: function(x) { print(x); } };
 | 
			
		||||
 | 
			
		||||
**Binary Data**
 | 
			
		||||
 | 
			
		||||
Some engines do not provide easy ways of marshalling binary data.  For example,
 | 
			
		||||
it is common to pass null-terminated arrays, which would truncate XLSX and XLS
 | 
			
		||||
files.  APIs that accept pointers without length should be avoided.
 | 
			
		||||
Some engines do not provide easy ways to exchange binary data.  For example, it
 | 
			
		||||
is common to pass null-terminated arrays, which would truncate XLSX, XLS, and
 | 
			
		||||
other exports.  APIs that accept pointers without length should be avoided.
 | 
			
		||||
 | 
			
		||||
Base64 strings are safe for passing between JS and native code, but they should
 | 
			
		||||
only be used when there is no safe way to pass `ArrayBuffer` or `Uint8Array`.
 | 
			
		||||
@ -81,7 +81,7 @@ duk_pop(ctx);
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested on MacOS x64.
 | 
			
		||||
This demo was tested on Intel Mac (`darwin-x64`).
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
@ -256,7 +256,7 @@ wb, _ = vm.RunString("wb = XLSX.read(buf, {type:'buffer'});")
 | 
			
		||||
`"base64"` strings can be decoded in Go:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
/* write to base64 string */
 | 
			
		||||
/* write to Base64 string */
 | 
			
		||||
b64str, _ := vm.RunString("XLSX.write(wb, {type:'base64', bookType:'xlsx'})")
 | 
			
		||||
 | 
			
		||||
/* pull data back into Go and write to file */
 | 
			
		||||
@ -430,7 +430,7 @@ cat global.js xlsx.full.min.js payload.js hermes.js > xlsx.hermes.js
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The final script defines `global` before loading the standalone library.  Once
 | 
			
		||||
ready, it will read the hardcoded test file and print the contents as CSV.
 | 
			
		||||
ready, it will read the bundled test data and print the contents as CSV.
 | 
			
		||||
 | 
			
		||||
5) Run the script using the Hermes standalone binary:
 | 
			
		||||
 | 
			
		||||
@ -461,7 +461,7 @@ Binary strings can be passed back and forth using `String.Encoding.isoLatin1`.
 | 
			
		||||
`String(contentsOf:encoding:)` reads from a path and returns an encoded string:
 | 
			
		||||
 | 
			
		||||
```swift
 | 
			
		||||
/* read sheetjs.xls as base64 string */
 | 
			
		||||
/* read sheetjs.xls as Base64 string */
 | 
			
		||||
let file_path = shared_dir.appendingPathComponent("sheetjs.xls");
 | 
			
		||||
let data: String! = try String(contentsOf: file_path, encoding: String.Encoding.isoLatin1);
 | 
			
		||||
```
 | 
			
		||||
@ -478,8 +478,8 @@ context.evaluateScript("var wb = XLSX.read(payload, {type:'binary'});");
 | 
			
		||||
 | 
			
		||||
**Writing data**
 | 
			
		||||
 | 
			
		||||
When writing to binary string in JSC, the result should be stored in a variable
 | 
			
		||||
and stringified in Swift:
 | 
			
		||||
When writing to binary string in JavaScriptCore, the result should be stored in
 | 
			
		||||
a variable and converted to string in Swift:
 | 
			
		||||
 | 
			
		||||
```swift
 | 
			
		||||
/* write to binary string */
 | 
			
		||||
@ -618,7 +618,7 @@ cat global.js xlsx.full.min.js payload.js jerry.js > xlsx.jerry.js
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The final script defines `global` before loading the standalone library.  Once
 | 
			
		||||
ready, it will read the hardcoded test file and print the contents as CSV.
 | 
			
		||||
ready, it will read the bundled test data and print the contents as CSV.
 | 
			
		||||
 | 
			
		||||
5) Run the script using the `jerry` standalone binary:
 | 
			
		||||
 | 
			
		||||
@ -834,7 +834,7 @@ cat global.js xlsx.full.min.js payload.js chakra.js > xlsx.chakra.js
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The final script defines `global` before loading the standalone library.  Once
 | 
			
		||||
ready, it will read the hardcoded test file and print the contents as CSV.
 | 
			
		||||
ready, it will read the bundled test data and print the contents as CSV.
 | 
			
		||||
 | 
			
		||||
5) Run the script using the ChakraCore standalone binary:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -68,7 +68,7 @@ The following table lists tested file plugins.  "OS" lists tested platforms
 | 
			
		||||
("A" for Android and "I" for iOS).  "Copy" indicates whether an explicit copy
 | 
			
		||||
is needed (file picker copies to cache directory and file plugin reads cache).
 | 
			
		||||
 | 
			
		||||
| Filesystem Plugin          | File Picker Plugin             |  OS  | Copy |
 | 
			
		||||
| File system Plugin         | File Picker Plugin             |  OS  | Copy |
 | 
			
		||||
|:---------------------------|:-------------------------------|:----:|:-----|
 | 
			
		||||
| `react-native-file-access` | `react-native-document-picker` | `AI` |      |
 | 
			
		||||
| `react-native-blob-util`   | `react-native-document-picker` | `AI` | YES  |
 | 
			
		||||
@ -165,7 +165,7 @@ const wb = XLSX.read(new Uint8Array(res), {type:'buffer'});
 | 
			
		||||
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
On iOS, URIs from `react-native-document-picker` must be massaged:
 | 
			
		||||
On iOS, the URI from `react-native-document-picker` must be massaged:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import { pickSingle } from 'react-native-document-picker';
 | 
			
		||||
@ -218,7 +218,7 @@ import * as XLSX from "xlsx";
 | 
			
		||||
import { FileSystem } from "react-native-file-access";
 | 
			
		||||
 | 
			
		||||
const b64 = await FileSystem.readFile(path, "base64");
 | 
			
		||||
/* b64 is a base64 string */
 | 
			
		||||
/* b64 is a Base64 string */
 | 
			
		||||
const workbook = XLSX.read(b64, {type: "base64"});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -230,7 +230,7 @@ import { Dirs, FileSystem } from "react-native-file-access";
 | 
			
		||||
const DDP = Dirs.DocumentDir + "/";
 | 
			
		||||
 | 
			
		||||
const b64 = XLSX.write(workbook, {type:'base64', bookType:"xlsx"});
 | 
			
		||||
/* b64 is a base64 string */
 | 
			
		||||
/* b64 is a Base64 string */
 | 
			
		||||
await FileSystem.writeFile(DDP + "sheetjs.xlsx", b64, "base64");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -270,7 +270,7 @@ await writeFile(DocumentDirectoryPath + "/sheetjs.xlsx", bstr, "ascii");
 | 
			
		||||
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
Some Expo APIs return URIs that cannot be read with `expo-file-system`.  This
 | 
			
		||||
Some Expo APIs return URI that cannot be read with `expo-file-system`. This
 | 
			
		||||
will manifest as an error:
 | 
			
		||||
 | 
			
		||||
> Unsupported scheme for location '...'
 | 
			
		||||
@ -305,7 +305,7 @@ import * as XLSX from "xlsx";
 | 
			
		||||
import * as FileSystem from 'expo-file-system';
 | 
			
		||||
 | 
			
		||||
const b64 = XLSX.write(workbook, {type:'base64', bookType:"xlsx"});
 | 
			
		||||
/* b64 is a base64 string */
 | 
			
		||||
/* b64 is a Base64 string */
 | 
			
		||||
await FileSystem.writeAsStringAsync(FileSystem.documentDirectory + "sheetjs.xlsx", b64, { encoding: FileSystem.EncodingType.Base64 });
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -326,9 +326,9 @@ are not covered here.
 | 
			
		||||
 | 
			
		||||
This example tries to separate the library-specific functions.
 | 
			
		||||
 | 
			
		||||
0) **Follow the official React Native CLI Quickstart!**
 | 
			
		||||
0) **Follow the official React Native CLI Guide!**
 | 
			
		||||
 | 
			
		||||
Quickstart URL: <http://reactnative.dev/docs/environment-setup>
 | 
			
		||||
Development Environment Guide: <http://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
 | 
			
		||||
@ -587,7 +587,7 @@ pod install
 | 
			
		||||
cd ..
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
After doing this, the simulator must be stopped and the dev server must reload:
 | 
			
		||||
Once refreshed, the development process must be restarted:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npx react-native run-ios
 | 
			
		||||
@ -625,7 +625,7 @@ find ~/Library/Developer/CoreSimulator -name sheetjsw.xlsx |
 | 
			
		||||
  while read x; do echo "$x"; npx xlsx-cli "$x"; done
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Once testing is complete, stop the simulator and the dev process.
 | 
			
		||||
Once testing is complete, stop the simulator and the development process.
 | 
			
		||||
 | 
			
		||||
**Android Testing**
 | 
			
		||||
 | 
			
		||||
@ -674,7 +674,7 @@ on an iPhone SE 3rd generation.
 | 
			
		||||
 | 
			
		||||
:::warning Binary Data issues
 | 
			
		||||
 | 
			
		||||
NativeScript will not safely transmit binary or UTF8 strings. XLSB, NUMBERS,
 | 
			
		||||
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)
 | 
			
		||||
@ -731,7 +731,7 @@ await file.writeText(bstr, encoding.ISO_8859_1);
 | 
			
		||||
### Demo
 | 
			
		||||
 | 
			
		||||
The demo builds off of the NativeScript + Angular example.  Familiarity with
 | 
			
		||||
with Angular and TypeScript is assumed.
 | 
			
		||||
Angular and TypeScript is assumed.
 | 
			
		||||
 | 
			
		||||
<details><summary><b>Complete Example</b> (click to show)</summary>
 | 
			
		||||
 | 
			
		||||
@ -1088,7 +1088,7 @@ window.requestFileSystem(window.PERSISTENT, 0, function(fs) {
 | 
			
		||||
 | 
			
		||||
### Demo
 | 
			
		||||
 | 
			
		||||
The demo builds off of the Vite example.  Familiarity with VueJS and TypeScript
 | 
			
		||||
The demo draws from the ViteJS example.  Familiarity with VueJS and TypeScript
 | 
			
		||||
is assumed.
 | 
			
		||||
 | 
			
		||||
<details><summary><b>Complete Example</b> (click to show)</summary>
 | 
			
		||||
@ -1107,6 +1107,8 @@ npm i -g @quasar/cli cordova
 | 
			
		||||
npm init quasar
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-disable -->
 | 
			
		||||
 | 
			
		||||
When prompted:
 | 
			
		||||
 | 
			
		||||
- "What would you like to build?": `App with Quasar CLI`
 | 
			
		||||
@ -1125,6 +1127,8 @@ When prompted:
 | 
			
		||||
 | 
			
		||||
2) Install dependencies:
 | 
			
		||||
 | 
			
		||||
<!-- spellchecker-enable -->
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
cd SheetJSQuasar
 | 
			
		||||
npm i
 | 
			
		||||
@ -1166,7 +1170,7 @@ Return to the project directory:
 | 
			
		||||
cd ..
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
4) Start the dev server:
 | 
			
		||||
4) Start the development server:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
quasar dev -m ios
 | 
			
		||||
@ -1174,7 +1178,8 @@ quasar dev -m ios
 | 
			
		||||
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
If the app is blank, delete the app and close the simulator, then restart dev
 | 
			
		||||
If the app is blank or not refreshing, delete the app and close the simulator,
 | 
			
		||||
then restart the development process.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
@ -1228,7 +1233,7 @@ The app should now show two buttons at the bottom:
 | 
			
		||||
:::caution
 | 
			
		||||
 | 
			
		||||
If the app is blank or not refreshing, delete the app and close the simulator,
 | 
			
		||||
then restart the dev process.
 | 
			
		||||
then restart the development process.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
@ -1372,7 +1377,7 @@ id,content
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested on an Intel Mac on 2022 August 18 with Cordova backend.
 | 
			
		||||
This demo was tested on an Intel Mac on 2022 August 18 with Cordova.
 | 
			
		||||
The file integration uses `@ionic-native/file` version `5.36.0`.
 | 
			
		||||
 | 
			
		||||
The iOS simulator runs iOS 15.5 on an iPod Touch 7th Gen.
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ title: VueJS
 | 
			
		||||
 | 
			
		||||
[VueJS](https://vuejs.org/) is a JS library for building user interfaces.
 | 
			
		||||
 | 
			
		||||
This demo tries to cover common Vue data flow ideas and strategies. Single-File
 | 
			
		||||
This demo covers common VueJS data flow ideas and strategies.  Single-File
 | 
			
		||||
Components (SFC) and VueJS familiarity is assumed.
 | 
			
		||||
 | 
			
		||||
Other demos cover general VueJS deployments, including:
 | 
			
		||||
@ -163,8 +163,8 @@ generate column headings and for indexing into the row objects.
 | 
			
		||||
The safest approach is to use an array of arrays for state and to generate
 | 
			
		||||
column objects that map to A1-Style column headers.
 | 
			
		||||
 | 
			
		||||
The [Vue Table Lite demo](./grid#rows-and-columns-bindings) uses this approach
 | 
			
		||||
with the following column and row structure:
 | 
			
		||||
The [`vue3-table-lite` demo](./grid#rows-and-columns-bindings) generates rows
 | 
			
		||||
and columns objects with the following structure:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* rows are generated with a simple array of arrays */
 | 
			
		||||
 | 
			
		||||
@ -20,9 +20,9 @@ Other demos cover general Angular deployments, including:
 | 
			
		||||
 | 
			
		||||
:::warning
 | 
			
		||||
 | 
			
		||||
Angular dev tooling uses native NodeJS modules. There are a number of issues
 | 
			
		||||
when trying to run Angular projects with different NodeJS versions. These
 | 
			
		||||
issues should be directed to the Angular project.
 | 
			
		||||
Angular tooling uses native NodeJS modules. There are a number of issues when
 | 
			
		||||
trying to run Angular projects with different NodeJS versions. These issues
 | 
			
		||||
should be directed to the Angular project.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -93,7 +93,7 @@ var XLSX = require('xlsx');
 | 
			
		||||
exports.handler = function(event, context, callback) {
 | 
			
		||||
  /* make workbook */
 | 
			
		||||
  var wb = XLSX.read("S,h,e,e,t,J,S\n5,4,3,3,7,9,5", {type: "binary"});
 | 
			
		||||
  /* write to XLSX file in base64 encoding */
 | 
			
		||||
  /* write to XLSX file in Base64 encoding */
 | 
			
		||||
  // highlight-next-line
 | 
			
		||||
  var body = XLSX.write(wb, {type:"base64", bookType: "xlsx"});
 | 
			
		||||
  /* mark as attached file */
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,8 @@ hide_table_of_contents: true
 | 
			
		||||
 | 
			
		||||
# Demo Projects
 | 
			
		||||
 | 
			
		||||
The demo projects include small runnable examples and short explainers.
 | 
			
		||||
Demos include complete examples and short discussions.  For features that can
 | 
			
		||||
run in the web browser, demos will include interactive examples.
 | 
			
		||||
 | 
			
		||||
### JavaScript APIs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -326,7 +326,7 @@ The [`server` demo](../demos/server) has more advanced examples.
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="deno" label="Deno">
 | 
			
		||||
 | 
			
		||||
[Drash](https://drash.land/drash/) is a framework for Deno's HTTP server.  In a
 | 
			
		||||
[Drash](https://drash.land/drash/) is a HTTP server framework for Deno.  In a
 | 
			
		||||
`POST` request handler, the body parser can pull file data into a `Uint8Array`:
 | 
			
		||||
 | 
			
		||||
<pre><code parentName="pre" {...{"className": "language-ts"}}>{`\
 | 
			
		||||
 | 
			
		||||
@ -45,8 +45,8 @@ _Access the first Worksheet_
 | 
			
		||||
var first_ws = workbook.Sheets[workbook.SheetNames[0]];
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Combining the previous examples, `workbook.Sheets[workbook.SheetNames[n]]` is
 | 
			
		||||
the `n`-th worksheet if it exists in the workbook.
 | 
			
		||||
Combining the previous examples, `workbook.Sheets[workbook.SheetNames[0]]` is
 | 
			
		||||
the first worksheet if it exists in the workbook.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
_Replace a Worksheet in place_
 | 
			
		||||
 | 
			
		||||
@ -448,27 +448,10 @@ is to adjust the server process or Lambda function to accept Base64 strings.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
A complete example using XHR is [included in the XHR demo](../demos/network), along
 | 
			
		||||
with examples for fetch and wrapper libraries.  This example assumes the server
 | 
			
		||||
can handle Base64-encoded files (see the demo for a basic nodejs server):
 | 
			
		||||
A complete example using XHR is [included in the XHR demo](../demos/network),
 | 
			
		||||
along with examples for fetch and wrapper libraries.
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* in this example, send a base64 string to the server */
 | 
			
		||||
var wbout = XLSX.write(workbook, { bookType: "xlsx", type: "base64" });
 | 
			
		||||
 | 
			
		||||
/* prepare data for POST */
 | 
			
		||||
var formdata = new FormData();
 | 
			
		||||
formdata.append("file", "test.xlsx"); // <-- server expects `file` to hold name
 | 
			
		||||
formdata.append("data", wbout); // <-- `data` holds the base64-encoded data
 | 
			
		||||
 | 
			
		||||
/* perform POST request */
 | 
			
		||||
var req = new XMLHttpRequest();
 | 
			
		||||
req.open("POST", "/upload", true);
 | 
			
		||||
req.send(formdata);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For servers that do not parse POST request bodies as UTF-8 strings, a `Blob` can
 | 
			
		||||
be generated from the `array` output:
 | 
			
		||||
Under normal circumstances, a `Blob` can be generated from the `array` output:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* in this example, send a Blob to the server */
 | 
			
		||||
@ -481,6 +464,24 @@ formdata.append("file", blob, "test.xlsx");
 | 
			
		||||
 | 
			
		||||
/* perform POST request */
 | 
			
		||||
fetch("/upload", { method: 'POST', body: formdata });
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
When binary data is not supported, Base64 strings should be passed along.  This
 | 
			
		||||
will require the server to expect and decode the data:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* in this example, send a Base64 string to the server */
 | 
			
		||||
var wbout = XLSX.write(workbook, { bookType: "xlsx", type: "base64" });
 | 
			
		||||
 | 
			
		||||
/* prepare data for POST */
 | 
			
		||||
var formdata = new FormData();
 | 
			
		||||
formdata.append("file", "test.xlsx"); // <-- server expects `file` to hold name
 | 
			
		||||
formdata.append("data", wbout); // <-- `data` holds the data encoded in Base64
 | 
			
		||||
 | 
			
		||||
/* perform POST request */
 | 
			
		||||
var req = new XMLHttpRequest();
 | 
			
		||||
req.open("POST", "/upload", true);
 | 
			
		||||
req.send(formdata);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </TabItem>
 | 
			
		||||
@ -753,7 +754,7 @@ _Generate a CSV from a single worksheet_
 | 
			
		||||
var csv = XLSX.utils.sheet_to_csv(worksheet, opts);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This snapshot is designed to replicate the "CSV UTF8 (`.csv`)" output type.
 | 
			
		||||
This snapshot is designed to replicate the "CSV UTF-8 (`.csv`)" output type.
 | 
			
		||||
["Delimiter-Separated Output"](../api/utilities#delimiter-separated-output) describes the
 | 
			
		||||
function and the optional `opts` argument in more detail.
 | 
			
		||||
 | 
			
		||||
@ -763,7 +764,7 @@ _Generate "Text" from a single worksheet_
 | 
			
		||||
var txt = XLSX.utils.sheet_to_txt(worksheet, opts);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This snapshot is designed to replicate the "UTF16 Text (`.txt`)" output type.
 | 
			
		||||
This snapshot is designed to replicate the "UTF-16 Text (`.txt`)" output type.
 | 
			
		||||
["Delimiter-Separated Output"](../api/utilities#delimiter-separated-output) describes the
 | 
			
		||||
function and the optional `opts` argument in more detail.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@ A1-Style is the default address style in Lotus 1-2-3 and Excel.
 | 
			
		||||
Columns are specified with letters, counting from `A` to `Z`, then `AA` to `ZZ`,
 | 
			
		||||
then `AAA`.  Some sample values, along with SheetJS column indices, are listed:
 | 
			
		||||
 | 
			
		||||
| Ordinal | A1 Name | SheetJS |
 | 
			
		||||
| Ordinal | `A1`    | SheetJS |
 | 
			
		||||
|:--------|:--------|--------:|
 | 
			
		||||
| First   | `A`     |     `0` |
 | 
			
		||||
| Second  | `B`     |     `1` |
 | 
			
		||||
@ -78,7 +78,7 @@ fourth columns.
 | 
			
		||||
A row range is represented by the top-most row, followed by `:`, followed by the
 | 
			
		||||
bottom-most column.  For example, `2:4` represents the second/third/fourth rows.
 | 
			
		||||
 | 
			
		||||
### A1 Utilities
 | 
			
		||||
### Utilities
 | 
			
		||||
 | 
			
		||||
#### Column Names
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ Excel supports 4 different types of "sheets":
 | 
			
		||||
- "worksheets": normal sheets
 | 
			
		||||
- "chartsheets": full-tab charts
 | 
			
		||||
- "macrosheets": legacy (pre-VBA) macros
 | 
			
		||||
- "dialogsheets": legacy (pre-VBA) dialogs
 | 
			
		||||
- "dialogsheets": legacy (pre-VBA) dialog windows
 | 
			
		||||
 | 
			
		||||
## Generic Sheet Object
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@ while the writer will translate from A1-Style strings to the file format.
 | 
			
		||||
| XLSB              |   ✔   |       |   ✔   |    ✔    | BIFF parsed tokens     |
 | 
			
		||||
| XLS               |   ✔   |       |   ✔   |         | BIFF parsed tokens     |
 | 
			
		||||
| XLML              |   ✔   |   ✔   |   ✔   |         | RC-style strings       |
 | 
			
		||||
| SYLK              |   ✔   |   ✔   |       |         | A1 / RC-style strings  |
 | 
			
		||||
| SYLK              |   ✔   |   ✔   |       |         | `A1`/RC-style strings  |
 | 
			
		||||
| CSV / TXT         |   ✔   |   ✔   |       |         | A1-Style strings       |
 | 
			
		||||
| ODS / FODS / UOS  |   ✔   |   ✔   |       |         | OpenFormula strings    |
 | 
			
		||||
| WK\*              |   ✔   |       |       |         | Lotus parsed tokens    |
 | 
			
		||||
@ -51,7 +51,7 @@ const workbook = XLSX.read(ab, { cellFormula: true });
 | 
			
		||||
  <TabItem value="nodejs" label="NodeJS">
 | 
			
		||||
 | 
			
		||||
Typically file data will be available as a `Buffer` from a network request / API
 | 
			
		||||
or stored in the filesystem.  `cellFormula: true` should be added to the second
 | 
			
		||||
or stored in the file system.  `cellFormula: true` should be added to the second
 | 
			
		||||
options argument to `read` or `readFile`:
 | 
			
		||||
 | 
			
		||||
**`XLSX.read`**
 | 
			
		||||
@ -75,8 +75,8 @@ const workbook = XLSX.readFile("test.xlsx", { cellFormula: true });
 | 
			
		||||
  <TabItem value="bun" label="Bun">
 | 
			
		||||
 | 
			
		||||
Typically file data will be available as a `Uint8Array` from a network request
 | 
			
		||||
or stored in the filesystem.  `cellFormula: true` should be added to the second
 | 
			
		||||
options argument to `read` or `readFile`:
 | 
			
		||||
or stored in the file system. `cellFormula: true` should be set in the options
 | 
			
		||||
argument to `read` or `readFile`:
 | 
			
		||||
 | 
			
		||||
**`XLSX.read`**
 | 
			
		||||
 | 
			
		||||
@ -98,9 +98,9 @@ const workbook = XLSX.readFile("test.xlsx", { cellFormula: true });
 | 
			
		||||
  </TabItem>
 | 
			
		||||
  <TabItem value="deno" label="Deno">
 | 
			
		||||
 | 
			
		||||
Typically file data will be available as a `Uint8Array` / `ArrayBuffer` from an
 | 
			
		||||
API or stored in the filesystem.  `cellFormula: true` should be added to the
 | 
			
		||||
second options argument to `read` or `readFile`:
 | 
			
		||||
Typically file data will be available as a `Uint8Array` or `ArrayBuffer` from
 | 
			
		||||
API or stored in the file system.  `cellFormula: true` should be set in the
 | 
			
		||||
options argument to `read` or `readFile`:
 | 
			
		||||
 | 
			
		||||
**`XLSX.read`**
 | 
			
		||||
 | 
			
		||||
@ -128,11 +128,11 @@ The A1-Style formula string is stored in the `f` field of the cell object.
 | 
			
		||||
Spreadsheet software typically represent formulae with a leading `=` sign, but
 | 
			
		||||
SheetJS formulae omit the `=`.
 | 
			
		||||
 | 
			
		||||
["A1-Style"](../general#a1-style) describes A1 style in more detail.
 | 
			
		||||
["A1-Style"](../general#a1-style) describes A1-Style in more detail.
 | 
			
		||||
 | 
			
		||||
For example, consider [this test file](pathname:///files/concat.xlsx):
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
```jsx live
 | 
			
		||||
/* The live editor requires this function wrapper */
 | 
			
		||||
 | 
			
		||||
@ -59,8 +59,8 @@ The following table covers some common formats:
 | 
			
		||||
| `mm`     | Long (2-digit) minutes       |
 | 
			
		||||
| `s`      | Short (1-digit) seconds      |
 | 
			
		||||
| `ss`     | Long (2-digit) seconds       |
 | 
			
		||||
| `A/P`    | Meridien ("A" or "P")        |
 | 
			
		||||
| `AM/PM`  | Meridien ("AM" or "PM")      |
 | 
			
		||||
| `A/P`    | Meridiem ("A" or "P")        |
 | 
			
		||||
| `AM/PM`  | Meridiem ("AM" or "PM")      |
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
@ -144,8 +144,8 @@ Excel and other spreadsheet software, but this represents .
 | 
			
		||||
XLS, XLSB, and most binary formats store the raw date codes.  Special number
 | 
			
		||||
formats are used to indicate that the values are intended to be dates/times.
 | 
			
		||||
 | 
			
		||||
CSV and other plaintext formats typically store actual formatted date values.
 | 
			
		||||
They are interpreted as dates and times in the user timezone.
 | 
			
		||||
CSV and other text formats typically store actual formatted date values.  They
 | 
			
		||||
are interpreted as dates and times in the user timezone.
 | 
			
		||||
 | 
			
		||||
XLSX actually supports both!  Typically dates are stored as `n` numeric cells,
 | 
			
		||||
but the format supports a special type `d` where the data is an ISO 8601 date
 | 
			
		||||
@ -175,7 +175,7 @@ with an appropriate number format.
 | 
			
		||||
The actual values stored in cells are intended to be correct from the
 | 
			
		||||
perspective of an Excel user in the current timezone.
 | 
			
		||||
 | 
			
		||||
The value formatter understands date formats and converts when relevant.
 | 
			
		||||
The value formatting logic understands date formats and converts when relevant.
 | 
			
		||||
 | 
			
		||||
### Utility Functions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
 | 
			
		||||
Even for basic features like date storage, the official Excel formats store the
 | 
			
		||||
same content in different ways.  The parsers are expected to convert from the
 | 
			
		||||
underlying file format representation to the Common Spreadsheet Format.  Writers
 | 
			
		||||
are expected to convert from CSF back to the underlying file format.
 | 
			
		||||
are expected to serialize SheetJS workbooks in the underlying file format.
 | 
			
		||||
 | 
			
		||||
The following topics are covered in sub-pages:
 | 
			
		||||
 | 
			
		||||
@ -124,11 +124,11 @@ follow the priority order:
 | 
			
		||||
 | 
			
		||||
_Column Widths_
 | 
			
		||||
 | 
			
		||||
Given the constraints, it is possible to determine the MDW without actually
 | 
			
		||||
Given the constraints, it is possible to determine the `MDW` without actually
 | 
			
		||||
inspecting the font!  The parsers guess the pixel width by converting from width
 | 
			
		||||
to pixels and back, repeating for all possible MDW and selecting the MDW that
 | 
			
		||||
minimizes the error.  XLML actually stores the pixel width, so the guess works
 | 
			
		||||
in the opposite direction.
 | 
			
		||||
to pixels and back, repeating for all possible `MDW` and selecting the value
 | 
			
		||||
that minimizes the error.  XLML actually stores the pixel width, so the guess
 | 
			
		||||
works in the opposite direction.
 | 
			
		||||
 | 
			
		||||
Even though all of the information is made available, writers are expected to
 | 
			
		||||
follow the priority order:
 | 
			
		||||
@ -144,7 +144,7 @@ follow the priority order:
 | 
			
		||||
The `cell.w` formatted text for each cell is produced from `cell.v` and `cell.z`
 | 
			
		||||
format.  If the format is not specified, the Excel `General` format is used.
 | 
			
		||||
The format can either be specified as a string or as an index into the format
 | 
			
		||||
table.  Parsers are expected to populate `workbook.SSF` with the number format
 | 
			
		||||
table.  Readers are expected to populate `workbook.SSF` with the number format
 | 
			
		||||
table.  Writers are expected to serialize the table.
 | 
			
		||||
 | 
			
		||||
The following example creates a custom format from scratch:
 | 
			
		||||
@ -299,7 +299,7 @@ The visibility setting is stored in the `Hidden` property of sheet props array.
 | 
			
		||||
If the respective Sheet entry does not exist or if the `Hidden` property is not
 | 
			
		||||
set, the worksheet is visible.
 | 
			
		||||
 | 
			
		||||
**List all worksheets and their visibilities**
 | 
			
		||||
**List all worksheets and their visibility settings**
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
wb.Workbook.Sheets.map(function(x) { return [x.name, x.Hidden] })
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ title: Common Spreadsheet Format
 | 
			
		||||
import DocCardList from '@theme/DocCardList';
 | 
			
		||||
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
 | 
			
		||||
 | 
			
		||||
The "Common Spreadsheet Format" (CSF) is the object model used by SheetJS. This
 | 
			
		||||
The "Common Spreadsheet Format" is the object model used by SheetJS. This
 | 
			
		||||
section covers the JS representation of workbooks, worksheets, cells, ranges,
 | 
			
		||||
addresses and other features.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,7 @@ The read functions accept an options argument:
 | 
			
		||||
- `bookVBA` merely exposes the raw VBA CFB object.  It does not parse the data.
 | 
			
		||||
  XLSM and XLSB store the VBA CFB object in `xl/vbaProject.bin`. BIFF8 XLS mixes
 | 
			
		||||
  the VBA entries alongside the core Workbook entry, so the library generates a
 | 
			
		||||
  new XLSB-compatible blob from the XLS CFB container.
 | 
			
		||||
  new blob from the XLS CFB container that works in XLSM and XLSB files.
 | 
			
		||||
- `codepage` is applied to BIFF2 - BIFF5 files without `CodePage` records and to
 | 
			
		||||
  CSV files without BOM in `type:"binary"`.  BIFF8 XLS always defaults to 1200.
 | 
			
		||||
- `PRN` affects parsing of text files without a common delimiter character.
 | 
			
		||||
@ -78,7 +78,7 @@ tells the library how to parse the data argument:
 | 
			
		||||
|------------|-----------------------------------------------------------------|
 | 
			
		||||
| `"base64"` | string: Base64 encoding of the file                             |
 | 
			
		||||
| `"binary"` | string: binary string (byte `n` is `data.charCodeAt(n)`)        |
 | 
			
		||||
| `"string"` | string: JS string (characters interpreted as UTF8)              |
 | 
			
		||||
| `"string"` | string: JS string (only appropriate for UTF-8 text formats)     |
 | 
			
		||||
| `"buffer"` | nodejs Buffer                                                   |
 | 
			
		||||
| `"array"`  | array: array of 8-bit unsigned int (byte `n` is `data[n]`)      |
 | 
			
		||||
| `"file"`   | string: path of file that will be read (nodejs only)            |
 | 
			
		||||
@ -101,8 +101,8 @@ file but Excel will know how to handle it.  This library applies similar logic:
 | 
			
		||||
| `0x50` | ZIP Archive   | XLSB or XLSX/M or ODS or UOS2 or NUMBERS or text    |
 | 
			
		||||
| `0x49` | Plain Text    | SYLK or plain text                                  |
 | 
			
		||||
| `0x54` | Plain Text    | DIF or plain text                                   |
 | 
			
		||||
| `0xEF` | UTF8 Encoded  | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
 | 
			
		||||
| `0xFF` | UTF16 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
 | 
			
		||||
| `0xEF` | UTF-8 Text    | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
 | 
			
		||||
| `0xFF` | UTF-16 Text   | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
 | 
			
		||||
| `0x00` | Record Stream | Lotus WK\* or Quattro Pro or plain text             |
 | 
			
		||||
| `0x7B` | Plain text    | RTF or plain text                                   |
 | 
			
		||||
| `0x0A` | Plain text    | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
 | 
			
		||||
@ -112,7 +112,7 @@ file but Excel will know how to handle it.  This library applies similar logic:
 | 
			
		||||
DBF files are detected based on the first byte as well as the third and fourth
 | 
			
		||||
bytes (corresponding to month and day of the file date)
 | 
			
		||||
 | 
			
		||||
Works for Windows files are detected based on the BOF record with type `0xFF`
 | 
			
		||||
Works for Windows files are detected based on the `BOF` record with type `0xFF`
 | 
			
		||||
 | 
			
		||||
Plain text format guessing follows the priority order:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -201,7 +201,7 @@ The `type` argument for `write` mirrors the `type` argument for `read`:
 | 
			
		||||
|------------|-----------------------------------------------------------------|
 | 
			
		||||
| `"base64"` | string: Base64 encoding of the file                             |
 | 
			
		||||
| `"binary"` | string: binary string (byte `n` is `data.charCodeAt(n)`)        |
 | 
			
		||||
| `"string"` | string: JS string (characters interpreted as UTF8)              |
 | 
			
		||||
| `"string"` | string: JS string (not compatible with binary formats)          |
 | 
			
		||||
| `"buffer"` | nodejs Buffer                                                   |
 | 
			
		||||
| `"array"`  | ArrayBuffer, fallback array of 8-bit unsigned int               |
 | 
			
		||||
| `"file"`   | string: path of file that will be created (nodejs only)         |
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ accepts an options argument:
 | 
			
		||||
| (string)         | Use specified cell (A1-Style cell)                        |
 | 
			
		||||
| (number >= 0)    | Start from the first column at specified row (0-indexed)  |
 | 
			
		||||
| -1               | Append to bottom of worksheet starting on first column    |
 | 
			
		||||
| (default)        | Start from cell A1                                        |
 | 
			
		||||
| (default)        | Start from cell `A1`                                      |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The example worksheet can be built up in the order `A1:G1, A2:B4, E2:G4, A5:G5`:
 | 
			
		||||
@ -206,7 +206,7 @@ an options argument:
 | 
			
		||||
| (string)         | Use specified cell (A1-Style cell)                        |
 | 
			
		||||
| (number >= 0)    | Start from the first column at specified row (0-indexed)  |
 | 
			
		||||
| -1               | Append to bottom of worksheet starting on first column    |
 | 
			
		||||
| (default)        | Start from cell A1                                        |
 | 
			
		||||
| (default)        | Start from cell `A1`                                      |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
This example worksheet can be built up in the order `A1:G1, A2:B4, E2:G4, A5:G5`:
 | 
			
		||||
@ -269,7 +269,7 @@ function SheetJSHeaderOrder() {
 | 
			
		||||
 | 
			
		||||
### HTML Table Input
 | 
			
		||||
 | 
			
		||||
**Create a worksheet or workbook from a HTML DOM TABLE**
 | 
			
		||||
**Create a worksheet or workbook from a TABLE element**
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var ws = XLSX.utils.table_to_sheet(elt, opts);
 | 
			
		||||
@ -329,7 +329,7 @@ var ws = wb.Sheets[wb.SheetNames[0]];
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
**Add data from a HTML DOM TABLE to an existing worksheet**
 | 
			
		||||
**Add data from a TABLE element to an existing worksheet**
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
XLSX.utils.sheet_add_dom(ws, elt, opts);
 | 
			
		||||
@ -355,7 +355,7 @@ an options argument:
 | 
			
		||||
| (string)         | Use specified cell (A1-Style cell)                        |
 | 
			
		||||
| (number >= 0)    | Start from the first column at specified row (0-indexed)  |
 | 
			
		||||
| -1               | Append to bottom of worksheet starting on first column    |
 | 
			
		||||
| (default)        | Start from cell A1                                        |
 | 
			
		||||
| (default)        | Start from cell `A1`                                      |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
A common use case for `sheet_add_dom` involves adding multiple tables to a
 | 
			
		||||
@ -480,7 +480,7 @@ var txt = XLSX.utils.sheet_to_txt(ws, opts);
 | 
			
		||||
 | 
			
		||||
The `txt` output type uses the tab character as the field separator.  If the
 | 
			
		||||
`codepage` library is available (included in full distribution but not core),
 | 
			
		||||
the output will be encoded in `CP1200` and the BOM will be prepended.
 | 
			
		||||
the output will be encoded in `CP1200` and the UTF-16 BOM will be added.
 | 
			
		||||
 | 
			
		||||
`XLSX.utils.sheet_to_txt` takes the same arguments as `sheet_to_csv`.
 | 
			
		||||
 | 
			
		||||
@ -566,7 +566,7 @@ takes an options argument:
 | 
			
		||||
 | 
			
		||||
| `header`         | Description                                               |
 | 
			
		||||
| :--------------- | :-------------------------------------------------------- |
 | 
			
		||||
| `1`              | Generate an array of arrays ("2D Array")                  |
 | 
			
		||||
| `1`              | Generate an array of arrays                               |
 | 
			
		||||
| `"A"`            | Row object keys are literal column labels                 |
 | 
			
		||||
| array of strings | Use specified strings as keys in row objects              |
 | 
			
		||||
| (default)        | Read and disambiguate first row as keys                   |
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@ Write options are described in the [Writing Options](./write-options) section.
 | 
			
		||||
 | 
			
		||||
Utilities are available in the `XLSX.utils` object.
 | 
			
		||||
 | 
			
		||||
The following are described in [A1 Utilities](../csf/general#a1-utilities)
 | 
			
		||||
The following are described in [`A1` Utilities](../csf/general#utilities)
 | 
			
		||||
 | 
			
		||||
**Cell and cell address manipulation:**
 | 
			
		||||
 | 
			
		||||
@ -71,9 +71,9 @@ The following are described in the [Utility Functions](./utilities):
 | 
			
		||||
 | 
			
		||||
- `sheet_to_json` converts a worksheet object to an array of JSON objects.
 | 
			
		||||
- `sheet_to_csv` generates delimiter-separated-values output.
 | 
			
		||||
- `sheet_to_txt` generates UTF16 formatted text.
 | 
			
		||||
- `sheet_to_txt` generates UTF-16 formatted text.
 | 
			
		||||
- `sheet_to_html` generates HTML output.
 | 
			
		||||
- `sheet_to_formulae` generates a list of the formulae (with value fallbacks).
 | 
			
		||||
- `sheet_to_formulae` generates a list of formulae or cell value assignments.
 | 
			
		||||
 | 
			
		||||
**Miscellaneous**
 | 
			
		||||
 | 
			
		||||
@ -96,7 +96,7 @@ Due to broad inconsistencies in ESM implementations, the `mjs` build does not
 | 
			
		||||
import any dependencies.  Instead, they must be manually passed to the library:
 | 
			
		||||
 | 
			
		||||
`XLSX.set_cptable` sets the internal `codepage` instance.  This provides support
 | 
			
		||||
for different language encodings.
 | 
			
		||||
for different languages in XLS or text parsing.
 | 
			
		||||
 | 
			
		||||
`XLSX.set_fs` set `fs` instance (using `readFileSync` and `writeFileSync`). This
 | 
			
		||||
provides NodeJS ESM support for `XLSX.readFile` and `XLSX.writeFile`.
 | 
			
		||||
 | 
			
		||||
@ -69,8 +69,8 @@ XLSX and XLSM files are ZIP containers containing a series of XML files in
 | 
			
		||||
accordance with the Open Packaging Conventions (OPC).  The XLSM format, almost
 | 
			
		||||
identical to XLSX, is used for files containing macros.
 | 
			
		||||
 | 
			
		||||
The format is standardized in ECMA-376 and later in ISO/IEC 29500.  Excel does
 | 
			
		||||
not follow the specification, and there are additional documents discussing how
 | 
			
		||||
The format is standardized in `ECMA-376` and `ISO/IEC 29500`.  Excel does not
 | 
			
		||||
follow the specification, and there are additional documents discussing how
 | 
			
		||||
Excel deviates from the specification.
 | 
			
		||||
 | 
			
		||||
### Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)
 | 
			
		||||
@ -160,8 +160,8 @@ All versions of Works were limited to a single worksheet.
 | 
			
		||||
Works for DOS 1.x - 3.x and Works for Windows 2.x extends the Lotus WKS format
 | 
			
		||||
with additional record types.
 | 
			
		||||
 | 
			
		||||
Works for Windows 3.x - 5.x uses the same format and WKS extension.  The BOF
 | 
			
		||||
record has type `FF`
 | 
			
		||||
Works for Windows 3.x - 5.x uses the same format and WKS extension.  The `BOF`
 | 
			
		||||
record has type `0xFF`
 | 
			
		||||
 | 
			
		||||
Works for Windows 6.x - 9.x use the XLR format.  XLR is nearly identical to
 | 
			
		||||
BIFF8 XLS: it uses the CFB container with a Workbook stream.  Works 9 saves the
 | 
			
		||||
@ -185,8 +185,8 @@ The writer currently exports a small range from the first worksheet.
 | 
			
		||||
#### OpenDocument Spreadsheet (ODS/FODS)
 | 
			
		||||
 | 
			
		||||
ODS is an XML-in-ZIP format akin to XLSX while FODS is an XML format akin to
 | 
			
		||||
SpreadsheetML.  Both are detailed in the OASIS standard, but tools like LO/OO
 | 
			
		||||
add undocumented extensions.  The parsers and writers do not implement the full
 | 
			
		||||
SpreadsheetML.  Both are detailed in the OASIS standard, but LibreOffice adds
 | 
			
		||||
undocumented extensions.  The parsers and writers do not implement the full
 | 
			
		||||
standard, instead focusing on parts necessary to extract and store raw data.
 | 
			
		||||
 | 
			
		||||
#### Uniform Office Spreadsheet (UOS1/2)
 | 
			
		||||
 | 
			
		||||
@ -65,7 +65,7 @@ sudo npm i -g n
 | 
			
		||||
sudo n 16
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
3) follow <https://github.com/paul-nelson-baker/git-openssl-shellscript> to
 | 
			
		||||
3) Follow <https://github.com/paul-nelson-baker/git-openssl-shellscript> to
 | 
			
		||||
build and install a version of Git with proper SSL support:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
 | 
			
		||||
@ -10,8 +10,19 @@ Some of our original research is documented at <https://oss.sheetjs.com/notes/>
 | 
			
		||||
The specifications list is non-exhaustive.
 | 
			
		||||
 | 
			
		||||
 - Worksheet File Format (From Lotus) December 1984
 | 
			
		||||
 - Open Document Format for Office Applications Version 1.2 (29 September 2011)
 | 
			
		||||
 - ISO/IEC 29500:2012(E) "Information technology — Document description and processing languages — Office Open XML File Formats"
 | 
			
		||||
 - Open Document Format for Office Applications Version 1.3
 | 
			
		||||
 | 
			
		||||
:::info
 | 
			
		||||
 | 
			
		||||
The primary specifications for XLSX are:
 | 
			
		||||
 | 
			
		||||
 - `ISO/IEC 29500` "Information technology — Document description and processing languages — Office Open XML File Formats"
 | 
			
		||||
 - `ECMA-376` "Office Open XML file formats"
 | 
			
		||||
 | 
			
		||||
As some editions of `ECMA-376` are identical to `ISO` specification editions,
 | 
			
		||||
most of the public XLSX document community use the spec names interchangeably.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
## Open Specifications Promise
 | 
			
		||||
 | 
			
		||||
@ -29,7 +40,7 @@ to sue.  The documentation that falls under the promise are listed below.
 | 
			
		||||
 - `MS-ODRAWXML`: Office Drawing Extensions to Office Open XML Structure
 | 
			
		||||
 - `MS-OE376`: Office Implementation Information for ECMA-376 Standards Support
 | 
			
		||||
 - `MS-OFFCRYPTO`: Office Document Cryptography Structure
 | 
			
		||||
 - `MS-OI29500`: Office Implementation Information for ISO/IEC 29500 Standards Support
 | 
			
		||||
 - `MS-OI29500`: Office Implementation Information for `ISO/IEC 29500` Standards Support
 | 
			
		||||
 - `MS-OLEDS`: Object Linking and Embedding (OLE) Data Structures
 | 
			
		||||
 - `MS-OLEPS`: Object Linking and Embedding (OLE) Property Set Data Structures
 | 
			
		||||
 - `MS-OODF3`: Office Implementation Information for ODF 1.2 Standards Support
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ exports.handler = function(event, context, callback) {
 | 
			
		||||
  if(event.requestContext.http.method == "GET") {
 | 
			
		||||
    /* make workbook */
 | 
			
		||||
    var wb = XLSX.read("S,h,e,e,t,J,S\n5,4,3,3,7,9,5", {type: "binary"});
 | 
			
		||||
    /* write to XLSX file in base64 encoding */
 | 
			
		||||
    /* write to XLSX file in Base64 encoding */
 | 
			
		||||
    var body = XLSX.write(wb, {type:"base64", bookType: "xlsx"});
 | 
			
		||||
    /* mark as attached file */
 | 
			
		||||
    var headers = { "Content-Disposition": 'attachment; filename="SheetJSLambda.xlsx"'};
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user