| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | # xlsx
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | Parser and writer for Excel 2007+ (XLSX/XLSM/XLSB) files and parser for ODS. | 
					
						
							|  |  |  | Pure-JS cleanroom implementation from the Office Open XML spec, [MS-XLSB], ODF | 
					
						
							|  |  |  | specifications and related documents. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Demo: <http://oss.sheetjs.com/js-xlsx> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Source: <http://git.io/xlsx> | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Installation
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | In [nodejs](https://www.npmjs.org/package/xlsx): | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     npm install xlsx | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In the browser: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  |     <script lang="javascript" src="dist/xlsx.core.min.js"></script> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  | In [bower](http://bower.io/search/?q=js-xlsx): | 
					
						
							| 
									
										
										
										
											2014-04-23 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bower install js-xlsx | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CDNjs automatically pulls the latest version and makes all versions available at | 
					
						
							|  |  |  | <http://cdnjs.com/libraries/xlsx> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Optional Modules
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | The nodejs 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
										 |  |  | 
 | 
					
						
							|  |  |  |     <!-- international support from https://github.com/sheetjs/js-codepage --> | 
					
						
							|  |  |  |     <script src="dist/cpexcel.js"></script> | 
					
						
							| 
									
										
										
										
											2014-10-10 02:22:38 +00:00
										 |  |  |     <!-- ODS support --> | 
					
						
							|  |  |  |     <script src="dist/ods.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` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | ## ECMAScript 5 Compatibility
 | 
					
						
							| 
									
										
										
										
											2014-06-03 18:39:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Since xlsx.js uses ES5 functions like `Array#forEach`, older browsers require | 
					
						
							|  |  |  | [Polyfills](http://git.io/QVh77g).  This repo and the gh-pages branch include | 
					
						
							|  |  |  | [a shim](https://github.com/SheetJS/js-xlsx/blob/master/shim.js) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To use the shim, add the shim before the script tag that loads xlsx.js: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <script type="text/javascript" src="/path/to/shim.js"></script> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | - nodejs readFile: | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | - ajax (for a more complete example that works in older browsers, check the demo | 
					
						
							|  |  |  |   at <http://oss.sheetjs.com/js-xlsx/ajax.html>): | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | /* set up XMLHttpRequest */ | 
					
						
							|  |  |  | var url = "test_files/formula_stress_test_ajax.xlsx"; | 
					
						
							|  |  |  | var oReq = new XMLHttpRequest(); | 
					
						
							|  |  |  | oReq.open("GET", url, true); | 
					
						
							|  |  |  | oReq.responseType = "arraybuffer"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | oReq.onload = function(e) { | 
					
						
							|  |  |  |   var arraybuffer = oReq.response; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* convert data to binary string */ | 
					
						
							|  |  |  |   var data = new Uint8Array(arraybuffer); | 
					
						
							|  |  |  |   var arr = new Array(); | 
					
						
							|  |  |  |   for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); | 
					
						
							|  |  |  |   var bstr = arr.join(""); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Call XLSX */ | 
					
						
							|  |  |  |   var workbook = XLSX.read(bstr, {type:"binary"}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | oReq.send(); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | - HTML5 drag-and-drop using readAsBinaryString: | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | /* set up drag-and-drop event */ | 
					
						
							|  |  |  | function handleDrop(e) { | 
					
						
							|  |  |  |   e.stopPropagation(); | 
					
						
							|  |  |  |   e.preventDefault(); | 
					
						
							|  |  |  |   var files = e.dataTransfer.files; | 
					
						
							|  |  |  |   var i,f; | 
					
						
							|  |  |  |   for (i = 0, f = files[i]; i != files.length; ++i) { | 
					
						
							|  |  |  |     var reader = new FileReader(); | 
					
						
							|  |  |  |     var name = f.name; | 
					
						
							|  |  |  |     reader.onload = function(e) { | 
					
						
							|  |  |  |       var data = e.target.result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /* if binary string, read with type 'binary' */ | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  |       var workbook = XLSX.read(data, {type: 'binary'}); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     reader.readAsBinaryString(f); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | drop_dom_element.addEventListener('drop', handleDrop, false); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | - HTML5 input file element using readAsBinaryString: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | function handleFile(e) { | 
					
						
							|  |  |  |   var files = e.target.files; | 
					
						
							|  |  |  |   var i,f; | 
					
						
							|  |  |  |   for (i = 0, f = files[i]; i != files.length; ++i) { | 
					
						
							|  |  |  |     var reader = new FileReader(); | 
					
						
							|  |  |  |     var name = f.name; | 
					
						
							|  |  |  |     reader.onload = function(e) { | 
					
						
							|  |  |  |       var data = e.target.result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var workbook = XLSX.read(data, {type: 'binary'}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /* DO SOMETHING WITH workbook HERE */ | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     reader.readAsBinaryString(f); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | input_dom_element.addEventListener('change', handleFile, false); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | ## Working with the Workbook
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | This example walks through every cell of every sheet and dumps the values: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | var sheet_name_list = workbook.SheetNames; | 
					
						
							|  |  |  | sheet_name_list.forEach(function(y) { | 
					
						
							|  |  |  |   var worksheet = workbook.Sheets[y]; | 
					
						
							|  |  |  |   for (z in worksheet) { | 
					
						
							|  |  |  |     if(z[0] === '!') continue; | 
					
						
							|  |  |  |     console.log(y + "!" + z + "=" + JSON.stringify(worksheet[z].v)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | Complete examples: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - <http://oss.sheetjs.com/js-xlsx/> HTML5 File API / Base64 Text / Web Workers | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  | Note that older versions of IE does not support HTML5 File API, so the base64 | 
					
						
							|  |  |  | mode is provided for testing.  On OSX you can get the base64 encoding with: | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  |     $ <target_file.xlsx base64 | pbcopy | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - <http://oss.sheetjs.com/js-xlsx/ajax.html> XMLHttpRequest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - <https://github.com/SheetJS/js-xlsx/blob/master/bin/xlsx.njs> nodejs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The nodejs version installs a binary `xlsx` which can read XLSX/XLSM/XLSB | 
					
						
							|  |  |  | 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 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | - nodejs write to file: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | /* output format determined by filename */ | 
					
						
							|  |  |  | XLSX.writeFile(workbook, 'out.xlsx'); | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | /* at this point, out.xlsx is a file that you can distribute */ | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | - write to binary string (using FileSaver.js): | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | /* bookType can be 'xlsx' or 'xlsm' or 'xlsb' */ | 
					
						
							| 
									
										
										
										
											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 */ | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | saveAs(new Blob([s2ab(wbout)],{type:""}), "test.xlsx") | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Complete examples: | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | - <http://sheetjs.com/demos/writexlsx.html> generates a simple file | 
					
						
							|  |  |  | - <http://git.io/WEK88Q> writing an array of arrays in nodejs | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | - <http://sheetjs.com/demos/table.html> exporting an HTML table | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | ## Interface
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | `XLSX` is the exposed variable in the browser and the exported nodejs 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | ### Utilities
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Utilities are available in the `XLSX.utils` object: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Exporting: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `sheet_to_json` converts a workbook object to an array of JSON objects. | 
					
						
							|  |  |  | - `sheet_to_csv` generates delimiter-separated-values output | 
					
						
							|  |  |  | - `sheet_to_formulae` generates a list of the formulae (with value fallbacks) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Cell and cell address manipulation: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `format_cell` generates the text value for a cell (using number formats) | 
					
						
							|  |  |  | - `{en,de}code_{row,col}` convert between 0-indexed rows/cols and A1 forms. | 
					
						
							|  |  |  | - `{en,de}code_cell` converts cell addresses | 
					
						
							|  |  |  | - `{en,de}code_range` converts cell ranges | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Workbook / Worksheet / Cell Object Description
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | range `A3:B7` is represented by the object `{s:{c:0, r:2}, e:{c:1, r:6}}`. Utils | 
					
						
							|  |  |  | use the following pattern to walk each of the cells in a range: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 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}; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Cell Object
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Key | Description | | 
					
						
							|  |  |  | | --- | ----------- | | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | | `v` | raw value (see Data Types section for more info) | | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | | `w` | formatted text (if applicable) | | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | | `t` | cell type: `b` Boolean, `n` Number, `e` error, `s` String, `d` Date | | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | | `f` | cell 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) | | 
					
						
							|  |  |  | | `l` | cell hyperlink object (.Target holds link, .tooltip is tooltip) | | 
					
						
							|  |  |  | | `s` | the style/theme of the cell (if applicable) | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | ### Data Types
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The raw value is stored in the `v` field, interpreted based on the `t` field. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Type `b` is the Boolean type.  `v` is interpreted according to JS truth tables | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Type `e` is the Error type. `v` holds the number and `w` holds the common name: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Value | Error Meaning | | 
					
						
							|  |  |  | | ----: | :------------ | | 
					
						
							|  |  |  | |  0x00 | #NULL!        | | 
					
						
							|  |  |  | |  0x07 | #DIV/0!       | | 
					
						
							|  |  |  | |  0x0F | #VALUE!       | | 
					
						
							|  |  |  | |  0x17 | #REF!         | | 
					
						
							|  |  |  | |  0x1D | #NAME?        | | 
					
						
							|  |  |  | |  0x24 | #NUM!         | | 
					
						
							|  |  |  | |  0x2A | #N/A          | | 
					
						
							|  |  |  | |  0x2B | #GETTING_DATA | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  | `v` field holds the raw number.  The `w` field holds formatted text. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  | JS Date objects.  Note that Excel disregards the timezone modifier and treats all | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | ### Worksheet Object
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | `worksheet[address]` returns the cell object for the specified address. | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | Special worksheet keys (accessible as `worksheet[key]`, each starting with `!`): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `ws['!ref']`: A-1 based range representing the worksheet range. Functions that | 
					
						
							|  |  |  |   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 | 
					
						
							|  |  |  |   writing a worksheet by hand, be sure to update the range.  For a longer | 
					
						
							|  |  |  |   discussion, see <http://git.io/KIaNKQ> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-26 17:40:04 +00:00
										 |  |  |   Functions that handle worksheets should test for the presence of `!ref` field. | 
					
						
							|  |  |  |   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 | 
					
						
							|  |  |  |   ship with this library treat sheets as empty (for example, the CSV output is an | 
					
						
							|  |  |  |   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']` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `ws['!merges']`: array of range objects corresponding to the merged cells in | 
					
						
							|  |  |  |   the worksheet.  Plaintext utilities are unaware of merge cells.  CSV export | 
					
						
							|  |  |  |   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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### 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 | 
					
						
							|  |  |  | custom properties. | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Option Name | Default | Description | | 
					
						
							|  |  |  | | :---------- | ------: | :---------- | | 
					
						
							| 
									
										
										
										
											2014-05-25 09:04:08 +00:00
										 |  |  | | cellFormula | true    | Save formulae to the .f field | | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | | cellHTML    | true    | Parse rich text and save HTML to the .h field | | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | | cellNF      | false   | Save number format string to the .z field | | 
					
						
							| 
									
										
										
										
											2014-05-29 06:18:23 +00:00
										 |  |  | | cellStyles  | false   | Save style/theme info to the .s field | | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | | cellDates   | false   | Store dates as type `d` (default is `n`) ** | | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | | sheetStubs  | false   | Create cell objects for stub cells | | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | | sheetRows   | 0       | If >0, read the first `sheetRows` rows ** | | 
					
						
							| 
									
										
										
										
											2014-02-15 05:08:18 +00:00
										 |  |  | | bookDeps    | false   | If true, parse calculation chains | | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | | bookFiles   | false   | If true, add raw files to book object ** | | 
					
						
							| 
									
										
										
										
											2014-02-14 06:25:46 +00:00
										 |  |  | | bookProps   | false   | If true, only parse enough to get book metadata ** | | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | | bookSheets  | false   | If true, only parse enough to get the sheet names | | 
					
						
							| 
									
										
										
										
											2014-04-03 22:51:54 +00:00
										 |  |  | | bookVBA     | false   | If true, expose vbaProject.bin to `vbaraw` field ** | | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							| 
									
										
										
										
											2014-02-14 06:25:46 +00:00
										 |  |  | - `bookSheets` and `bookProps` combine to give both sets of information | 
					
						
							| 
									
										
										
										
											2014-02-15 05:08:18 +00:00
										 |  |  | - `Deps` will be an empty object if `bookDeps` is falsy | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | - `bookFiles` adds a `keys` array (paths in the ZIP) and a `files` hash (whose | 
					
						
							|  |  |  |   keys are paths and values are objects representing the files) | 
					
						
							|  |  |  | - `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) | 
					
						
							| 
									
										
										
										
											2014-04-03 22:51:54 +00:00
										 |  |  | - `bookVBA` merely exposes the raw vba object.  It does not parse the data. | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | - `cellDates` currently does not convert numerical dates to JS dates. | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | The defaults are enumerated in bits/84_defaults.js | 
					
						
							| 
									
										
										
										
											2013-04-20 16:22:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | ## Writing Options
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The exported `write` and `writeFile` functions accept an options argument: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Option Name | Default | Description | | 
					
						
							|  |  |  | | :---------- | ------: | :---------- | | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | | cellDates   | false   | Store dates as type `d` (default is `n`) | | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | | bookSST     | false   | Generate Shared String Table ** | | 
					
						
							|  |  |  | | bookType    | 'xlsx'  | Type of Workbook ("xlsx" or "xlsm" or "xlsb") | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `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 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:50:55 +00:00
										 |  |  | - `bookType = 'xlsb'` is stubbed and far from complete | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | - The raw data is the only thing guaranteed to be saved.  Formulae, formatting, | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  |   and other niceties may not be serialized (pending CSF standardization) | 
					
						
							| 
									
										
										
										
											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` | 
					
						
							|  |  |  |   so non-Excel tools may ignore the data or blow up in the presence of dates. | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 13:59:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Cell Styles
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Cell styles are specified by a style object that roughly parallels the OpenXML structure.  The style object has five | 
					
						
							|  |  |  | top-level attributes: `fill`, `font`, `numFmt`, `alignment`, and `border`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Style Attribute | Sub Attributes | Values | | 
					
						
							|  |  |  | | :-------------- | :------------- | :------------- | :----- | | 
					
						
							| 
									
										
										
										
											2015-03-09 14:04:34 +00:00
										 |  |  | | fill            | patternType    |  `"solid"` or `"none"` | | 
					
						
							| 
									
										
										
										
											2015-03-09 14:05:20 +00:00
										 |  |  | |                 | fgColor        |  `COLOR_SPEC` | 
					
						
							|  |  |  | |                 | bgColor        |  `COLOR_SPEC` | 
					
						
							| 
									
										
										
										
											2015-03-09 14:04:34 +00:00
										 |  |  | | font            | name           |  `"Calibri"` // default | 
					
						
							|  |  |  | |                 | sz             |  `"11"` // font size in points | 
					
						
							| 
									
										
										
										
											2015-03-09 14:05:20 +00:00
										 |  |  | |                 | color          |  `COLOR_SPEC` | 
					
						
							| 
									
										
										
										
											2015-03-09 14:04:34 +00:00
										 |  |  | | numFmt          |                |  `"0"`  // integer index to built in formats, see StyleBuilder.SSF property | 
					
						
							|  |  |  | |                 |                |  `"0.00%"` // string matching a built-in format, see StyleBuilder.SSF | 
					
						
							|  |  |  | |                 |                |  `"0.0%"`  // string specifying a custom format | 
					
						
							|  |  |  | |                 |                |  `"0.00%;\\(0.00%\\);\\-;@"` // string specifying a custom format, escaping special characters | 
					
						
							|  |  |  | | alignment       | vertical       | `"bottom"||"center"||"top"` | 
					
						
							|  |  |  | |                 | horizontal     | `"bottom"||"center"||"top"` | 
					
						
							| 
									
										
										
										
											2015-03-12 13:54:59 +00:00
										 |  |  | |                 | textRotation   | Number from `0` to `180` or `255` (default is `0`) | 
					
						
							|  |  |  | |                 |                |  `90` is rotated up 90 degrees | 
					
						
							|  |  |  | |                 |                |  `45` is rotated up 45 degrees | 
					
						
							|  |  |  | |                 |                | `135` is rotated down 45 degrees  | 
					
						
							|  |  |  | |                 |                | `180` is rotated down 180 degrees | 
					
						
							|  |  |  | |                 |                | `255` is special,  aligned vertically | 
					
						
							| 
									
										
										
										
											2015-03-09 14:04:34 +00:00
										 |  |  | | border          | top            | `{ style: BORDER_STYLE, color: COLOR_SPEC }` | 
					
						
							|  |  |  | |                 | bottom         | `{ style: BORDER_STYLE, color: COLOR_SPEC }` | 
					
						
							|  |  |  | |                 | left           | `{ style: BORDER_STYLE, color: COLOR_SPEC }` | 
					
						
							|  |  |  | |                 | right          | `{ style: BORDER_STYLE, color: COLOR_SPEC }` | 
					
						
							|  |  |  | |                 | diagonal       | `{ style: BORDER_STYLE, color: COLOR_SPEC }` | 
					
						
							|  |  |  | |                 | diagonalUp     | `true||false` | 
					
						
							|  |  |  | |                 | diagonalDown   | `true||false` | 
					
						
							| 
									
										
										
										
											2015-03-09 13:59:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | **COLOR_SPEC** Colors for `fill`, `font`, and `border` are specified as objects, either: | 
					
						
							| 
									
										
										
										
											2015-03-12 13:52:30 +00:00
										 |  |  | * `{ auto: 1}` specifying automatic values | 
					
						
							| 
									
										
										
										
											2015-03-09 13:59:31 +00:00
										 |  |  | * `{ rgb: "FFFFAA00" }` specifying a hex ARGB value | 
					
						
							|  |  |  | * `{ theme: "1", tint: "-0.25"}` specifying an integer index to a theme color and a tint value (default 0) | 
					
						
							| 
									
										
										
										
											2015-03-12 13:52:30 +00:00
										 |  |  | * `{ indexed: 64}` default value for `fill.bgColor` | 
					
						
							| 
									
										
										
										
											2015-03-09 13:59:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 14:04:34 +00:00
										 |  |  | **BORDER_STYLE** is a string value which may take on one of the following values: | 
					
						
							| 
									
										
										
										
											2015-03-09 13:59:31 +00:00
										 |  |  |  * `thin` | 
					
						
							| 
									
										
										
										
											2015-03-09 14:04:34 +00:00
										 |  |  |  * `medium` | 
					
						
							|  |  |  |  * `thick` | 
					
						
							|  |  |  |  * `dotted` | 
					
						
							| 
									
										
										
										
											2015-03-09 13:59:31 +00:00
										 |  |  |  * `hair` | 
					
						
							|  |  |  |  * `dashed` | 
					
						
							|  |  |  |  * `mediumDashed` | 
					
						
							|  |  |  |  * `dashDot` | 
					
						
							|  |  |  |  * `mediumDashDot` | 
					
						
							|  |  |  |  * `dashDotDot` | 
					
						
							|  |  |  |  * `mediumDashDotDot` | 
					
						
							|  |  |  |  * `slantDashDot` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | ## Tested Environments
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  |  - NodeJS 0.8, 0.10 (latest release), 0.11 (unstable) | 
					
						
							|  |  |  |  - IE 6/7/8/9/10/11 using Base64 mode (IE10/11 using HTML5 mode) | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  |  - FF 18 using Base64 or HTML5 mode | 
					
						
							|  |  |  |  - Chrome 24 using Base64 or HTML5 mode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Tests utilize the mocha testing framework.  Travis-CI and Sauce Labs links: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  |  - <https://travis-ci.org/SheetJS/js-xlsx> for XLSX module in nodejs | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  |  - <https://travis-ci.org/SheetJS/SheetJS.github.io> for XLS* modules | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  |  - <https://saucelabs.com/u/sheetjs> for XLS* modules using Sauce Labs | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 19:26:07 +00:00
										 |  |  | ## Test Files
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-13 23:28:11 +00:00
										 |  |  | Test files are housed in [another repo](https://github.com/SheetJS/test_files). | 
					
						
							| 
									
										
										
										
											2013-10-30 19:26:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  | Running `make init` will refresh the `test_files` submodule and get the files. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | ## Testing
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | `make test` will run the nodejs-based tests.  To run the in-browser tests, clone | 
					
						
							| 
									
										
										
										
											2014-02-04 00:00:44 +00:00
										 |  |  | [the oss.sheetjs.com repo](https://github.com/SheetJS/SheetJS.github.io) and | 
					
						
							|  |  |  | replace the xlsx.js file (then fire up the browser and go to `stress.html`): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | $ 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 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | For a much smaller test, run `make test_misc`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | important to ensure code is cleanroom.  Consult CONTRIBUTING.md | 
					
						
							| 
									
										
										
										
											2014-02-07 10:53:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-28 13:22:32 +00:00
										 |  |  | The xlsx.js file is constructed from the files in the `bits` subdirectory. The | 
					
						
							|  |  |  | build script (run `make`) will concatenate the individual bits to produce the | 
					
						
							|  |  |  | script.  Before submitting a contribution, ensure that running make will produce | 
					
						
							|  |  |  | the xlsx.js file exactly.  The simplest way to test is to move the script: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | $ mv xlsx.js xlsx.new.js | 
					
						
							|  |  |  | $ make | 
					
						
							|  |  |  | $ diff xlsx.js xlsx.new.js | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 05:26:18 +00:00
										 |  |  | To produce the dist files, run `make dist`.  The dist files are updated in each | 
					
						
							|  |  |  | version release and should not be committed between versions. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | ## XLS Support
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:31:33 +00:00
										 |  |  | XLS is available in [js-xls](http://git.io/xls). | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +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 | 
					
						
							|  |  |  | granted by the Apache 2.0 license are reserved by the Original Author. | 
					
						
							| 
									
										
										
										
											2013-10-30 19:26:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  | It is the opinion of the Original Author that this code conforms to the terms of | 
					
						
							|  |  |  | the Microsoft Open Specifications Promise, falling under the same terms as | 
					
						
							|  |  |  | OpenOffice (which is governed by the Apache License v2).  Given the vagaries of | 
					
						
							|  |  |  | the promise, the Original Author makes no legal claim that in fact end users are | 
					
						
							|  |  |  | protected from future actions.  It is highly recommended that, for commercial | 
					
						
							|  |  |  | uses, you consult a lawyer before proceeding. | 
					
						
							| 
									
										
										
										
											2012-12-04 19:27:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## References
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ISO/IEC 29500:2012(E) "Information technology — Document description and processing languages — Office Open XML File Formats" | 
					
						
							| 
									
										
										
										
											2012-12-03 19:25:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 19:26:07 +00:00
										 |  |  | OSP-covered specifications: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  |  - [MS-XLSB]: Excel (.xlsb) Binary File Format | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  |  - [MS-XLSX]: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  |  - [MS-OE376]: Office Implementation Information for ECMA-376 Standards Support | 
					
						
							| 
									
										
										
										
											2014-05-01 00:24:27 +00:00
										 |  |  |  - [MS-XLDM]: Spreadsheet Data Model File Format | 
					
						
							| 
									
										
										
										
											2013-10-30 19:26:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-10 02:22:38 +00:00
										 |  |  | Open Document Format for Office Applications Version 1.2 (29 September 2011) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | ## Badges
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | [](https://travis-ci.org/SheetJS/js-xlsx) | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | [](https://coveralls.io/r/SheetJS/js-xlsx?branch=master) | 
					
						
							| 
									
										
										
										
											2014-01-27 09:38:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 06:23:42 +00:00
										 |  |  | [](http://githalytics.com/SheetJS/js-xlsx) |