| 
									
										
										
										
											2017-04-21 22:02:02 +00:00
										 |  |  | # [SheetJS js-xlsx](http://sheetjs.com)
 | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | Parser and writer for various spreadsheet formats.  Pure-JS cleanroom | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | implementation from official specifications, related documents, and test files. | 
					
						
							|  |  |  | Emphasis on parsing and writing robustness, cross-format feature compatibility | 
					
						
							|  |  |  | with a unified JS representation, and ES3/ES5 browser compatibility back to IE6. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 03:24:48 +00:00
										 |  |  | This is the community version.  We also offer a pro version with performance | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | enhancements, additional features by request, and dedicated support. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 03:24:48 +00:00
										 |  |  | [**Pro Version**](http://sheetjs.com/pro) | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 03:24:48 +00:00
										 |  |  | [**Commercial Support**](http://sheetjs.com/support) | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 20:07:51 +00:00
										 |  |  | [**Rendered Documentation**](http://docs.sheetjs.com/) | 
					
						
							| 
									
										
										
										
											2017-04-26 02:27:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 03:24:48 +00:00
										 |  |  | [**In-Browser Demos**](http://sheetjs.com/demos) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [**Source Code**](http://git.io/xlsx) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | [**Issues and Bug Reports**](https://github.com/sheetjs/js-xlsx/issues) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | [**Other General Support Issues**](https://discourse.sheetjs.com) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [**File format support for known spreadsheet data formats:**](#file-formats) | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Graph of supported formats</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |  | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  |  | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | [**Browser Test**](http://oss.sheetjs.com/js-xlsx/tests/) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [](https://saucelabs.com/u/sheetjs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [](https://travis-ci.org/SheetJS/js-xlsx) | 
					
						
							|  |  |  | [](https://semaphoreci.com/sheetjs/js-xlsx) | 
					
						
							|  |  |  | [](https://coveralls.io/r/SheetJS/js-xlsx?branch=master) | 
					
						
							|  |  |  | [](https://david-dm.org/sheetjs/js-xlsx) | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | [](https://npmjs.org/package/xlsx) | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | [](https://ghit.me/repo/sheetjs/js-xlsx) | 
					
						
							|  |  |  | [](https://github.com/SheetJS/js-xlsx) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | ## Table of Contents
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Expand to show Table of Contents</b></summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | <!-- toc --> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - [Installation](#installation) | 
					
						
							|  |  |  |   * [JS Ecosystem Demos](#js-ecosystem-demos) | 
					
						
							|  |  |  |   * [Optional Modules](#optional-modules) | 
					
						
							|  |  |  |   * [ECMAScript 5 Compatibility](#ecmascript-5-compatibility) | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | - [Philosophy](#philosophy) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - [Parsing Workbooks](#parsing-workbooks) | 
					
						
							| 
									
										
										
										
											2017-07-05 22:27:54 +00:00
										 |  |  |   * [Parsing Examples](#parsing-examples) | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  |   * [Streaming Read](#streaming-read) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - [Working with the Workbook](#working-with-the-workbook) | 
					
						
							| 
									
										
										
										
											2017-07-05 22:27:54 +00:00
										 |  |  |   * [Parsing and Writing Examples](#parsing-and-writing-examples) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - [Writing Workbooks](#writing-workbooks) | 
					
						
							| 
									
										
										
										
											2017-07-05 22:27:54 +00:00
										 |  |  |   * [Writing Examples](#writing-examples) | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  |   * [Streaming Write](#streaming-write) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - [Interface](#interface) | 
					
						
							|  |  |  |   * [Parsing functions](#parsing-functions) | 
					
						
							|  |  |  |   * [Writing functions](#writing-functions) | 
					
						
							|  |  |  |   * [Utilities](#utilities) | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | - [Common Spreadsheet Format](#common-spreadsheet-format) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  |   * [General Structures](#general-structures) | 
					
						
							|  |  |  |   * [Cell Object](#cell-object) | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  |     + [Data Types](#data-types) | 
					
						
							| 
									
										
										
										
											2017-03-21 20:44:35 +00:00
										 |  |  |     + [Dates](#dates) | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  |   * [Sheet Objects](#sheet-objects) | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  |     + [Worksheet Object](#worksheet-object) | 
					
						
							|  |  |  |     + [Chartsheet Object](#chartsheet-object) | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  |     + [Macrosheet Object](#macrosheet-object) | 
					
						
							|  |  |  |     + [Dialogsheet Object](#dialogsheet-object) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  |   * [Workbook Object](#workbook-object) | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  |     + [Workbook File Properties](#workbook-file-properties) | 
					
						
							| 
									
										
										
										
											2017-04-11 22:15:36 +00:00
										 |  |  |   * [Workbook-Level Attributes](#workbook-level-attributes) | 
					
						
							|  |  |  |     + [Defined Names](#defined-names) | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  |     + [Miscellaneous Workbook Properties](#miscellaneous-workbook-properties) | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  |   * [Document Features](#document-features) | 
					
						
							|  |  |  |     + [Formulae](#formulae) | 
					
						
							|  |  |  |     + [Column Properties](#column-properties) | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  |     + [Row Properties](#row-properties) | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  |     + [Number Formats](#number-formats) | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  |     + [Hyperlinks](#hyperlinks) | 
					
						
							| 
									
										
										
										
											2017-04-02 06:47:25 +00:00
										 |  |  |     + [Cell Comments](#cell-comments) | 
					
						
							| 
									
										
										
										
											2017-03-31 18:46:42 +00:00
										 |  |  |     + [Sheet Visibility](#sheet-visibility) | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  |     + [VBA and Macros](#vba-and-macros) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - [Parsing Options](#parsing-options) | 
					
						
							|  |  |  |   * [Input Type](#input-type) | 
					
						
							|  |  |  |   * [Guessing File Type](#guessing-file-type) | 
					
						
							|  |  |  | - [Writing Options](#writing-options) | 
					
						
							|  |  |  |   * [Supported Output Formats](#supported-output-formats) | 
					
						
							|  |  |  |   * [Output Type](#output-type) | 
					
						
							|  |  |  | - [Utility Functions](#utility-functions) | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  |   * [Array of Arrays Input](#array-of-arrays-input) | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  |   * [Array of Objects Input](#array-of-objects-input) | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  |   * [HTML Table Input](#html-table-input) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  |   * [Formulae Output](#formulae-output) | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  |   * [Delimiter-Separated Output](#delimiter-separated-output) | 
					
						
							|  |  |  |     + [UTF-16 Unicode Text](#utf-16-unicode-text) | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  |   * [HTML Output](#html-output) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  |   * [JSON](#json) | 
					
						
							|  |  |  | - [File Formats](#file-formats) | 
					
						
							|  |  |  |   * [Excel 2007+ XML (XLSX/XLSM)](#excel-2007-xml-xlsxxlsm) | 
					
						
							|  |  |  |   * [Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)](#excel-20-95-biff2biff3biff4biff5) | 
					
						
							|  |  |  |   * [Excel 97-2004 Binary (BIFF8)](#excel-97-2004-binary-biff8) | 
					
						
							|  |  |  |   * [Excel 2003-2004 (SpreadsheetML)](#excel-2003-2004-spreadsheetml) | 
					
						
							|  |  |  |   * [Excel 2007+ Binary (XLSB, BIFF12)](#excel-2007-binary-xlsb-biff12) | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  |   * [Delimiter-Separated Values (CSV/TXT)](#delimiter-separated-values-csvtxt) | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  |   * [Other Workbook Formats](#other-workbook-formats) | 
					
						
							|  |  |  |     + [Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)](#lotus-1-2-3-wkswk1wk2wk3wk4123) | 
					
						
							|  |  |  |     + [Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)](#quattro-pro-wq1wq2wb1wb2wb3qpw) | 
					
						
							|  |  |  |     + [OpenDocument Spreadsheet (ODS/FODS)](#opendocument-spreadsheet-odsfods) | 
					
						
							|  |  |  |     + [Uniform Office Spreadsheet (UOS1/2)](#uniform-office-spreadsheet-uos12) | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  |   * [Other Single-Worksheet Formats](#other-single-worksheet-formats) | 
					
						
							|  |  |  |     + [dBASE and Visual FoxPro (DBF)](#dbase-and-visual-foxpro-dbf) | 
					
						
							|  |  |  |     + [Symbolic Link (SYLK)](#symbolic-link-sylk) | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  |     + [Lotus Formatted Text (PRN)](#lotus-formatted-text-prn) | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  |     + [Data Interchange Format (DIF)](#data-interchange-format-dif) | 
					
						
							|  |  |  |     + [HTML](#html) | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  |     + [Rich Text Format (RTF)](#rich-text-format-rtf) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - [Testing](#testing) | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  |   * [Node](#node) | 
					
						
							|  |  |  |   * [Browser](#browser) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  |   * [Tested Environments](#tested-environments) | 
					
						
							|  |  |  |   * [Test Files](#test-files) | 
					
						
							|  |  |  | - [Contributing](#contributing) | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  |   * [OSX/Linux](#osxlinux) | 
					
						
							|  |  |  |   * [Windows](#windows) | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  |   * [Tests](#tests) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - [License](#license) | 
					
						
							|  |  |  | - [References](#references) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <!-- tocstop --> | 
					
						
							| 
									
										
										
										
											2017-02-10 19:23:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | ## Installation
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | In the browser, just add a script tag: | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | ```html | 
					
						
							|  |  |  | <script lang="javascript" src="dist/xlsx.full.min.js"></script> | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | <details> | 
					
						
							|  |  |  |   <summary><b>CDN Availability</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | |    CDN     | URL                                      | | 
					
						
							|  |  |  | |-----------:|:-----------------------------------------| | 
					
						
							|  |  |  | |    `unpkg` | <https://unpkg.com/xlsx/>                | | 
					
						
							|  |  |  | | `jsDelivr` | <https://jsdelivr.com/package/npm/xlsx>  | | 
					
						
							|  |  |  | |    `CDNjs` | <http://cdnjs.com/libraries/xlsx>        | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `unpkg` makes the latest version available at: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```html | 
					
						
							|  |  |  | <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | With [npm](https://www.npmjs.org/package/xlsx): | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | ```bash | 
					
						
							|  |  |  | $ npm install xlsx | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | With [bower](http://bower.io/search/?q=js-xlsx): | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```bash | 
					
						
							|  |  |  | $ bower install js-xlsx | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | ### JS Ecosystem Demos
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | The [`demos` directory](demos/) includes sample projects for: | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 20:02:06 +00:00
										 |  |  | **Frameworks and APIs** | 
					
						
							| 
									
										
										
										
											2017-06-21 23:10:36 +00:00
										 |  |  | - [`angular 1.x`](demos/angular/) | 
					
						
							|  |  |  | - [`angular 2.x / 4.x`](demos/angular2/) | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | - [`meteor`](demos/meteor/) | 
					
						
							| 
									
										
										
										
											2017-09-12 20:02:06 +00:00
										 |  |  | - [`react and react-native`](demos/react/) | 
					
						
							|  |  |  | - [`vue 2.x and weex`](demos/vue/) | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | - [`XMLHttpRequest and fetch`](demos/xhr/) | 
					
						
							| 
									
										
										
										
											2017-09-12 20:02:06 +00:00
										 |  |  | - [`nodejs server`](demos/server/) | 
					
						
							| 
									
										
										
										
											2017-08-10 23:46:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 20:02:06 +00:00
										 |  |  | **Bundlers and Tooling** | 
					
						
							| 
									
										
										
										
											2017-08-10 23:46:34 +00:00
										 |  |  | - [`browserify`](demos/browserify/) | 
					
						
							| 
									
										
										
										
											2017-03-23 17:11:31 +00:00
										 |  |  | - [`requirejs`](demos/requirejs/) | 
					
						
							| 
									
										
										
										
											2017-06-08 06:19:11 +00:00
										 |  |  | - [`rollup`](demos/rollup/) | 
					
						
							| 
									
										
										
										
											2017-03-23 17:11:31 +00:00
										 |  |  | - [`systemjs`](demos/systemjs/) | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | - [`webpack 2.x`](demos/webpack/) | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 20:02:06 +00:00
										 |  |  | **Platforms and Integrations** | 
					
						
							|  |  |  | - [`electron application`](demos/electron/) | 
					
						
							|  |  |  | - [`nw.js application`](demos/nwjs/) | 
					
						
							| 
									
										
										
										
											2017-08-10 23:46:34 +00:00
										 |  |  | - [`Adobe ExtendScript`](demos/extendscript/) | 
					
						
							| 
									
										
										
										
											2017-08-19 23:06:34 +00:00
										 |  |  | - [`Headless Browsers`](demos/headless/) | 
					
						
							| 
									
										
										
										
											2017-08-10 23:46:34 +00:00
										 |  |  | - [`canvas-datagrid`](demos/datagrid/) | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | - [`Swift JSC and other engines`](demos/altjs/) | 
					
						
							| 
									
										
										
										
											2017-08-10 23:46:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Optional Modules
 | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Optional features</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | The node version automatically requires modules for additional features.  Some | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  | of these modules are rather large in size and are only needed in special | 
					
						
							|  |  |  | circumstances, so they do not ship with the core.  For browser use, they must | 
					
						
							|  |  |  | be included directly: | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```html | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | <!-- international support from js-codepage --> | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | <script src="dist/cpexcel.js"></script> | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | An appropriate version for each dependency is included in the dist/ directory. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The complete single-file version is generated at `dist/xlsx.full.min.js` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | Webpack and Browserify builds include optional modules by default.  Webpack can | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | be configured to remove support with `resolve.alias`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  |   /* uncomment the lines below to remove support */ | 
					
						
							|  |  |  |   resolve: { | 
					
						
							|  |  |  |     alias: { "./dist/cpexcel.js": "" } // <-- omit international support | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### ECMAScript 5 Compatibility
 | 
					
						
							| 
									
										
										
										
											2014-06-03 18:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | Since the library uses functions like `Array#forEach`, older browsers require | 
					
						
							|  |  |  | [shims to provide missing functions](http://oss.sheetjs.com/js-xlsx/shim.js). | 
					
						
							| 
									
										
										
										
											2014-06-03 18:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | To use the shim, add the shim before the script tag that loads `xlsx.js`: | 
					
						
							| 
									
										
										
										
											2014-06-03 18:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```html | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | <!-- add the shim first --> | 
					
						
							|  |  |  | <script type="text/javascript" src="shim.js"></script> | 
					
						
							|  |  |  | <!-- after the shim is referenced, add the library --> | 
					
						
							|  |  |  | <script type="text/javascript" src="xlsx.full.min.js"></script> | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2014-06-03 18:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | ## Philosophy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Philosophy</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Prior to SheetJS, APIs for processing spreadsheet files were format-specific. | 
					
						
							|  |  |  | Third-party libraries either supported one format, or they involved a separate | 
					
						
							|  |  |  | set of classes for each supported file type.  Even though XLSB was introduced in | 
					
						
							|  |  |  | Excel 2007, nothing outside of SheetJS or Excel supported the format. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To promote a format-agnostic view, js-xlsx starts from a pure-JS representation | 
					
						
							|  |  |  | that we call the ["Common Spreadsheet Format"](#common-spreadsheet-format). | 
					
						
							| 
									
										
										
										
											2017-08-01 05:50:53 +00:00
										 |  |  | Emphasizing a uniform object representation enables new features like format | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | conversion (reading an XLSX template and saving as XLS) and circumvents the | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | "class trap".  By abstracting the complexities of the various formats, tools | 
					
						
							|  |  |  | need not worry about the specific file type! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A simple object representation combined with careful coding practices enables | 
					
						
							|  |  |  | use cases in older browsers and in alternative environments like ExtendScript | 
					
						
							|  |  |  | and Web Workers. It is always tempting to use the latest and greatest features, | 
					
						
							|  |  |  | but they tend to require the latest versions of browsers, limiting usability. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Utility functions capture common use cases like generating JS objects or HTML. | 
					
						
							|  |  |  | Most simple operations should only require a few lines of code.  More complex | 
					
						
							|  |  |  | operations generally should be straightforward to implement. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Excel pushes the XLSX format as default starting in Excel 2007.  However, there | 
					
						
							|  |  |  | are other formats with more appealing properties.  For example, the XLSB format | 
					
						
							|  |  |  | is spiritually similar to XLSX but files often tend up taking less than half the | 
					
						
							|  |  |  | space and open much faster!  Even though an XLSX writer is available, other | 
					
						
							|  |  |  | format writers are available so users can take advantage of the unique | 
					
						
							|  |  |  | characteristics of each format. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | ## Parsing Workbooks
 | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | For parsing, the first step is to read the file.  This involves acquiring the | 
					
						
							|  |  |  | data and feeding it into the library.  Here are a few common scenarios: | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>nodejs read a file</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | `readFile` is only available in server environments. Browsers have no API for | 
					
						
							|  |  |  | reading arbitrary files given a path, so another strategy must be used. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | if(typeof require !== 'undefined') XLSX = require('xlsx'); | 
					
						
							|  |  |  | var workbook = XLSX.readFile('test.xlsx'); | 
					
						
							|  |  |  | /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2014-05-22 12:16:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Browser read TABLE element from page</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | The `table_to_book` and `table_to_sheet` utility functions take a DOM TABLE | 
					
						
							|  |  |  | element and iterate through the child nodes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  | ```js | 
					
						
							|  |  |  | var worksheet = XLSX.utils.table_to_book(document.getElementById('tableau')); | 
					
						
							|  |  |  | /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | Alternatively, the HTML code can be extracted and parsed: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var htmlstr = document.getElementById('tableau').outerHTML; | 
					
						
							|  |  |  | var worksheet = XLSX.read(htmlstr, {type:'string'}); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Browser download file (ajax)</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Note: for a more complete example that works in older browsers, check the demo | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | at <http://oss.sheetjs.com/js-xlsx/ajax.html>).  The <demos/xhr/> directory also | 
					
						
							|  |  |  | includes more examples with `XMLHttpRequest` and `fetch`. | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx"; | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | /* set up async GET request */ | 
					
						
							|  |  |  | var req = new XMLHttpRequest(); | 
					
						
							|  |  |  | req.open("GET", url, true); | 
					
						
							|  |  |  | req.responseType = "arraybuffer"; | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | req.onload = function(e) { | 
					
						
							|  |  |  |   var data = new Uint8Array(req.response); | 
					
						
							|  |  |  |   var workbook = XLSX.read(data, {type:"array"}); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | req.send(); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Browser drag-and-drop</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | Drag-and-drop uses the HTML5 `FileReader` API, loading the data with | 
					
						
							|  |  |  | `readAsBinaryString` or `readAsArrayBuffer`.  Since not all browsers support the | 
					
						
							|  |  |  | full `FileReader` API, dynamic feature tests are highly recommended. | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | function handleDrop(e) { | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   e.stopPropagation(); e.preventDefault(); | 
					
						
							|  |  |  |   var files = e.dataTransfer.files, f = files[0]; | 
					
						
							|  |  |  |   var reader = new FileReader(); | 
					
						
							|  |  |  |   reader.onload = function(e) { | 
					
						
							|  |  |  |     var data = e.target.result; | 
					
						
							|  |  |  |     if(!rABS) data = new Uint8Array(data); | 
					
						
							|  |  |  |     var workbook = XLSX.read(data, {type: rABS ? 'binary' : 'array'}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | } | 
					
						
							|  |  |  | drop_dom_element.addEventListener('drop', handleDrop, false); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Browser file upload form element</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Data from file input elements can be processed using the same `FileReader` API | 
					
						
							|  |  |  | as in the drag-and-drop example: | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | function handleFile(e) { | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   var files = e.target.files, f = files[0]; | 
					
						
							|  |  |  |   var reader = new FileReader(); | 
					
						
							|  |  |  |   reader.onload = function(e) { | 
					
						
							|  |  |  |     var data = e.target.result; | 
					
						
							|  |  |  |     if(!rABS) data = new Uint8Array(data); | 
					
						
							|  |  |  |     var workbook = XLSX.read(data, {type: rABS ? 'binary' : 'array'}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f); | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | input_dom_element.addEventListener('change', handleFile, false); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 22:27:54 +00:00
										 |  |  | ### Parsing Examples
 | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | - <http://oss.sheetjs.com/js-xlsx/> HTML5 File API / Base64 Text / Web Workers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | Note that older versions of IE do not support HTML5 File API, so the Base64 mode | 
					
						
							| 
									
										
										
										
											2017-06-03 07:19:09 +00:00
										 |  |  | is used for testing. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Get Base64 encoding on OSX / Windows</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-06-03 07:19:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | On OSX you can get the Base64 encoding with: | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | $ <target_file base64 | pbcopy | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | On Windows XP and up you can get the Base64 encoding using `certutil`: | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```cmd | 
					
						
							|  |  |  | > certutil -encode target_file target_file.b64
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (note: You have to open the file and remove the header and footer lines) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-03 07:19:09 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | - <http://oss.sheetjs.com/js-xlsx/ajax.html> XMLHttpRequest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | ### Streaming Read
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Why is there no Streaming Read API?</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The most common and interesting formats (XLS, XLSX/M, XLSB, ODS) are ultimately | 
					
						
							|  |  |  | ZIP or CFB containers of files.  Neither format puts the directory structure at | 
					
						
							|  |  |  | the beginning of the file: ZIP files place the Central Directory records at the | 
					
						
							| 
									
										
										
										
											2017-08-01 05:50:53 +00:00
										 |  |  | end of the logical file, while CFB files can place the storage info anywhere in | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | the file! As a result, to properly handle these formats, a streaming function | 
					
						
							|  |  |  | would have to buffer the entire file before commencing.  That belies the | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | expectations of streaming, so we do not provide any streaming read API. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When dealing with Readable Streams, the easiest approach is to buffer the stream | 
					
						
							|  |  |  | and process the whole thing at the end.  This can be done with a temporary file | 
					
						
							|  |  |  | or by explicitly concatenating the stream: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Explicitly concatenating streams</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var fs = require('fs'); | 
					
						
							|  |  |  | var XLSX = require('xlsx'); | 
					
						
							|  |  |  | function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   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"}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* DO SOMETHING WITH workbook IN THE CALLBACK */ | 
					
						
							|  |  |  |     cb(workbook); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | More robust solutions are available using modules like `concat-stream`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Writing to filesystem first</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | This example uses [`tempfile`](https://npm.im/tempfile) to generate file names: | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var fs = require('fs'), tempfile = require('tempfile'); | 
					
						
							|  |  |  | var XLSX = require('xlsx'); | 
					
						
							|  |  |  | function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   var fname = tempfile('.sheetjs'); | 
					
						
							|  |  |  |   console.log(fname); | 
					
						
							|  |  |  |   var ostream = fs.createWriteStream(fname); | 
					
						
							|  |  |  |   stream.pipe(ostream); | 
					
						
							|  |  |  |   ostream.on('finish', function() { | 
					
						
							|  |  |  |     var workbook = XLSX.readFile(fname); | 
					
						
							|  |  |  |     fs.unlinkSync(fname); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* DO SOMETHING WITH workbook IN THE CALLBACK */ | 
					
						
							|  |  |  |     cb(workbook); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | ## Working with the Workbook
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | The full object format is described later in this README. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Reading a specific cell </b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | This example extracts the value stored in cell A1 from the first worksheet: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | var first_sheet_name = workbook.SheetNames[0]; | 
					
						
							|  |  |  | var address_of_cell = 'A1'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Get worksheet */ | 
					
						
							|  |  |  | var worksheet = workbook.Sheets[first_sheet_name]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Find desired cell */ | 
					
						
							|  |  |  | var desired_cell = worksheet[address_of_cell]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Get the value */ | 
					
						
							| 
									
										
										
										
											2017-03-14 08:19:51 +00:00
										 |  |  | var desired_value = (desired_cell ? desired_cell.v : undefined); | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Adding a new worksheet to a workbook</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | This example uses [`XLSX.utils.aoa_to_sheet`](#array-of-arrays-input) to make a | 
					
						
							|  |  |  | worksheet and appends the new worksheet to the workbook: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var new_ws_name = "SheetJS"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* make worksheet */ | 
					
						
							|  |  |  | var ws_data = [ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   [ "S", "h", "e", "e", "t", "J", "S" ], | 
					
						
							|  |  |  |   [  1 ,  2 ,  3 ,  4 ,  5 ] | 
					
						
							| 
									
										
										
										
											2017-05-24 22:52:35 +00:00
										 |  |  | ]; | 
					
						
							|  |  |  | var ws = XLSX.utils.aoa_to_sheet(ws_data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Add the sheet name to the list */ | 
					
						
							|  |  |  | wb.SheetNames.push(ws_name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Load the worksheet object */ | 
					
						
							|  |  |  | wb.Sheets[ws_name] = ws; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 22:27:54 +00:00
										 |  |  | ### Parsing and Writing Examples
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - <http://sheetjs.com/demos/modify.html> read + modify + write files | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | - <https://github.com/SheetJS/js-xlsx/blob/master/bin/xlsx.njs> node | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | The node version installs a command line tool `xlsx` which can read spreadsheet | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | files and output the contents in various formats.  The source is available at | 
					
						
							|  |  |  | `xlsx.njs` in the bin directory. | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | Some helper functions in `XLSX.utils` generate different views of the sheets: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | - `XLSX.utils.sheet_to_csv` generates CSV | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | - `XLSX.utils.sheet_to_html` generates HTML | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | - `XLSX.utils.sheet_to_json` generates an array of objects | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | - `XLSX.utils.sheet_to_formulae` generates a list of formulae | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | ## Writing Workbooks
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | For writing, the first step is to generate output data.  The helper functions | 
					
						
							|  |  |  | `write` and `writeFile` will produce the data in various formats suitable for | 
					
						
							|  |  |  | dissemination.  The second step is to actual share the data with the end point. | 
					
						
							|  |  |  | Assuming `workbook` is a workbook object: | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>nodejs write a file</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | `writeFile` is only available in server environments. Browsers have no API for | 
					
						
							|  |  |  | writing arbitrary files given a path, so another strategy must be used. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | if(typeof require !== 'undefined') XLSX = require('xlsx'); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | /* output format determined by filename */ | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | XLSX.writeFile(workbook, 'out.xlsb'); | 
					
						
							|  |  |  | /* at this point, out.xlsb is a file that you can distribute */ | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  |   <summary><b>Browser add to web page</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `sheet_to_html` utility function generates HTML code that can be added to | 
					
						
							|  |  |  | any DOM element. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var worksheet = workbook.Sheets[workbook.SheetNames[0]]; | 
					
						
							|  |  |  | var container = document.getElementById('tableau'); | 
					
						
							|  |  |  | container.innerHTML = XLSX.utils.sheet_to_html(worksheet); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							|  |  |  |   <summary><b>Browser save file</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Note: browser generates binary blob and forces a "download" to client.  This | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | example uses [FileSaver](https://github.com/eligrey/FileSaver.js/): | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | /* bookType can be any supported output type */ | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | var wopts = { bookType:'xlsx', bookSST:false, type:'binary' }; | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | var wbout = XLSX.write(workbook,wopts); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function s2ab(s) { | 
					
						
							|  |  |  |   var buf = new ArrayBuffer(s.length); | 
					
						
							|  |  |  |   var view = new Uint8Array(buf); | 
					
						
							|  |  |  |   for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; | 
					
						
							|  |  |  |   return buf; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | /* the saveAs call downloads a file on the local machine */ | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), "test.xlsx"); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Browser upload to server</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | A complete example using XHR is [included in the XHR demo](demos/xhr/), along | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | 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): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* in this example, send a base64 string to the server */ | 
					
						
							|  |  |  | var wopts = { bookType:'xlsx', bookSST:false, type:'base64' }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var wbout = XLSX.write(workbook,wopts); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | var req = new XMLHttpRequest(); | 
					
						
							|  |  |  | req.open("POST", "/upload", true); | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | req.send(formdata); | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 22:27:54 +00:00
										 |  |  | ### Writing Examples
 | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | - <http://sheetjs.com/demos/table.html> exporting an HTML table | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | - <http://sheetjs.com/demos/writexlsx.html> generates a simple file | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | ### Streaming Write
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 07:31:21 +00:00
										 |  |  | The streaming write functions are available in the `XLSX.stream` object.  They | 
					
						
							| 
									
										
										
										
											2017-06-10 01:47:42 +00:00
										 |  |  | take the same arguments as the normal write functions but return a Readable | 
					
						
							|  |  |  | Stream.  They are only exposed in NodeJS. | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 07:31:21 +00:00
										 |  |  | - `XLSX.stream.to_csv` is the streaming version of `XLSX.utils.sheet_to_csv`. | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | - `XLSX.stream.to_html` is the streaming version of `XLSX.utils.sheet_to_html`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>nodejs convert to CSV and write file</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var output_file_name = "out.csv"; | 
					
						
							|  |  |  | var stream = XLSX.stream.to_csv(worksheet); | 
					
						
							|  |  |  | stream.pipe(fs.createWriteStream(output_file_name)); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-16 07:31:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | <https://github.com/sheetjs/sheetaki> pipes write streams to nodejs response. | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | ## Interface
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | `XLSX` is the exposed variable in the browser and the exported node variable | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | `XLSX.version` is the version of the library (added by the build script). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.SSF` is an embedded version of the [format library](http://git.io/ssf). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Parsing functions
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | `XLSX.read(data, read_opts)` attempts to parse `data`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.readFile(filename, read_opts)` attempts to read `filename` and parse. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | Parse options are described in the [Parsing Options](#parsing-options) section. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | ### Writing functions
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | `XLSX.write(wb, write_opts)` attempts to write the workbook `wb` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.writeFile(wb, filename, write_opts)` attempts to write `wb` to `filename` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | `XLSX.writeFileAsync(filename, wb, o, cb)` attempts to write `wb` to `filename`. | 
					
						
							|  |  |  | If `o` is omitted, the writer will use the third argument as the callback. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 07:31:21 +00:00
										 |  |  | `XLSX.stream` contains a set of streaming write functions. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | Write options are described in the [Writing Options](#writing-options) section. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | ### Utilities
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-08 20:31:17 +00:00
										 |  |  | Utilities are available in the `XLSX.utils` object and are described in the | 
					
						
							|  |  |  | [Utility Functions](#utility-functions) section: | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | **Importing:** | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `aoa_to_sheet` converts an array of arrays of JS data to a worksheet. | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  | - `json_to_sheet` converts an array of JS objects to a worksheet. | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | - `table_to_sheet` converts a DOM TABLE element to a worksheet. | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-14 08:19:51 +00:00
										 |  |  | **Exporting:** | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 00:56:31 +00:00
										 |  |  | - `sheet_to_json` converts a worksheet object to an array of JSON objects. | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | - `sheet_to_csv` generates delimiter-separated-values output. | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | - `sheet_to_html` generates HTML output. | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | - `sheet_to_formulae` generates a list of the formulae (with value fallbacks). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-14 08:19:51 +00:00
										 |  |  | **Cell and cell address manipulation:** | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | - `format_cell` generates the text value for a cell (using number formats). | 
					
						
							|  |  |  | - `encode_row / decode_row` converts between 0-indexed rows and 1-indexed rows. | 
					
						
							|  |  |  | - `encode_col / decode_col` converts between 0-indexed columns and column names. | 
					
						
							|  |  |  | - `encode_cell / decode_cell` converts cell addresses. | 
					
						
							|  |  |  | - `encode_range / decode_range` converts cell ranges. | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | ## Common Spreadsheet Format
 | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | js-xlsx conforms to the Common Spreadsheet Format (CSF): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | ### General Structures
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Cell address objects are stored as `{c:C, r:R}` where `C` and `R` are 0-indexed | 
					
						
							|  |  |  | column and row numbers, respectively.  For example, the cell address `B5` is | 
					
						
							|  |  |  | represented by the object `{c:1, r:4}`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Cell range objects are stored as `{s:S, e:E}` where `S` is the first cell and | 
					
						
							|  |  |  | `E` is the last cell in the range.  The ranges are inclusive.  For example, the | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | range `A3:B7` is represented by the object `{s:{c:0, r:2}, e:{c:1, r:6}}`. | 
					
						
							|  |  |  | Utility functions perform a row-major order walk traversal of a sheet range: | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | for(var R = range.s.r; R <= range.e.r; ++R) { | 
					
						
							|  |  |  |   for(var C = range.s.c; C <= range.e.c; ++C) { | 
					
						
							|  |  |  |     var cell_address = {c:C, r:R}; | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |     /* if an A1-style address is needed, encode the address */ | 
					
						
							|  |  |  |     var cell_ref = XLSX.utils.encode_cell(cell_address); | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Cell Object
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 20:36:32 +00:00
										 |  |  | | Key | Description                                                            | | 
					
						
							|  |  |  | | --- | ---------------------------------------------------------------------- | | 
					
						
							|  |  |  | | `v` | raw value (see Data Types section for more info)                       | | 
					
						
							|  |  |  | | `w` | formatted text (if applicable)                                         | | 
					
						
							|  |  |  | | `t` | cell type: `b` Boolean, `n` Number, `e` error, `s` String, `d` Date    | | 
					
						
							|  |  |  | | `f` | cell formula encoded as an A1-style string (if applicable)             | | 
					
						
							|  |  |  | | `F` | range of enclosing array if formula is array formula (if applicable)   | | 
					
						
							|  |  |  | | `r` | rich text encoding (if applicable)                                     | | 
					
						
							|  |  |  | | `h` | HTML rendering of the rich text (if applicable)                        | | 
					
						
							|  |  |  | | `c` | comments associated with the cell                                      | | 
					
						
							|  |  |  | | `z` | number format string associated with the cell (if requested)           | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `l` | cell hyperlink object (`.Target` holds link, `.Tooltip` is tooltip)    | | 
					
						
							| 
									
										
										
										
											2017-02-19 20:36:32 +00:00
										 |  |  | | `s` | the style/theme of the cell (if applicable)                            | | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Built-in export utilities (such as the CSV exporter) will use the `w` text if it | 
					
						
							|  |  |  | is available.  To change a value, be sure to delete `cell.w` (or set it to | 
					
						
							|  |  |  | `undefined`) before attempting to export.  The utilities will regenerate the `w` | 
					
						
							|  |  |  | text from the number format (`cell.z`) and the raw value if possible. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 20:36:32 +00:00
										 |  |  | The actual array formula is stored in the `f` field of the first cell in the | 
					
						
							|  |  |  | array range.  Other cells in the range will omit the `f` field. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | #### Data Types
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The raw value is stored in the `v` field, interpreted based on the `t` field. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | Type `b` is the Boolean type.  `v` is interpreted according to JS truth tables. | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Type `e` is the Error type. `v` holds the number and `w` holds the common name: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Error values and interpretation</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | |  Value | Error Meaning   | | 
					
						
							|  |  |  | | -----: | :-------------- | | 
					
						
							|  |  |  | | `0x00` | `#NULL!`        | | 
					
						
							|  |  |  | | `0x07` | `#DIV/0!`       | | 
					
						
							|  |  |  | | `0x0F` | `#VALUE!`       | | 
					
						
							|  |  |  | | `0x17` | `#REF!`         | | 
					
						
							|  |  |  | | `0x1D` | `#NAME?`        | | 
					
						
							|  |  |  | | `0x24` | `#NUM!`         | | 
					
						
							|  |  |  | | `0x2A` | `#N/A`          | | 
					
						
							|  |  |  | | `0x2B` | `#GETTING_DATA` | | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | Type `n` is the Number type. This includes all forms of data that Excel stores | 
					
						
							|  |  |  | as numbers, such as dates/times and Boolean fields.  Excel exclusively uses data | 
					
						
							|  |  |  | that can be fit in an IEEE754 floating point number, just like JS Number, so the | 
					
						
							| 
									
										
										
										
											2017-03-19 23:04:31 +00:00
										 |  |  | `v` field holds the raw number.  The `w` field holds formatted text.  Dates are | 
					
						
							|  |  |  | stored as numbers by default and converted with `XLSX.SSF.parse_date_code`. | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Type `d` is the Date type, generated only when the option `cellDates` is passed. | 
					
						
							|  |  |  | Since JSON does not have a natural Date type, parsers are generally expected to | 
					
						
							|  |  |  | store ISO 8601 Date strings like you would get from `date.toISOString()`.  On | 
					
						
							|  |  |  | the other hand, writers and exporters should be able to handle date strings and | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | JS Date objects.  Note that Excel disregards timezone modifiers and treats all | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | dates in the local timezone.  js-xlsx does not correct for this error. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Type `s` is the String type.  `v` should be explicitly stored as a string to | 
					
						
							|  |  |  | avoid possible confusion. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-15 08:19:02 +00:00
										 |  |  | Type `z` represents blank stub cells.  These do not have any data or type, and | 
					
						
							|  |  |  | are not processed by any of the core library functions.  By default these cells | 
					
						
							| 
									
										
										
										
											2017-03-16 01:17:24 +00:00
										 |  |  | will not be generated; the parser `sheetStubs` option must be set to `true`. | 
					
						
							| 
									
										
										
										
											2017-03-15 08:19:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-21 20:44:35 +00:00
										 |  |  | #### Dates
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Excel Date Code details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-21 20:44:35 +00:00
										 |  |  | By default, Excel stores dates as numbers with a format code that specifies date | 
					
						
							|  |  |  | processing.  For example, the date `19-Feb-17` is stored as the number `42785` | 
					
						
							|  |  |  | with a number format of `d-mmm-yy`.  The `SSF` module understands number formats | 
					
						
							|  |  |  | and performs the appropriate conversion. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XLSX also supports a special date type `d` where the data is an ISO 8601 date | 
					
						
							|  |  |  | string.  The formatter converts the date back to a number. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The default behavior for all parsers is to generate number cells.  Setting | 
					
						
							|  |  |  | `cellDates` to true will force the generators to store dates. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Time Zones and Dates</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Excel has no native concept of universal time.  All times are specified in the | 
					
						
							|  |  |  | local time zone.  Excel limitations prevent specifying true absolute dates. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Following Excel, this library treats all dates as relative to local time zone. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Epochs: 1900 and 1904</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Excel supports two epochs (January 1 1900 and January 1 1904), see | 
					
						
							|  |  |  | ["1900 vs. 1904 Date System" article](http://support2.microsoft.com/kb/180162). | 
					
						
							|  |  |  | The workbook's epoch can be determined by examining the workbook's | 
					
						
							|  |  |  | `wb.Workbook.WBProps.date1904` property: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | !!(((wb.Workbook||{}).WBProps||{}).date1904) | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  | ### Sheet Objects
 | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | Each key that does not start with `!` maps to a cell (using `A-1` notation) | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  | `sheet[address]` returns the cell object for the specified address. | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | **Special sheet keys (accessible as `sheet[key]`, each starting with `!`):** | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  | - `sheet['!ref']`: A-1 based range representing the sheet range. Functions that | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  |   work with sheets should use this parameter to determine the range.  Cells that | 
					
						
							|  |  |  |   are assigned outside of the range are not processed.  In particular, when | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  |   writing a sheet by hand, cells outside of the range are not included | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  |   Functions that handle sheets should test for the presence of `!ref` field. | 
					
						
							| 
									
										
										
										
											2014-08-26 17:40:04 +00:00
										 |  |  |   If the `!ref` is omitted or is not a valid range, functions are free to treat | 
					
						
							|  |  |  |   the sheet as empty or attempt to guess the range.  The standard utilities that | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  |   ship with this library treat sheets as empty (for example, the CSV output is | 
					
						
							| 
									
										
										
										
											2014-08-26 17:40:04 +00:00
										 |  |  |   empty string). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  |   When reading a worksheet with the `sheetRows` property set, the ref parameter | 
					
						
							|  |  |  |   will use the restricted range.  The original range is set at `ws['!fullref']` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 01:29:38 +00:00
										 |  |  | - `sheet['!margins']`: Object representing the page margins.  The default values | 
					
						
							|  |  |  |   follow Excel's "normal" preset.  Excel also has a "wide" and a "narrow" preset | 
					
						
							|  |  |  |   but they are stored as raw measurements. The main properties are listed below: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Page margin details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 01:29:38 +00:00
										 |  |  | | key      | description            | "normal" | "wide" | "narrow" | | 
					
						
							|  |  |  | |----------|------------------------|:---------|:-------|:-------- | | 
					
						
							|  |  |  | | `left`   | left margin (inches)   | `0.7`    | `1.0`  | `0.25`   | | 
					
						
							|  |  |  | | `right`  | right margin (inches)  | `0.7`    | `1.0`  | `0.25`   | | 
					
						
							|  |  |  | | `top`    | top margin (inches)    | `0.75`   | `1.0`  | `0.75`   | | 
					
						
							|  |  |  | | `bottom` | bottom margin (inches) | `0.75`   | `1.0`  | `0.75`   | | 
					
						
							|  |  |  | | `header` | header margin (inches) | `0.3`    | `0.5`  | `0.3`    | | 
					
						
							|  |  |  | | `footer` | footer margin (inches) | `0.3`    | `0.5`  | `0.3`    | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* Set worksheet sheet to "normal" */ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | ws["!margins"]={left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3} | 
					
						
							| 
									
										
										
										
											2017-04-13 01:29:38 +00:00
										 |  |  | /* Set worksheet sheet to "wide" */ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | ws["!margins"]={left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5} | 
					
						
							| 
									
										
										
										
											2017-04-13 01:29:38 +00:00
										 |  |  | /* Set worksheet sheet to "narrow" */ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | ws["!margins"]={left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3} | 
					
						
							| 
									
										
										
										
											2017-04-13 01:29:38 +00:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-13 01:29:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | #### Worksheet Object
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | In addition to the base sheet keys, worksheets also add: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | - `ws['!cols']`: array of column properties objects.  Column widths are actually | 
					
						
							|  |  |  |   stored in files in a normalized manner, measured in terms of the "Maximum | 
					
						
							|  |  |  |   Digit Width" (the largest width of the rendered digits 0-9, in pixels).  When | 
					
						
							|  |  |  |   parsed, the column objects store the pixel width in the `wpx` field, character | 
					
						
							|  |  |  |   width in the `wch` field, and the maximum digit width in the `MDW` field. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | - `ws['!rows']`: array of row properties objects as explained later in the docs. | 
					
						
							|  |  |  |   Each row object encodes properties including row height and visibility. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | - `ws['!merges']`: array of range objects corresponding to the merged cells in | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   the worksheet.  Plain text formats do not support merge cells.  CSV export | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  |   will write all cells in the merge range if they exist, so be sure that only | 
					
						
							|  |  |  |   the first cell (upper-left) in the range is set. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | - `ws['!protect']`: object of write sheet protection properties.  The `password` | 
					
						
							| 
									
										
										
										
											2017-04-26 02:27:12 +00:00
										 |  |  |   key specifies the password for formats that support password-protected sheets | 
					
						
							|  |  |  |   (XLSX/XLSB/XLS).  The writer uses the XOR obfuscation method.  The following | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  |   keys control the sheet protection -- set to `false` to enable a feature when | 
					
						
							|  |  |  |   sheet is locked or set to `true` to disable a feature: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Worksheet Protection Details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | | key                   | feature (true=disabled / false=enabled) | default    | | 
					
						
							|  |  |  | |:----------------------|:----------------------------------------|:-----------| | 
					
						
							|  |  |  | | `selectLockedCells`   | Select locked cells                     | enabled    | | 
					
						
							|  |  |  | | `selectUnlockedCells` | Select unlocked cells                   | enabled    | | 
					
						
							|  |  |  | | `formatCells`         | Format cells                            | disabled   | | 
					
						
							|  |  |  | | `formatColumns`       | Format columns                          | disabled   | | 
					
						
							|  |  |  | | `formatRows`          | Format rows                             | disabled   | | 
					
						
							|  |  |  | | `insertColumns`       | Insert columns                          | disabled   | | 
					
						
							|  |  |  | | `insertRows`          | Insert rows                             | disabled   | | 
					
						
							|  |  |  | | `insertHyperlinks`    | Insert hyperlinks                       | disabled   | | 
					
						
							|  |  |  | | `deleteColumns`       | Delete columns                          | disabled   | | 
					
						
							|  |  |  | | `deleteRows`          | Delete rows                             | disabled   | | 
					
						
							|  |  |  | | `sort`                | Sort                                    | disabled   | | 
					
						
							|  |  |  | | `autoFilter`          | Filter                                  | disabled   | | 
					
						
							|  |  |  | | `pivotTables`         | Use PivotTable reports                  | disabled   | | 
					
						
							|  |  |  | | `objects`             | Edit objects                            | enabled    | | 
					
						
							|  |  |  | | `scenarios`           | Edit scenarios                          | enabled    | | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-04 18:41:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-10 05:10:54 +00:00
										 |  |  | - `ws['!autofilter']`: AutoFilter object following the schema: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```typescript | 
					
						
							|  |  |  | type AutoFilter = { | 
					
						
							| 
									
										
										
										
											2017-04-26 02:27:12 +00:00
										 |  |  |   ref:string; // A-1 based range representing the AutoFilter table range | 
					
						
							| 
									
										
										
										
											2017-04-10 05:10:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | #### Chartsheet Object
 | 
					
						
							| 
									
										
										
										
											2017-03-27 21:35:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  | Chartsheets are represented as standard sheets.  They are distinguished with the | 
					
						
							|  |  |  | `!type` property set to `"chart"`. | 
					
						
							| 
									
										
										
										
											2017-03-27 21:35:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:46:02 +00:00
										 |  |  | The underlying data and `!ref` refer to the cached data in the chartsheet.  The | 
					
						
							|  |  |  | first row of the chartsheet is the underlying header. | 
					
						
							| 
									
										
										
										
											2017-03-27 21:35:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  | #### Macrosheet Object
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Macrosheets are represented as standard sheets.  They are distinguished with the | 
					
						
							|  |  |  | `!type` property set to `"macro"`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### Dialogsheet Object
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Dialogsheets are represented as standard sheets. They are distinguished with the | 
					
						
							|  |  |  | `!type` property set to `"dialog"`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | ### Workbook Object
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `workbook.SheetNames` is an ordered list of the sheets in the workbook | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `wb.Sheets[sheetname]` returns an object representing the worksheet. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `wb.Props` is an object storing the standard properties.  `wb.Custprops` stores | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | custom properties.  Since the XLS standard properties deviate from the XLSX | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | standard, XLS parsing stores core properties in both places. | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | `wb.Workbook` stores [workbook-level attributes](#workbook-level-attributes). | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | #### Workbook File Properties
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The various file formats use different internal names for file properties.  The | 
					
						
							|  |  |  | workbook `Props` object normalizes the names: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>File Properties</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | JS Name       | Excel Description              | | 
					
						
							|  |  |  | |:--------------|:-------------------------------| | 
					
						
							|  |  |  | | `Title`       | Summary tab "Title"            | | 
					
						
							|  |  |  | | `Subject`     | Summary tab "Subject"          | | 
					
						
							|  |  |  | | `Author`      | Summary tab "Author"           | | 
					
						
							|  |  |  | | `Manager`     | Summary tab "Manager"          | | 
					
						
							|  |  |  | | `Company`     | Summary tab "Company"          | | 
					
						
							|  |  |  | | `Category`    | Summary tab "Category"         | | 
					
						
							|  |  |  | | `Keywords`    | Summary tab "Keywords"         | | 
					
						
							|  |  |  | | `Comments`    | Summary tab "Comments"         | | 
					
						
							|  |  |  | | `LastAuthor`  | Statistics tab "Last saved by" | | 
					
						
							|  |  |  | | `CreatedDate` | Statistics tab "Created"       | | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | For example, to set the workbook title property: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | if(!wb.Props) wb.Props = {}; | 
					
						
							|  |  |  | wb.Props.Title = "Insert Title Here"; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Custom properties are added in the workbook `Custprops` object: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | if(!wb.Custprops) wb.Custprops = {}; | 
					
						
							|  |  |  | wb.Custprops["Custom Property"] = "Custom Value"; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-10 05:10:54 +00:00
										 |  |  | Writers will process the `Props` key of the options object: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* force the Author to be "SheetJS" */ | 
					
						
							|  |  |  | XLSX.write(wb, {Props:{Author:"SheetJS"}}); | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-11 22:15:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### Workbook-Level Attributes
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | `wb.Workbook` stores workbook-level attributes. | 
					
						
							| 
									
										
										
										
											2017-04-11 22:15:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #### Defined Names
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `wb.Workbook.Names` is an array of defined name objects which have the keys: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Defined Name Properties</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-11 22:15:36 +00:00
										 |  |  | | Key       | Description                                                      | | 
					
						
							|  |  |  | |:----------|:-----------------------------------------------------------------| | 
					
						
							|  |  |  | | `Sheet`   | Name scope.  Sheet Index (0 = first sheet) or `null` (Workbook)  | | 
					
						
							|  |  |  | | `Name`    | Case-sensitive name.  Standard rules apply **                    | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `Ref`     | A1-style Reference (`"Sheet1!$A$1:$D$20"`)                       | | 
					
						
							| 
									
										
										
										
											2017-04-11 22:15:36 +00:00
										 |  |  | | `Comment` | Comment (only applicable for XLS/XLSX/XLSB)                      | | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-11 22:15:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Excel allows two sheet-scoped defined names to share the same name.  However, a | 
					
						
							|  |  |  | sheet-scoped name cannot collide with a workbook-scope name.  Workbook writers | 
					
						
							|  |  |  | may not enforce this constraint. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | #### Miscellaneous Workbook Properties
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `wb.Workbook.WBProps` holds other workbook properties: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-03 07:19:09 +00:00
										 |  |  | | Key             | Description                                         | | 
					
						
							|  |  |  | |:----------------|:----------------------------------------------------| | 
					
						
							|  |  |  | | `date1904`      | epoch: 0/false for 1900 system, 1/true for 1904     | | 
					
						
							|  |  |  | | `filterPrivacy` | Warn or strip personally identifying info on save   | | 
					
						
							| 
									
										
										
										
											2017-06-01 21:22:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | ### Document Features
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### Formulae
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The A1-style formula string is stored in the `f` field.  Even though different | 
					
						
							|  |  |  | file formats store the formulae in different ways, the formats are translated. | 
					
						
							|  |  |  | Even though some formats store formulae with a leading equal sign, CSF formulae | 
					
						
							|  |  |  | do not start with `=`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Representation of A1=1, A2=2, A3=A1+A2</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   "!ref": "A1:A3", | 
					
						
							|  |  |  |   A1: { t:'n', v:1 }, | 
					
						
							|  |  |  |   A2: { t:'n', v:2 }, | 
					
						
							|  |  |  |   A3: { t:'n', v:3, f:'A1+A2' } | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Shared formulae are decompressed and each cell has the formula corresponding to | 
					
						
							|  |  |  | its cell.  Writers generally do not attempt to generate shared formulae. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Cells with formula entries but no value will be serialized in a way that Excel | 
					
						
							|  |  |  | and other spreadsheet tools will recognize.  This library will not automatically | 
					
						
							|  |  |  | compute formula results!  For example, to compute `BESSELJ` in a worksheet: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Formula without known value</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | ```js | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   "!ref": "A1:A3", | 
					
						
							|  |  |  |   A1: { t:'n', v:3.14159 }, | 
					
						
							|  |  |  |   A2: { t:'n', v:2 }, | 
					
						
							|  |  |  |   A3: { t:'n', f:'BESSELJ(A1,A2)' } | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | **Array Formulae** | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Array formulae are stored in the top-left cell of the array block.  All cells | 
					
						
							|  |  |  | of an array formula have a `F` field corresponding to the range.  A single-cell | 
					
						
							|  |  |  | formula can be distinguished from a plain formula by the presence of `F` field. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Array Formula examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | For example, setting the cell `C1` to the array formula `{=SUM(A1:A3*B1:B3)}`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | worksheet['C1'] = { t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" }; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For a multi-cell array formula, every cell has the same array range but only the | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | first cell specifies the formula.  Consider `D1:D3=A1:A3*B1:B3`: | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | worksheet['D1'] = { t:'n', F:"D1:D3", f:"A1:A3*B1:B3" }; | 
					
						
							|  |  |  | worksheet['D2'] = { t:'n', F:"D1:D3" }; | 
					
						
							|  |  |  | worksheet['D3'] = { t:'n', F:"D1:D3" }; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | Utilities and writers are expected to check for the presence of a `F` field and | 
					
						
							|  |  |  | ignore any possible formula element `f` in cells other than the starting cell. | 
					
						
							|  |  |  | They are not expected to perform validation of the formulae! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Formula Output Utility Function</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The `sheet_to_formulae` method generates one line per formula or array formula. | 
					
						
							|  |  |  | Array formulae are rendered in the form `range=formula` while plain cells are | 
					
						
							|  |  |  | rendered in the form `cell=formula or value`.  Note that string literals are | 
					
						
							|  |  |  | prefixed with an apostrophe `'`, consistent with Excel's formula bar display. | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Formulae File Format Details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | | Storage Representation | Formats                  | Read  | Write | | 
					
						
							|  |  |  | |:-----------------------|:-------------------------|:-----:|:-----:| | 
					
						
							|  |  |  | | A1-style strings       | XLSX                     |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | RC-style strings       | XLML and plain text      |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | | BIFF Parsed formulae   | XLSB and all XLS formats |  :o:  |       | | 
					
						
							|  |  |  | | OpenFormula formulae   | ODS/FODS/UOS             |  :o:  |  :o:  | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Since Excel prohibits named cells from colliding with names of A1 or RC style | 
					
						
							|  |  |  | cell references, a (not-so-simple) regex conversion is possible.  BIFF Parsed | 
					
						
							|  |  |  | formulae have to be explicitly unwound.  OpenFormula formulae can be converted | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | with regular expressions. | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | #### Column Properties
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `!cols` array in each worksheet, if present, is a collection of `ColInfo` | 
					
						
							|  |  |  | objects which have the following properties: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```typescript | 
					
						
							|  |  |  | type ColInfo = { | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   /* visibility */ | 
					
						
							|  |  |  |   hidden?: boolean; // if true, the column is hidden | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   /* column width is specified in one of the following ways: */ | 
					
						
							|  |  |  |   wpx?:    number;  // width in screen pixels | 
					
						
							|  |  |  |   width?:  number;  // width in Excel's "Max Digit Width", width*256 is integral | 
					
						
							|  |  |  |   wch?:    number;  // width in characters | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   /* other fields for preserving features from files */ | 
					
						
							|  |  |  |   MDW?:    number;  // Excel's "Max Digit Width" unit, always integral | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Why are there three width types?</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | There are three different width types corresponding to the three different ways | 
					
						
							|  |  |  | spreadsheets store column widths: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | SYLK and other plain text formats use raw character count. Contemporaneous tools | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | like Visicalc and Multiplan were character based.  Since the characters had the | 
					
						
							|  |  |  | same width, it sufficed to store a count.  This tradition was continued into the | 
					
						
							|  |  |  | BIFF formats. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpreadsheetML (2003) tried to align with HTML by standardizing on screen pixel | 
					
						
							|  |  |  | count throughout the file.  Column widths, row heights, and other measures use | 
					
						
							|  |  |  | pixels.  When the pixel and character counts do not align, Excel rounds values. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XLSX internally stores column widths in a nebulous "Max Digit Width" form.  The | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | Max Digit Width is the width of the largest digit when rendered (generally the | 
					
						
							|  |  |  | "0" character is the widest).  The internal width must be an integer multiple of | 
					
						
							|  |  |  | the the width divided by 256.  ECMA-376 describes a formula for converting | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | between pixels and the internal width.  This represents a hybrid approach. | 
					
						
							| 
									
										
										
										
											2017-06-24 06:51:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Read functions attempt to populate all three properties.  Write functions will | 
					
						
							|  |  |  | try to cycle specified values to the desired type.  In order to avoid potential | 
					
						
							|  |  |  | conflicts, manipulation should delete the other properties first.  For example, | 
					
						
							|  |  |  | when changing the pixel width, delete the `wch` and `width` properties. | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Implementation details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | Even though all of the information is made available, writers are expected to | 
					
						
							|  |  |  | follow the priority order: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1) use `width` field if available | 
					
						
							|  |  |  | 2) use `wpx` pixel width if available | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | 3) use `wch` character count if available | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | #### Row Properties
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `!rows` array in each worksheet, if present, is a collection of `RowInfo` | 
					
						
							|  |  |  | objects which have the following properties: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```typescript | 
					
						
							|  |  |  | type RowInfo = { | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   /* visibility */ | 
					
						
							|  |  |  |   hidden?: boolean; // if true, the row is hidden | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   /* row height is specified in one of the following ways: */ | 
					
						
							|  |  |  |   hpx?:    number;  // height in screen pixels | 
					
						
							|  |  |  |   hpt?:    number;  // height in points | 
					
						
							| 
									
										
										
										
											2017-07-09 17:37:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   level?:  number;  // 0-indexed outline / group level | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-09 17:37:45 +00:00
										 |  |  | Note: Excel UI displays the base outline level as `1` and the max level as `8`. | 
					
						
							|  |  |  | The `level` field stores the base outline as `0` and the max level as `7`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Implementation details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Excel internally stores row heights in points.  The default resolution is 72 DPI | 
					
						
							|  |  |  | or 96 PPI, so the pixel and point size should agree.  For different resolutions | 
					
						
							|  |  |  | they may not agree, so the library separates the concepts. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | Even though all of the information is made available, writers are expected to | 
					
						
							|  |  |  | follow the priority order: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1) use `hpx` pixel height if available | 
					
						
							|  |  |  | 2) use `hpt` point height if available | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | #### Number Formats
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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.  Writers are expected to serialize the table. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Custom tools should ensure that the local table has each used format string | 
					
						
							|  |  |  | somewhere in the table.  Excel convention mandates that the custom formats start | 
					
						
							|  |  |  | at index 164.  The following example creates a custom format from scratch: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>New worksheet with custom format</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | ```js | 
					
						
							|  |  |  | var wb = { | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   SheetNames: ["Sheet1"], | 
					
						
							|  |  |  |   Sheets: { | 
					
						
							|  |  |  |     Sheet1: { | 
					
						
							|  |  |  |       "!ref":"A1:C1", | 
					
						
							|  |  |  |       A1: { t:"n", v:10000 },                    // <-- General format | 
					
						
							|  |  |  |       B1: { t:"n", v:10000, z: "0%" },           // <-- Builtin format | 
					
						
							|  |  |  |       C1: { t:"n", v:10000, z: "\"T\"\ #0.00" }  // <-- Custom format | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The rules are slightly different from how Excel displays custom number formats. | 
					
						
							|  |  |  | In particular, literal characters must be wrapped in double quotes or preceded | 
					
						
							|  |  |  | by a backslash. For more info, see the Excel documentation article | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | `Create or delete a custom number format` or ECMA-376 18.8.31 (Number Formats) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Default Number Formats</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | The default formats are listed in ECMA-376 18.8.30: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | ID | Format                     | | 
					
						
							|  |  |  | |---:|:---------------------------| | 
					
						
							|  |  |  | |  0 | `General`                  | | 
					
						
							|  |  |  | |  1 | `0`                        | | 
					
						
							|  |  |  | |  2 | `0.00`                     | | 
					
						
							|  |  |  | |  3 | `#,##0`                    | | 
					
						
							|  |  |  | |  4 | `#,##0.00`                 | | 
					
						
							|  |  |  | |  9 | `0%`                       | | 
					
						
							|  |  |  | | 10 | `0.00%`                    | | 
					
						
							|  |  |  | | 11 | `0.00E+00`                 | | 
					
						
							|  |  |  | | 12 | `# ?/?`                    | | 
					
						
							|  |  |  | | 13 | `# ??/??`                  | | 
					
						
							|  |  |  | | 14 | `m/d/yy` (see below)       | | 
					
						
							|  |  |  | | 15 | `d-mmm-yy`                 | | 
					
						
							|  |  |  | | 16 | `d-mmm`                    | | 
					
						
							|  |  |  | | 17 | `mmm-yy`                   | | 
					
						
							|  |  |  | | 18 | `h:mm AM/PM`               | | 
					
						
							|  |  |  | | 19 | `h:mm:ss AM/PM`            | | 
					
						
							|  |  |  | | 20 | `h:mm`                     | | 
					
						
							|  |  |  | | 21 | `h:mm:ss`                  | | 
					
						
							|  |  |  | | 22 | `m/d/yy h:mm`              | | 
					
						
							|  |  |  | | 37 | `#,##0 ;(#,##0)`           | | 
					
						
							|  |  |  | | 38 | `#,##0 ;[Red](#,##0)`      | | 
					
						
							|  |  |  | | 39 | `#,##0.00;(#,##0.00)`      | | 
					
						
							|  |  |  | | 40 | `#,##0.00;[Red](#,##0.00)` | | 
					
						
							|  |  |  | | 45 | `mm:ss`                    | | 
					
						
							|  |  |  | | 46 | `[h]:mm:ss`                | | 
					
						
							|  |  |  | | 47 | `mmss.0`                   | | 
					
						
							|  |  |  | | 48 | `##0.0E+0`                 | | 
					
						
							|  |  |  | | 49 | `@`                        | | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | Format 14 (`m/d/yy`) is localized by Excel: even though the file specifies that | 
					
						
							|  |  |  | number format, it will be drawn differently based on system settings.  It makes | 
					
						
							|  |  |  | sense when the producer and consumer of files are in the same locale, but that | 
					
						
							|  |  |  | is not always the case over the Internet.  To get around this ambiguity, parse | 
					
						
							|  |  |  | functions accept the `dateNF` option to override the interpretation of that | 
					
						
							|  |  |  | specific format string. | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  | #### Hyperlinks
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Hyperlinks are stored in the `l` key of cell objects.  The `Target` field of the | 
					
						
							|  |  |  | hyperlink object is the target of the link, including the URI fragment. Tooltips | 
					
						
							|  |  |  | are stored in the `Tooltip` field and are displayed when you move your mouse | 
					
						
							|  |  |  | over the text. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For example, the following snippet creates a link from cell `A3` to | 
					
						
							|  |  |  | <http://sheetjs.com> with the tip `"Find us @ SheetJS.com!"`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | ws['A3'].l = { Target:"http://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" }; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note that Excel does not automatically style hyperlinks -- they will generally | 
					
						
							|  |  |  | be displayed as normal text. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-02 06:47:25 +00:00
										 |  |  | #### Cell Comments
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Cell comments are objects stored in the `c` array of cell objects.  The actual | 
					
						
							|  |  |  | contents of the comment are split into blocks based on the comment author.  The | 
					
						
							|  |  |  | `a` field of each comment object is the author of the comment and the `t` field | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | is the plain text representation. | 
					
						
							| 
									
										
										
										
											2017-04-02 06:47:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | For example, the following snippet appends a cell comment into cell `A1`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | if(!ws.A1.c) ws.A1.c = []; | 
					
						
							|  |  |  | ws.A1.c.push({a:"SheetJS", t:"I'm a little comment, short and stout!"}); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note: XLSB enforces a 54 character limit on the Author name.  Names longer than | 
					
						
							|  |  |  | 54 characters may cause issues with other formats. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 18:46:42 +00:00
										 |  |  | #### Sheet Visibility
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Excel enables hiding sheets in the lower tab bar.  The sheet data is stored in | 
					
						
							|  |  |  | the file but the UI does not readily make it available.  Standard hidden sheets | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | are revealed in the "Unhide" menu.  Excel also has "very hidden" sheets which | 
					
						
							| 
									
										
										
										
											2017-03-31 18:46:42 +00:00
										 |  |  | cannot be revealed in the menu.  It is only accessible in the VB Editor! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | The visibility setting is stored in the `Hidden` property of sheet props array. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>More details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-03-31 18:46:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | | Value | Definition  | | 
					
						
							|  |  |  | |:-----:|:------------| | 
					
						
							|  |  |  | |   0   | Visible     | | 
					
						
							|  |  |  | |   1   | Hidden      | | 
					
						
							|  |  |  | |   2   | Very Hidden | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | With <https://rawgit.com/SheetJS/test_files/master/sheet_visibility.xlsx>: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | > wb.Workbook.Sheets.map(function(x) { return [x.name, x.Hidden] })
 | 
					
						
							|  |  |  | [ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ] | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Non-Excel formats do not support the Very Hidden state.  The best way to test | 
					
						
							| 
									
										
										
										
											2017-04-02 06:47:25 +00:00
										 |  |  | if a sheet is visible is to check if the `Hidden` property is logical truth: | 
					
						
							| 
									
										
										
										
											2017-03-31 18:46:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | > wb.Workbook.Sheets.map(function(x) { return [x.name, !x.Hidden] })
 | 
					
						
							|  |  |  | [ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ] | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-31 18:46:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  | #### VBA and Macros
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | VBA Macros are stored in a special data blob that is exposed in the `vbaraw` | 
					
						
							|  |  |  | property of the workbook object when the `bookVBA` option is `true`.  They are | 
					
						
							|  |  |  | supported in `XLSM`, `XLSB`, and `BIFF8 XLS` formats.  The `XLSM` and `XLSB` | 
					
						
							|  |  |  | writers automatically insert the data blobs if it is present in the workbook. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							|  |  |  | 	<summary><b>Macrosheets</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Older versions of Excel also supported a non-VBA "macrosheet" sheet type that | 
					
						
							|  |  |  | stored automation commands.  These are exposed in objects with the `!type` | 
					
						
							|  |  |  | property set to `"macro"`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							|  |  |  | 	<summary><b>Detecting macros in workbooks</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `vbaraw` field will only be set if macros are present, so testing is simple: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | function wb_has_macro(wb/*:workbook*/)/*:boolean*/ { | 
					
						
							|  |  |  | 	if(!!wb.vbaraw) return true; | 
					
						
							|  |  |  | 	const sheets = wb.SheetNames.map((n) => wb.Sheets[n]); | 
					
						
							|  |  |  | 	return sheets.some((ws) => !!ws && ws['!type']=='macro'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | ## Parsing Options
 | 
					
						
							| 
									
										
										
										
											2013-04-20 16:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | The exported `read` and `readFile` functions accept an options argument: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | | Option Name | Default | Description                                          | | 
					
						
							|  |  |  | | :---------- | ------: | :--------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`type`       |         | Input data encoding (see Input Type below)           | | 
					
						
							|  |  |  | |`raw`        | false   | If true, plain text parsing will not parse values ** | | 
					
						
							|  |  |  | |`cellFormula`| true    | Save formulae to the .f field                        | | 
					
						
							|  |  |  | |`cellHTML`   | true    | Parse rich text and save HTML to the `.h` field      | | 
					
						
							|  |  |  | |`cellNF`     | false   | Save number format string to the `.z` field          | | 
					
						
							|  |  |  | |`cellStyles` | false   | Save style/theme info to the `.s` field              | | 
					
						
							|  |  |  | |`cellText`   | true    | Generated formatted text to the `.w` field           | | 
					
						
							|  |  |  | |`cellDates`  | false   | Store dates as type `d` (default is `n`)             | | 
					
						
							|  |  |  | |`dateNF`     |         | If specified, use the string for date code 14 **     | | 
					
						
							|  |  |  | |`sheetStubs` | false   | Create cell objects of type `z` for stub cells       | | 
					
						
							|  |  |  | |`sheetRows`  | 0       | If >0, read the first `sheetRows` rows **            | | 
					
						
							|  |  |  | |`bookDeps`   | false   | If true, parse calculation chains                    | | 
					
						
							|  |  |  | |`bookFiles`  | false   | If true, add raw files to book object **             | | 
					
						
							|  |  |  | |`bookProps`  | false   | If true, only parse enough to get book metadata **   | | 
					
						
							|  |  |  | |`bookSheets` | false   | If true, only parse enough to get the sheet names    | | 
					
						
							|  |  |  | |`bookVBA`    | false   | If true, copy VBA blob to `vbaraw` field **          | | 
					
						
							|  |  |  | |`password`   | ""      | If defined and file is encrypted, use password **    | | 
					
						
							|  |  |  | |`WTF`        | false   | If true, throw errors on unexpected file features ** | | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | - Even if `cellNF` is false, formatted text will be generated and saved to `.w` | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | - In some cases, sheets may be parsed even if `bookSheets` is false. | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | - Excel aggressively tries to interpret values from CSV and other plain text. | 
					
						
							| 
									
										
										
										
											2017-07-26 08:35:28 +00:00
										 |  |  |   This leads to surprising behavior! The `raw` option suppresses value parsing. | 
					
						
							| 
									
										
										
										
											2014-02-14 06:25:46 +00:00
										 |  |  | - `bookSheets` and `bookProps` combine to give both sets of information | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | - `Deps` will be an empty object if `bookDeps` is false | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | - `bookFiles` behavior depends on file type: | 
					
						
							|  |  |  |     * `keys` array (paths in the ZIP) for ZIP-based formats | 
					
						
							|  |  |  |     * `files` hash (mapping paths to objects representing the files) for ZIP | 
					
						
							|  |  |  |     * `cfb` object for formats using CFB containers | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | - `sheetRows-1` rows will be generated when looking at the JSON object output | 
					
						
							|  |  |  |   (since the header row is counted as a row when parsing the data) | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | - `bookVBA` merely exposes the raw VBA CFB object.  It does not parse the data. | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  |   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. | 
					
						
							| 
									
										
										
										
											2015-04-02 20:32:22 +00:00
										 |  |  | - Currently only XOR encryption is supported.  Unsupported error will be thrown | 
					
						
							|  |  |  |   for files employing other encryption methods. | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | - WTF is mainly for development.  By default, the parser will suppress read | 
					
						
							|  |  |  |   errors on single worksheets, allowing you to read from the worksheets that do | 
					
						
							|  |  |  |   parse properly. Setting `WTF:1` forces those errors to be thrown. | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Input Type
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Strings can be interpreted in multiple ways.  The `type` parameter for `read` | 
					
						
							|  |  |  | tells the library how to parse the data argument: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | `type`     | expected input                                                  | | 
					
						
							|  |  |  | |------------|-----------------------------------------------------------------| | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `"base64"` | string: Base64 encoding of the file                             | | 
					
						
							|  |  |  | | `"binary"` | string: binary string (byte `n` is `data.charCodeAt(n)`)        | | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | | `"string"` | string: JS string (characters interpreted as UTF8)              | | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | | `"buffer"` | nodejs Buffer                                                   | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `"array"`  | array: array of 8-bit unsigned int (byte `n` is `data[n]`)      | | 
					
						
							|  |  |  | | `"file"`   | string: path of file that will be read (nodejs only)            | | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### Guessing File Type
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Implementation Details</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | Excel and other spreadsheet tools read the first few bytes and apply other | 
					
						
							|  |  |  | heuristics to determine a file type.  This enables file type punning: renaming | 
					
						
							|  |  |  | files with the `.xls` extension will tell your computer to use Excel to open the | 
					
						
							|  |  |  | file but Excel will know how to handle it.  This library applies similar logic: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Byte 0 | Raw File Type | Spreadsheet Types                                   | | 
					
						
							| 
									
										
										
										
											2017-02-22 07:25:10 +00:00
										 |  |  | |:-------|:--------------|:----------------------------------------------------| | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | | `0xD0` | CFB Container | BIFF 5/8 or password-protected XLSX/XLSB or WQ3/QPW | | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | | `0x09` | BIFF Stream   | BIFF 2/3/4/5                                        | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `0x3C` | XML/HTML      | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text | | 
					
						
							|  |  |  | | `0x50` | ZIP Archive   | XLSB or XLSX/M or ODS or UOS2 or plain 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 | | 
					
						
							|  |  |  | | `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 | | 
					
						
							|  |  |  | | `0x0D` | Plain text    | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text | | 
					
						
							|  |  |  | | `0x20` | Plain text    | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text | | 
					
						
							| 
									
										
										
										
											2017-03-28 04:41:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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) | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | Plain text format guessing follows the priority order: | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | | Format | Test                                                                | | 
					
						
							|  |  |  | |:-------|:--------------------------------------------------------------------| | 
					
						
							| 
									
										
										
										
											2017-07-26 08:35:28 +00:00
										 |  |  | | XML    | `<?xml` appears in the first 1024 characters                        | | 
					
						
							|  |  |  | | HTML   | starts with `<` and HTML tags appear in the first 1024 characters * | | 
					
						
							| 
									
										
										
										
											2017-06-08 06:19:11 +00:00
										 |  |  | | XML    | starts with `<`                                                     | | 
					
						
							| 
									
										
										
										
											2017-07-26 08:35:28 +00:00
										 |  |  | | RTF    | starts with `{\rt`                                                  | | 
					
						
							| 
									
										
										
										
											2017-04-03 06:02:02 +00:00
										 |  |  | | DSV    | starts with `/sep=.$/`, separator is the specified character        | | 
					
						
							| 
									
										
										
										
											2017-08-18 18:10:18 +00:00
										 |  |  | | CSV    | more unquoted `","` characters than `"\t"` chars in the first 1024  | | 
					
						
							| 
									
										
										
										
											2017-04-03 06:02:02 +00:00
										 |  |  | | TSV    | one of the first 1024 characters is a tab char `"\t"`               | | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | | PRN    | (default)                                                           | | 
					
						
							| 
									
										
										
										
											2017-06-08 06:19:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-26 08:35:28 +00:00
										 |  |  | - HTML tags include: `html`, `table`, `head`, `meta`, `script`, `style`, `div` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Why are random text files valid?</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Excel is extremely aggressive in reading files.  Adding an XLS extension to any | 
					
						
							|  |  |  | display text file  (where the only characters are ANSI display chars) tricks | 
					
						
							|  |  |  | Excel into thinking that the file is potentially a CSV or TSV file, even if it | 
					
						
							|  |  |  | is only one column!  This library attempts to replicate that behavior. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The best approach is to validate the desired worksheet and ensure it has the | 
					
						
							|  |  |  | expected number of rows or columns.  Extracting the range is extremely simple: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var range = XLSX.utils.decode_range(worksheet['!ref']); | 
					
						
							|  |  |  | var ncols = range.e.c - range.r.c + 1, nrows = range.e.r - range.s.r + 1; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | ## Writing Options
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The exported `write` and `writeFile` functions accept an options argument: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-10 19:23:01 +00:00
										 |  |  | | Option Name |  Default | Description                                         | | 
					
						
							|  |  |  | | :---------- | -------: | :-------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`type`       |          | Output data encoding (see Output Type below)        | | 
					
						
							|  |  |  | |`cellDates`  |  `false` | Store dates as type `d` (default is `n`)            | | 
					
						
							|  |  |  | |`bookSST`    |  `false` | Generate Shared String Table **                     | | 
					
						
							|  |  |  | |`bookType`   | `"xlsx"` | Type of Workbook (see below for supported formats)  | | 
					
						
							|  |  |  | |`sheet`      |     `""` | Name of Worksheet for single-sheet formats **       | | 
					
						
							|  |  |  | |`compression`|  `false` | Use ZIP compression for ZIP-based formats **        | | 
					
						
							|  |  |  | |`Props`      |          | Override workbook properties when writing **        | | 
					
						
							|  |  |  | |`themeXLSX`  |          | Override theme XML when writing XLSX/XLSB/XLSM **   | | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | - `bookSST` is slower and more memory intensive, but has better compatibility | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  |   with older versions of iOS Numbers | 
					
						
							| 
									
										
										
										
											2017-03-27 21:35:15 +00:00
										 |  |  | - The raw data is the only thing guaranteed to be saved.  Features not described | 
					
						
							|  |  |  |   in this README may not be serialized. | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | - `cellDates` only applies to XLSX output and is not guaranteed to work with | 
					
						
							|  |  |  |   third-party readers.  Excel itself does not usually write cells with type `d` | 
					
						
							| 
									
										
										
										
											2017-08-01 05:50:53 +00:00
										 |  |  |   so non-Excel tools may ignore the data or error in the presence of dates. | 
					
						
							| 
									
										
										
										
											2017-04-10 05:10:54 +00:00
										 |  |  | - `Props` is an object mirroring the workbook `Props` field.  See the table from | 
					
						
							|  |  |  |   the [Workbook File Properties](#workbook-file-properties) section. | 
					
						
							| 
									
										
										
										
											2017-04-17 02:08:23 +00:00
										 |  |  | - if specified, the string from `themeXLSX` will be saved as the primary theme | 
					
						
							|  |  |  |   for XLSX/XLSB/XLSM files (to `xl/theme/theme1.xml` in the ZIP) | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Supported Output Formats
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For broad compatibility with third-party tools, this library supports many | 
					
						
							|  |  |  | output formats.  The specific file type is controlled with `bookType` option: | 
					
						
							| 
									
										
										
										
											2017-02-10 19:23:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `bookType` | file ext | container | sheets | Description                     | | 
					
						
							|  |  |  | | :--------- | -------: | :-------: | :----- |:------------------------------- | | 
					
						
							|  |  |  | | `xlsx`     | `.xlsx`  |    ZIP    | multi  | Excel 2007+ XML Format          | | 
					
						
							|  |  |  | | `xlsm`     | `.xlsm`  |    ZIP    | multi  | Excel 2007+ Macro XML Format    | | 
					
						
							|  |  |  | | `xlsb`     | `.xlsb`  |    ZIP    | multi  | Excel 2007+ Binary Format       | | 
					
						
							|  |  |  | | `biff8`    | `.xls`   |    CFB    | multi  | Excel 97-2004 Workbook Format   | | 
					
						
							|  |  |  | | `biff2`    | `.xls`   |   none    | single | Excel 2.0 Worksheet Format      | | 
					
						
							|  |  |  | | `xlml`     | `.xls`   |   none    | multi  | Excel 2003-2004 (SpreadsheetML) | | 
					
						
							|  |  |  | | `ods`      | `.ods`   |    ZIP    | multi  | OpenDocument Spreadsheet        | | 
					
						
							|  |  |  | | `fods`     | `.fods`  |   none    | multi  | Flat OpenDocument Spreadsheet   | | 
					
						
							|  |  |  | | `csv`      | `.csv`   |   none    | single | Comma Separated Values          | | 
					
						
							|  |  |  | | `txt`      | `.txt`   |   none    | single | UTF-16 Unicode Text (TXT)       | | 
					
						
							|  |  |  | | `sylk`     | `.sylk`  |   none    | single | Symbolic Link (SYLK)            | | 
					
						
							|  |  |  | | `html`     | `.html`  |   none    | single | HTML Document                   | | 
					
						
							|  |  |  | | `dif`      | `.dif`   |   none    | single | Data Interchange Format (DIF)   | | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  | | `rtf`      | `.rtf`   |   none    | single | Rich Text Format                | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `prn`      | `.prn`   |   none    | single | Lotus Formatted Text            | | 
					
						
							| 
									
										
										
										
											2017-02-10 19:23:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | - `compression` only applies to formats with ZIP containers. | 
					
						
							|  |  |  | - Formats that only support a single sheet require a `sheet` option specifying | 
					
						
							|  |  |  |   the worksheet.  If the string is empty, the first worksheet is used. | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | - `writeFile` will automatically guess the output file format based on the file | 
					
						
							|  |  |  |   extension if `bookType` is not specified.  It will choose the first format in | 
					
						
							|  |  |  |   the aforementioned table that matches the extension. | 
					
						
							| 
									
										
										
										
											2017-02-10 19:23:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Output Type
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `type` argument for `write` mirrors the `type` argument for `read`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | `type`     | output                                                          | | 
					
						
							|  |  |  | |------------|-----------------------------------------------------------------| | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `"base64"` | string: Base64 encoding of the file                             | | 
					
						
							|  |  |  | | `"binary"` | string: binary string (byte `n` is `data.charCodeAt(n)`)        | | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | | `"string"` | string: JS string (characters interpreted as UTF8)              | | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | | `"buffer"` | nodejs Buffer                                                   | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `"file"`   | string: path of file that will be created (nodejs only)         | | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | ## Utility Functions
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `sheet_to_*` functions accept a worksheet and an optional options object. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | The `*_to_sheet` functions accept a data object and an optional options object. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | The examples are based on the following worksheet: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | XXX| A | B | C | D | E | F | G | | 
					
						
							|  |  |  | ---+---+---+---+---+---+---+---+ | 
					
						
							|  |  |  |  1 | S | h | e | e | t | J | S | | 
					
						
							|  |  |  |  2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | 
					
						
							|  |  |  |  3 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | ### Array of Arrays Input
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.utils.aoa_to_sheet` takes an array of arrays of JS values and returns a | 
					
						
							|  |  |  | worksheet resembling the input data.  Numbers, Booleans and Strings are stored | 
					
						
							|  |  |  | as the corresponding styles.  Dates are stored as date or numbers.  Array holes | 
					
						
							|  |  |  | and explicit `undefined` values are skipped.  `null` values may be stubbed. All | 
					
						
							|  |  |  | other values are stored as strings.  The function takes an options argument: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Option Name |  Default | Description                                         | | 
					
						
							|  |  |  | | :---------- | :------: | :-------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`dateNF`     |  FMT 14  | Use specified date format in string output          | | 
					
						
							|  |  |  | |`cellDates`  |  false   | Store dates as type `d` (default is `n`)            | | 
					
						
							|  |  |  | |`sheetStubs` |  false   | Create cell objects of type `z` for `null` values   | | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | To generate the example sheet: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var ws = XLSX.utils.aoa_to_sheet([ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   "SheetJS".split(""), | 
					
						
							|  |  |  |   [1,2,3,4,5,6,7], | 
					
						
							|  |  |  |   [2,3,4,5,6,7,8] | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | ]); | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  | ### Array of Objects Input
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.utils.json_to_sheet` takes an array of objects and returns a worksheet | 
					
						
							| 
									
										
										
										
											2017-08-08 20:31:17 +00:00
										 |  |  | with automatically-generated "headers" based on the keys of the objects.  The | 
					
						
							|  |  |  | default column order is determined by the first appearance of the field using | 
					
						
							|  |  |  | `Object.keys`, but can be overridden using the options argument: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Option Name |  Default | Description                                         | | 
					
						
							|  |  |  | | :---------- | :------: | :-------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`header`     |          | Use specified column order (default `Object.keys`)  | | 
					
						
							|  |  |  | |`dateNF`     |  FMT 14  | Use specified date format in string output          | | 
					
						
							|  |  |  | |`cellDates`  |  false   | Store dates as type `d` (default is `n`)            | | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The original sheet cannot be reproduced because JS object keys must be unique. | 
					
						
							|  |  |  | After replacing the second `e` and `S` with `e_1` and `S_1`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var ws = XLSX.utils.json_to_sheet([ | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   {S:1,h:2,e:3,e_1:4,t:5,J:6,S_1:7}, | 
					
						
							|  |  |  |   {S:2,h:3,e:4,e_1:5,t:6,J:7,S_1:8} | 
					
						
							| 
									
										
										
										
											2017-08-08 20:31:17 +00:00
										 |  |  | ], {header:["S","h","e","e_1","t","J","S_1"]}); | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  | ### HTML Table Input
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.utils.table_to_sheet` takes a table DOM element and returns a worksheet | 
					
						
							|  |  |  | resembling the input table.  Numbers are parsed.  All other data will be stored | 
					
						
							|  |  |  | as strings. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.utils.table_to_book` produces a minimal workbook based on the worksheet. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-09 22:38:23 +00:00
										 |  |  | Both functions accept options arguments: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Option Name |  Default | Description                                         | | 
					
						
							|  |  |  | | :---------- | :------: | :-------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`dateNF`     |  FMT 14  | Use specified date format in string output          | | 
					
						
							|  |  |  | |`cellDates`  |  false   | Store dates as type `d` (default is `n`)            | | 
					
						
							|  |  |  | |`raw`        |          | If true, every cell will hold raw strings           | | 
					
						
							| 
									
										
										
										
											2017-08-09 22:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  | To generate the example sheet, start with the HTML table: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```html | 
					
						
							|  |  |  | <table id="sheetjs"> | 
					
						
							|  |  |  | <tr><td>S</td><td>h</td><td>e</td><td>e</td><td>t</td><td>J</td><td>S</td></tr> | 
					
						
							|  |  |  | <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr> | 
					
						
							|  |  |  | <tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr> | 
					
						
							|  |  |  | </table> | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To process the table: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var tbl = document.getElementById('sheetjs'); | 
					
						
							|  |  |  | var wb = XLSX.utils.table_to_book(tbl); | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-29 19:14:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Note: `XLSX.read` can handle HTML represented as strings. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | ### Formulae Output
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.utils.sheet_to_formulae` generates an array of commands that represent | 
					
						
							|  |  |  | how a person would enter data into an application.  Each entry is of the form | 
					
						
							|  |  |  | `A1-cell-address=formula-or-value`.  String literals are prefixed with a `'` in | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | accordance with Excel. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | For the example sheet: | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | > var o = XLSX.utils.sheet_to_formulae(ws);
 | 
					
						
							|  |  |  | > o.filter(function(v, i) { return i % 5 === 0; });
 | 
					
						
							|  |  |  | [ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ] | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | ### Delimiter-Separated Output
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | As an alternative to the `writeFile` CSV type, `XLSX.utils.sheet_to_csv` also | 
					
						
							|  |  |  | produces CSV output.  The function takes an options argument: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Option Name |  Default | Description                                         | | 
					
						
							|  |  |  | | :---------- | :------: | :-------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`FS`         |  `","`   | "Field Separator"  delimiter between fields         | | 
					
						
							|  |  |  | |`RS`         |  `"\n"`  | "Record Separator" delimiter between rows           | | 
					
						
							|  |  |  | |`dateNF`     |  FMT 14  | Use specified date format in string output          | | 
					
						
							|  |  |  | |`strip`      |  false   | Remove trailing field separators in each record **  | | 
					
						
							|  |  |  | |`blankrows`  |  true    | Include blank lines in the CSV output               | | 
					
						
							|  |  |  | |`skipHidden` |  false   | Skips hidden rows/columns in the CSV output         | | 
					
						
							| 
									
										
										
										
											2017-03-22 07:50:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | - `strip` will remove trailing commas from each line under default `FS/RS` | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | - `blankrows` must be set to `false` to skip blank lines. | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | For the example sheet: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | > console.log(XLSX.utils.sheet_to_csv(ws));
 | 
					
						
							|  |  |  | S,h,e,e,t,J,S | 
					
						
							|  |  |  | 1,2,3,4,5,6,7 | 
					
						
							|  |  |  | 2,3,4,5,6,7,8 | 
					
						
							|  |  |  | > console.log(XLSX.utils.sheet_to_csv(ws, {FS:"\t"}));
 | 
					
						
							|  |  |  | S	h	e	e	t	J	S | 
					
						
							|  |  |  | 1	2	3	4	5	6	7 | 
					
						
							|  |  |  | 2	3	4	5	6	7	8 | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | > console.log(XLSX.utils.sheet_to_csv(ws,{FS:":",RS:"|"}));
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | S:h:e:e:t:J:S|1:2:3:4:5:6:7|2:3:4:5:6:7:8| | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | #### UTF-16 Unicode Text
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `txt` output type uses the tab character as the field separator.  If the | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | `codepage` library is available (included in full distribution but not core), | 
					
						
							|  |  |  | the output will be encoded in `CP1200` and the BOM will be prepended. | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | ### HTML Output
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | As an alternative to the `writeFile` HTML type, `XLSX.utils.sheet_to_html` also | 
					
						
							|  |  |  | produces HTML output.  The function takes an options argument: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Option Name |  Default | Description                                         | | 
					
						
							|  |  |  | | :---------- | :------: | :-------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`editable`   |  false   | If true, set `contenteditable="true"` for every TD  | | 
					
						
							|  |  |  | |`header`     |          | Override header (default `html body`)               | | 
					
						
							|  |  |  | |`footer`     |          | Override footer (default `/body /html`)             | | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | For the example sheet: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | > console.log(XLSX.utils.sheet_to_html(ws));
 | 
					
						
							|  |  |  | // ... | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | ### JSON
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | `XLSX.utils.sheet_to_json` generates different types of JS objects. The function | 
					
						
							|  |  |  | takes an options argument: | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | | Option Name |  Default | Description                                         | | 
					
						
							|  |  |  | | :---------- | :------: | :-------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | |`raw`        | `false`  | Use raw values (true) or formatted strings (false)  | | 
					
						
							|  |  |  | |`range`      | from WS  | Override Range (see table below)                    | | 
					
						
							|  |  |  | |`header`     |          | Control output format (see table below)             | | 
					
						
							|  |  |  | |`dateNF`     |  FMT 14  | Use specified date format in string output          | | 
					
						
							|  |  |  | |`defval`     |          | Use specified value in place of null or undefined   | | 
					
						
							|  |  |  | |`blankrows`  |    **    | Include blank lines in the output **                | | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | - `raw` only affects cells which have a format code (`.z`) field or a formatted | 
					
						
							|  |  |  |   text (`.w`) field. | 
					
						
							|  |  |  | - If `header` is specified, the first row is considered a data row; if `header` | 
					
						
							|  |  |  |   is not specified, the first row is the header row and not considered data. | 
					
						
							|  |  |  | - When `header` is not specified, the conversion will automatically disambiguate | 
					
						
							|  |  |  |   header entries by affixing `_` and a count starting at `1`.  For example, if | 
					
						
							|  |  |  |   three columns have header `foo` the output fields are `foo`, `foo_1`, `foo_2` | 
					
						
							| 
									
										
										
										
											2017-03-23 05:54:27 +00:00
										 |  |  | - `null` values are returned when `raw` is true but are skipped when false. | 
					
						
							|  |  |  | - If `defval` is not specified, null and undefined values are skipped normally. | 
					
						
							|  |  |  |   If specified, all null and undefined points will be filled with `defval` | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | - When `header` is `1`, the default is to generate blank rows.  `blankrows` must | 
					
						
							|  |  |  |   be set to `false` to skip blank rows. | 
					
						
							|  |  |  | - When `header` is not `1`, the default is to skip blank rows.  `blankrows` must | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   be true to generate blank rows | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | `range` is expected to be one of: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | `range`          | Description                                               | | 
					
						
							|  |  |  | | :--------------- | :-------------------------------------------------------- | | 
					
						
							|  |  |  | | (number)         | Use worksheet range but set starting row to the value     | | 
					
						
							|  |  |  | | (string)         | Use specified range (A1-style bounded range string)       | | 
					
						
							|  |  |  | | (default)        | Use worksheet range (`ws['!ref']`)                        | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `header` is expected to be one of: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | `header`         | Description                                               | | 
					
						
							|  |  |  | | :--------------- | :-------------------------------------------------------- | | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | | `1`              | Generate an array of arrays ("2D Array")                  | | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | | `"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                   | | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-25 01:36:40 +00:00
										 |  |  | If header is not `1`, the row object will contain the non-enumerable property | 
					
						
							|  |  |  | `__rowNum__` that represents the row of the sheet corresponding to the entry. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Examples</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | For the example sheet: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | > XLSX.utils.sheet_to_json(ws);
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | [ { S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 }, | 
					
						
							|  |  |  |   { S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 } ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | > XLSX.utils.sheet_to_json(ws, {header:"A"});
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | [ { A: 'S', B: 'h', C: 'e', D: 'e', E: 't', F: 'J', G: 'S' }, | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  |   { A: '1', B: '2', C: '3', D: '4', E: '5', F: '6', G: '7' }, | 
					
						
							|  |  |  |   { A: '2', B: '3', C: '4', D: '5', E: '6', F: '7', G: '8' } ] | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | > XLSX.utils.sheet_to_json(ws, {header:["A","E","I","O","U","6","9"]});
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | [ { '6': 'J', '9': 'S', A: 'S', E: 'h', I: 'e', O: 'e', U: 't' }, | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  |   { '6': '6', '9': '7', A: '1', E: '2', I: '3', O: '4', U: '5' }, | 
					
						
							|  |  |  |   { '6': '7', '9': '8', A: '2', E: '3', I: '4', O: '5', U: '6' } ] | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | > XLSX.utils.sheet_to_json(ws, {header:1});
 | 
					
						
							|  |  |  | [ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ], | 
					
						
							|  |  |  |   [ '1', '2', '3', '4', '5', '6', '7' ], | 
					
						
							|  |  |  |   [ '2', '3', '4', '5', '6', '7', '8' ] ] | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example showing the effect of `raw`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | > ws['A2'].w = "3";                          // set A2 formatted string value
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | > XLSX.utils.sheet_to_json(ws, {header:1});
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | [ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ], | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  |   [ '3', '2', '3', '4', '5', '6', '7' ],     // <-- A2 uses the formatted string | 
					
						
							|  |  |  |   [ '2', '3', '4', '5', '6', '7', '8' ] ] | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | > XLSX.utils.sheet_to_json(ws, {header:1, raw:true});
 | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | [ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ], | 
					
						
							|  |  |  |   [ 1, 2, 3, 4, 5, 6, 7 ],                   // <-- A2 uses the raw value | 
					
						
							|  |  |  |   [ 2, 3, 4, 5, 6, 7, 8 ] ] | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-10 23:39:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ## File Formats
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | Despite the library name `xlsx`, it supports numerous spreadsheet file formats: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Format                                                       | Read  | Write | | 
					
						
							|  |  |  | |:-------------------------------------------------------------|:-----:|:-----:| | 
					
						
							|  |  |  | | **Excel Worksheet/Workbook Formats**                         |:-----:|:-----:| | 
					
						
							|  |  |  | | Excel 2007+ XML Formats (XLSX/XLSM)                          |  :o:  |  :o:  | | 
					
						
							|  |  |  | | Excel 2007+ Binary Format (XLSB BIFF12)                      |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-03-14 08:19:51 +00:00
										 |  |  | | Excel 2003-2004 XML Format (XML "SpreadsheetML")             |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-09-22 22:18:51 +00:00
										 |  |  | | Excel 97-2004 (XLS BIFF8)                                    |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | | Excel 5.0/95 (XLS BIFF5)                                     |  :o:  |       | | 
					
						
							|  |  |  | | Excel 4.0 (XLS/XLW BIFF4)                                    |  :o:  |       | | 
					
						
							|  |  |  | | Excel 3.0 (XLS BIFF3)                                        |  :o:  |       | | 
					
						
							|  |  |  | | Excel 2.0/2.1 (XLS BIFF2)                                    |  :o:  |  :o:  | | 
					
						
							|  |  |  | | **Excel Supported Text Formats**                             |:-----:|:-----:| | 
					
						
							| 
									
										
										
										
											2017-04-03 06:02:02 +00:00
										 |  |  | | Delimiter-Separated Values (CSV/TXT)                         |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | | Data Interchange Format (DIF)                                |  :o:  |  :o:  | | 
					
						
							|  |  |  | | Symbolic Link (SYLK/SLK)                                     |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | | Lotus Formatted Text (PRN)                                   |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-04-03 06:02:02 +00:00
										 |  |  | | UTF-16 Unicode Text (TXT)                                    |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | | **Other Workbook/Worksheet Formats**                         |:-----:|:-----:| | 
					
						
							|  |  |  | | OpenDocument Spreadsheet (ODS)                               |  :o:  |  :o:  | | 
					
						
							|  |  |  | | Flat XML ODF Spreadsheet (FODS)                              |  :o:  |  :o:  | | 
					
						
							|  |  |  | | Uniform Office Format Spreadsheet (标文通 UOS1/UOS2)         |  :o:  |       | | 
					
						
							| 
									
										
										
										
											2017-03-28 04:41:01 +00:00
										 |  |  | | dBASE II/III/IV / Visual FoxPro (DBF)                        |  :o:  |       | | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | | Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)                        |  :o:  |       | | 
					
						
							|  |  |  | | Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW)            |  :o:  |       | | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | | **Other Common Spreadsheet Output Formats**                  |:-----:|:-----:| | 
					
						
							| 
									
										
										
										
											2017-04-16 04:32:13 +00:00
										 |  |  | | HTML Tables                                                  |  :o:  |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  | | RTF Tables                                                   |       |  :o:  | | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### Excel 2007+ XML (XLSX/XLSM)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | XLSX and XLSM files are ZIP containers containing a series of XML files in | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | accordance with the Open Packaging Conventions (OPC).  The XLSM format, almost | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | 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 | 
					
						
							|  |  |  | Excel deviates from the specification. | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | BIFF 2/3 XLS are single-sheet streams of binary records.  Excel 4 introduced | 
					
						
							|  |  |  | the concept of a workbook (`XLW` files) but also had single-sheet `XLS` format. | 
					
						
							|  |  |  | The structure is largely similar to the Lotus 1-2-3 file formats.  BIFF5/8/12 | 
					
						
							|  |  |  | extended the format in various ways but largely stuck to the same record format. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | There is no official specification for any of these formats.  Excel 95 can write | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | files in these formats, so record lengths and fields were determined by writing | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | in all of the supported formats and comparing files.  Excel 2016 can generate | 
					
						
							|  |  |  | BIFF5 files, enabling a full suite of file tests starting from XLSX or BIFF2. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Excel 97-2004 Binary (BIFF8)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | BIFF8 exclusively uses the Compound File Binary container format, splitting some | 
					
						
							|  |  |  | content into streams within the file.  At its core, it still uses an extended | 
					
						
							|  |  |  | version of the binary record format from older versions of BIFF. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `MS-XLS` specification covers the basics of the file format, and other | 
					
						
							|  |  |  | specifications expand on serialization of features like properties. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Excel 2003-2004 (SpreadsheetML)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | Predating XLSX, SpreadsheetML files are simple XML files.  There is no official | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | and comprehensive specification, although MS has released documentation on the | 
					
						
							|  |  |  | format.  Since Excel 2016 can generate SpreadsheetML files, mapping features is | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | pretty straightforward. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | ### Excel 2007+ Binary (XLSB, BIFF12)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | Introduced in parallel with XLSX, the XLSB format combines the BIFF architecture | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | with the content separation and ZIP container of XLSX.  For the most part nodes | 
					
						
							|  |  |  | in an XLSX sub-file can be mapped to XLSB records in a corresponding sub-file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `MS-XLSB` specification covers the basics of the file format, and other | 
					
						
							|  |  |  | specifications expand on serialization of features like properties. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | ### Delimiter-Separated Values (CSV/TXT)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | Excel CSV deviates from RFC4180 in a number of important ways.  The generated | 
					
						
							|  |  |  | CSV files should generally work in Excel although they may not work in RFC4180 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | compatible readers.  The parser should generally understand Excel CSV. The | 
					
						
							|  |  |  | writer proactively generates cells for formulae if values are unavailable. | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | Excel TXT uses tab as the delimiter and code page 1200. | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-18 18:10:18 +00:00
										 |  |  | Notes: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - Like in Excel, files starting with `0x49 0x44 ("ID")` are treated as Symbolic | 
					
						
							|  |  |  |   Link files.  Unlike Excel, if the file does not have a valid SYLK header, it | 
					
						
							|  |  |  |   will be proactively reinterpreted as CSV.  There are some files with semicolon | 
					
						
							|  |  |  |   delimiter that align with a valid SYLK file.  For the broadest compatibility, | 
					
						
							|  |  |  |   all cells with the value of `ID` are automatically wrapped in double-quotes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | ### Other Workbook Formats
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | Support for other formats is generally far XLS/XLSB/XLSX support, due in large | 
					
						
							|  |  |  | part to a lack of publicly available documentation.  Test files were produced in | 
					
						
							|  |  |  | the respective apps and compared to their XLS exports to determine structure. | 
					
						
							|  |  |  | The main focus is data extraction. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | #### Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | The Lotus formats consist of binary records similar to the BIFF structure. Lotus | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | did release a specification decades ago covering the original WK1 format.  Other | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | features were deduced by producing files and comparing to Excel support. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | #### Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | The Quattro Pro formats use binary records in the same way as BIFF and Lotus. | 
					
						
							|  |  |  | Some of the newer formats (namely WB3 and QPW) use a CFB enclosure just like | 
					
						
							|  |  |  | BIFF8 XLS. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-04 16:09:41 +00:00
										 |  |  | #### OpenDocument Spreadsheet (ODS/FODS)
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | add undocumented extensions.  The parsers and writers do not implement the full | 
					
						
							|  |  |  | standard, instead focusing on parts necessary to extract and store raw data. | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | #### Uniform Office Spreadsheet (UOS1/2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | UOS is a very similar format, and it comes in 2 varieties corresponding to ODS | 
					
						
							|  |  |  | and FODS respectively.  For the most part, the difference between the formats | 
					
						
							| 
									
										
										
										
											2017-08-01 05:50:53 +00:00
										 |  |  | is in the names of tags and attributes. | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | ### Other Single-Worksheet Formats
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Many older formats supported only one worksheet: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### dBASE and Visual FoxPro (DBF)
 | 
					
						
							| 
									
										
										
										
											2017-03-28 04:41:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-28 04:41:01 +00:00
										 |  |  | DBF is really a typed table format: each column can only hold one data type and | 
					
						
							|  |  |  | each record omits type information.  The parser generates a header row and | 
					
						
							|  |  |  | inserts records starting at the second row of the worksheet. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Multi-file extensions like external memos and tables are currently unsupported, | 
					
						
							|  |  |  | limited by the general ability to read arbitrary files in the web browser. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | #### Symbolic Link (SYLK)
 | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | There is no real documentation.  All knowledge was gathered by saving files in | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | various versions of Excel to deduce the meaning of fields.  Notes: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - Plain formulae are stored in the RC form. | 
					
						
							|  |  |  | - Column widths are rounded to integral characters. | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | #### Lotus Formatted Text (PRN)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | There is no real documentation, and in fact Excel treats PRN as an output-only | 
					
						
							|  |  |  | file format.  Nevertheless we can guess the column widths and reverse-engineer | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | the original layout.  Excel's 240 character width limitation is not enforced. | 
					
						
							| 
									
										
										
										
											2017-04-03 00:16:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | #### Data Interchange Format (DIF)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | There is no unified definition.  Visicalc DIF differs from Lotus DIF, and both | 
					
						
							|  |  |  | differ from Excel DIF.  Where ambiguous, the parser/writer follows the expected | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:03 +00:00
										 |  |  | behavior from Excel.  In particular, Excel extends DIF in incompatible ways: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - Since Excel automatically converts numbers-as-strings to numbers, numeric | 
					
						
							|  |  |  |   string constants are converted to formulae: `"0.3" -> "=""0.3""` | 
					
						
							|  |  |  | - DIF technically expects numeric cells to hold the raw numeric data, but Excel | 
					
						
							|  |  |  |   permits formatted numbers (including dates) | 
					
						
							|  |  |  | - DIF technically has no support for formulae, but Excel will automatically | 
					
						
							|  |  |  |   convert plain formulae.  Array formulae are not preserved. | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-01 07:32:12 +00:00
										 |  |  | #### HTML
 | 
					
						
							| 
									
										
										
										
											2017-03-09 05:24:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-09 05:24:32 +00:00
										 |  |  | Excel HTML worksheets include special metadata encoded in styles.  For example, | 
					
						
							|  |  |  | `mso-number-format` is a localized string containing the number format.  Despite | 
					
						
							|  |  |  | the metadata the output is valid HTML, although it does accept bare `&` symbols. | 
					
						
							| 
									
										
										
										
											2017-02-22 06:57:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  | #### Rich Text Format (RTF)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							|  |  |  |   <summary>(click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Excel RTF worksheets are stored in clipboard when copying cells or ranges from a | 
					
						
							|  |  |  | worksheet.  The supported codes are a subset of the Word RTF support. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | ## Testing
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | ### Node
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | `make test` will run the node-based tests.  By default it runs tests on files in | 
					
						
							|  |  |  | every supported format.  To test a specific file type, set `FMTS` to the format | 
					
						
							| 
									
										
										
										
											2017-09-04 03:55:10 +00:00
										 |  |  | you want to test.  Feature-specific tests are available with `make test_misc` | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | $ make test_misc   # run core tests | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | $ make test        # run full tests | 
					
						
							|  |  |  | $ make test_xls    # only use the XLS test files | 
					
						
							|  |  |  | $ make test_xlsx   # only use the XLSX test files | 
					
						
							|  |  |  | $ make test_xlsb   # only use the XLSB test files | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | $ make test_xml    # only use the XML test files | 
					
						
							|  |  |  | $ make test_ods    # only use the ODS test files | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To enable all errors, set the environment variable `WTF=1`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | $ make test        # run full tests | 
					
						
							|  |  |  | $ WTF=1 make test  # enable all error messages | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | `flow` and `eslint` checks are available: | 
					
						
							| 
									
										
										
										
											2017-03-12 18:02:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | $ make lint        # eslint checks | 
					
						
							| 
									
										
										
										
											2017-03-12 18:02:43 +00:00
										 |  |  | $ make flow        # make lint + Flow checking | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | $ make tslint      # check TS definitions | 
					
						
							| 
									
										
										
										
											2017-03-12 18:02:43 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | ### Browser
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | The core in-browser tests are available at `tests/index.html` within this repo. | 
					
						
							| 
									
										
										
										
											2017-03-20 21:42:12 +00:00
										 |  |  | Start a local server and navigate to that directory to run the tests. | 
					
						
							| 
									
										
										
										
											2017-04-13 17:05:42 +00:00
										 |  |  | `make ctestserv` will start a server on port 8000. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `make ctest` will generate the browser fixtures.  To add more files, edit the | 
					
						
							|  |  |  | `tests/fixtures.lst` file and add the paths. | 
					
						
							| 
									
										
										
										
											2017-03-20 21:42:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | To run the full in-browser tests, clone the repo for | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | [`oss.sheetjs.com`](https://github.com/SheetJS/SheetJS.github.io) and replace | 
					
						
							|  |  |  | the `xlsx.js` file (then open a browser window and go to `stress.html`): | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```bash | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | $ cp xlsx.js ../SheetJS.github.io | 
					
						
							|  |  |  | $ cd ../SheetJS.github.io | 
					
						
							|  |  |  | $ simplehttpserver # or "python -mSimpleHTTPServer" or "serve" | 
					
						
							|  |  |  | $ open -a Chromium.app http://localhost:8000/stress.html | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | ### Tested Environments
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |  - NodeJS `0.8`, `0.10`, `0.12`, `4.x`, `5.x`, `6.x`, `7.x`, `8.x` | 
					
						
							|  |  |  |  - IE 6/7/8/9/10/11 (IE 6-9 require shims) | 
					
						
							|  |  |  |  - Chrome 24+ (including Android 4.0+) | 
					
						
							|  |  |  |  - Safari 6+ (iOS and Desktop) | 
					
						
							|  |  |  |  - Edge 13+, FF 18+, and Opera 12+ | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Tests utilize the mocha testing framework.  Travis-CI and Sauce Labs links: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  - <https://travis-ci.org/SheetJS/js-xlsx> for XLSX module in nodejs | 
					
						
							| 
									
										
										
										
											2017-03-19 23:04:31 +00:00
										 |  |  |  - <https://semaphoreci.com/sheetjs/js-xlsx> for XLSX module in nodejs | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  |  - <https://travis-ci.org/SheetJS/SheetJS.github.io> for XLS\* modules | 
					
						
							|  |  |  |  - <https://saucelabs.com/u/sheetjs> for XLS\* modules using Sauce Labs | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | The Travis-CI test suite also includes tests for various time zones.  To change | 
					
						
							|  |  |  | the timezone locally, set the TZ environment variable: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | $ env TZ="Asia/Kolkata" WTF=1 make test_misc | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 18:07:57 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | ### Test Files
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Test files are housed in [another repo](https://github.com/SheetJS/test_files). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Running `make init` will refresh the `test_files` submodule and get the files. | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | Note that this requires `svn`, `git`, `hg` and other commands that may not be | 
					
						
							|  |  |  | available.  If `make init` fails, please download the latest version of the test | 
					
						
							|  |  |  | files snapshot from [the repo](https://github.com/SheetJS/test_files/releases) | 
					
						
							| 
									
										
										
										
											2017-03-13 06:46:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>Latest Snapshot</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | Latest test files snapshot: | 
					
						
							|  |  |  | <http://github.com/SheetJS/test_files/releases/download/20170409/test_files.zip> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (download and unzip to the `test_files` subdirectory) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | ## Contributing
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  | Due to the precarious nature of the Open Specifications Promise, it is very | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | important to ensure code is cleanroom.  [Contribution Notes](CONTRIBUTING.md) | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>File organization</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | At a high level, the final script is a concatenation of the individual files in | 
					
						
							|  |  |  | the `bits` folder.  Running `make` should reproduce the final output on all | 
					
						
							|  |  |  | platforms.  The README is similarly split into bits in the `docbits` folder. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Folders: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | folder       | contents                                                      | | 
					
						
							|  |  |  | |:-------------|:--------------------------------------------------------------| | 
					
						
							|  |  |  | | `bits`       | raw source files that make up the final script                | | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | | `docbits`    | raw markdown files that make up `README.md`                   | | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | | `bin`        | server-side bin scripts (`xlsx.njs`)                          | | 
					
						
							|  |  |  | | `dist`       | dist files for web browsers and nonstandard JS environments   | | 
					
						
							|  |  |  | | `demos`      | demo projects for platforms like ExtendScript and Webpack     | | 
					
						
							|  |  |  | | `tests`      | browser tests (run `make ctest` to rebuild)                   | | 
					
						
							|  |  |  | | `types`      | typescript definitions and tests                              | | 
					
						
							|  |  |  | | `misc`       | miscellaneous supporting scripts                              | | 
					
						
							|  |  |  | | `test_files` | test files (pulled from the test files repository)            | | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-28 07:28:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | After cloning the repo, running `make help` will display a list of commands. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  | ### OSX/Linux
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | The `xlsx.js` file is constructed from the files in the `bits` subdirectory. The | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | build script (run `make`) will concatenate the individual bits to produce the | 
					
						
							|  |  |  | script.  Before submitting a contribution, ensure that running make will produce | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | the `xlsx.js` file exactly.  The simplest way to test is to add the script: | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 08:20:45 +00:00
										 |  |  | ```bash | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | $ git add xlsx.js | 
					
						
							|  |  |  | $ make clean | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | $ make | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | $ git diff xlsx.js | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | To produce the dist files, run `make dist`.  The dist files are updated in each | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | version release and *should not be committed between versions*. | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-10 17:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  | ### Windows
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  | The included `make.cmd` script will build `xlsx.js` from the `bits` directory. | 
					
						
							|  |  |  | Building is as simple as: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```cmd | 
					
						
							| 
									
										
										
										
											2017-04-24 10:39:00 +00:00
										 |  |  | > make
 | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | To prepare development environment: | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```cmd | 
					
						
							| 
									
										
										
										
											2017-04-24 10:39:00 +00:00
										 |  |  | > make init
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The full list of commands available in Windows are displayed in `make help`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | make init -- install deps and global modules | 
					
						
							|  |  |  | make lint -- run eslint linter | 
					
						
							|  |  |  | make test -- run mocha test suite | 
					
						
							|  |  |  | make misc -- run smaller test suite | 
					
						
							|  |  |  | make book -- rebuild README and summary | 
					
						
							|  |  |  | make help -- display this message | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-09 07:11:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | ### Tests
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary>(click to show)</summary> | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | The `test_misc` target (`make test_misc` on Linux/OSX / `make misc` on Windows) | 
					
						
							|  |  |  | runs the targeted feature tests.  It should take 5-10 seconds to perform feature | 
					
						
							|  |  |  | tests without testing against the entire test battery.  New features should be | 
					
						
							|  |  |  | accompanied with tests for the relevant file formats and features. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For tests involving the read side, an appropriate feature test would involve | 
					
						
							|  |  |  | reading an existing file and checking the resulting workbook object.  If a | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | parameter is involved, files should be read with different values to verify that | 
					
						
							|  |  |  | the feature is working as expected. | 
					
						
							| 
									
										
										
										
											2017-05-16 17:45:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | For tests involving a new write feature which can already be parsed, appropriate | 
					
						
							|  |  |  | feature tests would involve writing a workbook with the feature and then opening | 
					
						
							|  |  |  | and verifying that the feature is preserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For tests involving a new write feature without an existing read ability, please | 
					
						
							|  |  |  | add a feature test to the kitchen sink `tests/write.js`. | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-04-10 05:10:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | ## License
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  | Please consult the attached LICENSE file for details.  All rights not explicitly | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | granted by the Apache 2.0 License are reserved by the Original Author. | 
					
						
							| 
									
										
										
										
											2013-10-30 19:26:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## References
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>OSP-covered Specifications</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  - `MS-CFB`: Compound File Binary File Format | 
					
						
							|  |  |  |  - `MS-CTXLS`: Excel Custom Toolbar Binary File Format | 
					
						
							|  |  |  |  - `MS-EXSPXML3`: Excel Calculation Version 2 Web Service XML Schema | 
					
						
							|  |  |  |  - `MS-ODATA`: Open Data Protocol (OData) | 
					
						
							|  |  |  |  - `MS-ODRAW`: Office Drawing Binary File Format | 
					
						
							|  |  |  |  - `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-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 | 
					
						
							|  |  |  |  - `MS-OSHARED`: Office Common Data Types and Objects Structures | 
					
						
							|  |  |  |  - `MS-OVBA`: Office VBA File Format Structure | 
					
						
							|  |  |  |  - `MS-XLDM`: Spreadsheet Data Model File Format | 
					
						
							|  |  |  |  - `MS-XLS`: Excel Binary File Format (.xls) Structure Specification | 
					
						
							|  |  |  |  - `MS-XLSB`: Excel (.xlsb) Binary File Format | 
					
						
							|  |  |  |  - `MS-XLSX`: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format | 
					
						
							|  |  |  |  - `XLS`: Microsoft Office Excel 97-2007 Binary File Format Specification | 
					
						
							| 
									
										
										
										
											2017-10-02 08:15:36 +00:00
										 |  |  |  - `RTF`: Rich Text Format | 
					
						
							| 
									
										
										
										
											2013-10-30 19:26:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2014-10-10 02:22:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | - 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.2 (29 September 2011) | 
					
						
							|  |  |  | - Worksheet File Format (From Lotus) December 1984 |