forked from sheetjs/sheetjs
		
	version bump 0.8.7: bundlers
demos for browserify/requirejs/webpack
This commit is contained in:
		
							parent
							
								
									5ae6b1965b
								
							
						
					
					
						commit
						3d1f0f79ca
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -9,7 +9,7 @@ tmp
 | 
			
		||||
*.[pP][rR][nN]
 | 
			
		||||
*.[sS][lL][kK]
 | 
			
		||||
*.socialcalc
 | 
			
		||||
*.[xX][lL][sSwW]
 | 
			
		||||
*.[xX][lL][sSwWcC]
 | 
			
		||||
*.[xX][lL][sS][xXmMbB]
 | 
			
		||||
*.[oO][dD][sS]
 | 
			
		||||
*.[fF][oO][dD][sS]
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
test_files/
 | 
			
		||||
tests/files/
 | 
			
		||||
demos/
 | 
			
		||||
index.html
 | 
			
		||||
misc/
 | 
			
		||||
node_modules
 | 
			
		||||
@ -10,7 +11,7 @@ tmp
 | 
			
		||||
*.[pP][rR][nN]
 | 
			
		||||
*.[sS][lL][kK]
 | 
			
		||||
*.socialcalc
 | 
			
		||||
*.[xX][lL][sSwW]
 | 
			
		||||
*.[xX][lL][sSwWcC]
 | 
			
		||||
*.[xX][lL][sS][xXmMbB]
 | 
			
		||||
*.[oO][dD][sS]
 | 
			
		||||
*.[fF][oO][dD][sS]
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,6 @@ before_install:
 | 
			
		||||
  - "npm install coveralls mocha-lcov-reporter"
 | 
			
		||||
before_script:
 | 
			
		||||
  - "make init"
 | 
			
		||||
  - "cd test_files; make all; cd -" 
 | 
			
		||||
  - "cd test_files; make all; cd -"
 | 
			
		||||
after_success:
 | 
			
		||||
  - "make coveralls-spin"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								Makefile
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										12
									
								
								Makefile
									
									
									
									
									
								
							@ -57,8 +57,9 @@ dist: dist-deps $(TARGET) bower.json ## Prepare JS files for distribution
 | 
			
		||||
	misc/strip_sourcemap.sh dist/$(LIB).min.js
 | 
			
		||||
	uglifyjs $(UGLIFYOPTS) $(REQS) $(TARGET) -o dist/$(LIB).core.min.js --source-map dist/$(LIB).core.min.map --preamble "$$(head -n 1 bits/00_header.js)"
 | 
			
		||||
	misc/strip_sourcemap.sh dist/$(LIB).core.min.js
 | 
			
		||||
	uglifyjs $(UGLIFYOPTS) $(REQS) $(ADDONS) $(TARGET) -o dist/$(LIB).full.min.js --source-map dist/$(LIB).full.min.map --preamble "$$(head -n 1 bits/00_header.js)"
 | 
			
		||||
	uglifyjs $(UGLIFYOPTS) $(REQS) $(ADDONS) $(TARGET) $(AUXTARGETS) -o dist/$(LIB).full.min.js --source-map dist/$(LIB).full.min.map --preamble "$$(head -n 1 bits/00_header.js)"
 | 
			
		||||
	misc/strip_sourcemap.sh dist/$(LIB).full.min.js
 | 
			
		||||
	cat <(head -n 1 bits/00_header.js) $(REQS) $(ADDONS) $(TARGET) $(AUXTARGETS) > demos/requirejs/$(LIB).full.js
 | 
			
		||||
 | 
			
		||||
.PHONY: dist-deps
 | 
			
		||||
dist-deps: ods.js ## Copy dependencies for distribution
 | 
			
		||||
@ -91,6 +92,15 @@ TESTFMT=$(patsubst %,test_%,$(FMT))
 | 
			
		||||
$(TESTFMT): test_%:
 | 
			
		||||
	FMTS=$* make test
 | 
			
		||||
 | 
			
		||||
.PHONY: demo-browserify
 | 
			
		||||
demo-browserify: ## Run browserify demo build
 | 
			
		||||
	make -C demos/browserify
 | 
			
		||||
	@echo "start a local server and go to demos/browserify/browserify.html"
 | 
			
		||||
 | 
			
		||||
.PHONY: demo-webpack
 | 
			
		||||
demo-webpack: ## Run webpack demo build
 | 
			
		||||
	make -C demos/webpack
 | 
			
		||||
	@echo "start a local server and go to demos/webpack/webpack.html"
 | 
			
		||||
 | 
			
		||||
## Code Checking
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							@ -73,6 +73,14 @@ 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`
 | 
			
		||||
 | 
			
		||||
### JS Ecosystem Demos
 | 
			
		||||
 | 
			
		||||
The `demos` directory includes sample projects for:
 | 
			
		||||
 | 
			
		||||
- [`browserify`](http://browserify.org/)
 | 
			
		||||
- [`requirejs`](http://requirejs.org/)
 | 
			
		||||
- [`webpack`](https://webpack.js.org/)
 | 
			
		||||
 | 
			
		||||
### ECMAScript 5 Compatibility
 | 
			
		||||
 | 
			
		||||
Since xlsx.js uses ES5 functions like `Array#forEach`, older browsers require
 | 
			
		||||
@ -338,7 +346,7 @@ Utilities are available in the `XLSX.utils` object:
 | 
			
		||||
 | 
			
		||||
Exporting:
 | 
			
		||||
 | 
			
		||||
- `sheet_to_json` converts a workbook object to an array of JSON objects.
 | 
			
		||||
- `sheet_to_json` converts a worksheet object to an array of JSON objects.
 | 
			
		||||
  `sheet_to_row_object_array` is an alias that will be removed in the future.
 | 
			
		||||
- `sheet_to_csv` generates delimiter-separated-values output.
 | 
			
		||||
- `sheet_to_formulae` generates a list of the formulae (with value fallbacks).
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								bin/xlsx.njs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								bin/xlsx.njs
									
									
									
									
									
								
							@ -10,6 +10,7 @@ program
 | 
			
		||||
	.usage('[options] <file> [sheetname]')
 | 
			
		||||
	.option('-f, --file <file>', 'use specified workbook')
 | 
			
		||||
	.option('-s, --sheet <sheet>', 'print specified sheet (default first sheet)')
 | 
			
		||||
	.option('-N, --sheet-index <idx>', 'use specified sheet index (0-based)')
 | 
			
		||||
	.option('-p, --password <pw>', 'if file is encrypted, try with specified pw')
 | 
			
		||||
	.option('-l, --list-sheets', 'list sheet names and exit')
 | 
			
		||||
	.option('-o, --output <file>', 'output to specified file')
 | 
			
		||||
@ -25,6 +26,7 @@ program
 | 
			
		||||
	.option('-j, --json', 'emit formatted JSON (all fields text)')
 | 
			
		||||
	.option('-J, --raw-js', 'emit raw JS object (raw numbers)')
 | 
			
		||||
	.option('-A, --arrays', 'emit rows as JS objects (raw numbers)')
 | 
			
		||||
 | 
			
		||||
	.option('-F, --field-sep <sep>', 'CSV field separator', ",")
 | 
			
		||||
	.option('-R, --row-sep <sep>', 'CSV row separator', "\n")
 | 
			
		||||
	.option('-n, --sheet-rows <num>', 'Number of rows to process (0=all rows)')
 | 
			
		||||
@ -80,6 +82,7 @@ if(program.listSheets) opts.bookSheets = true;
 | 
			
		||||
if(program.sheetRows) opts.sheetRows = program.sheetRows;
 | 
			
		||||
if(program.password) opts.password = program.password;
 | 
			
		||||
if(program.xlsx || program.xlsm || program.xlsb) {
 | 
			
		||||
	opts.cellFormula = true;
 | 
			
		||||
	opts.cellNF = true;
 | 
			
		||||
	if(program.output) sheetname = program.output;
 | 
			
		||||
}
 | 
			
		||||
@ -109,7 +112,7 @@ if(program.read) process.exit(0);
 | 
			
		||||
 | 
			
		||||
/*::   if(wb) { */
 | 
			
		||||
if(program.listSheets) {
 | 
			
		||||
	console.log(wb.SheetNames.join("\n"));
 | 
			
		||||
	console.log((wb.SheetNames||[]).join("\n"));
 | 
			
		||||
	process.exit(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -123,7 +126,10 @@ workbook_formats.forEach(function(m) { if(program[m]) {
 | 
			
		||||
} });
 | 
			
		||||
 | 
			
		||||
var target_sheet = sheetname || '';
 | 
			
		||||
if(target_sheet === '') target_sheet = wb.SheetNames[0];
 | 
			
		||||
if(target_sheet === '') {
 | 
			
		||||
	if(program.sheetIndex < (wb.SheetNames||[]).length) target_sheet = wb.SheetNames[program.sheetIndex];
 | 
			
		||||
	else target_sheet = (wb.SheetNames||[""])[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var ws;
 | 
			
		||||
try {
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
XLSX.version = '0.8.6';
 | 
			
		||||
XLSX.version = '0.8.7';
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
var current_codepage = 1200, current_cptable;
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel.js');
 | 
			
		||||
	current_cptable = cptable[current_codepage];
 | 
			
		||||
}
 | 
			
		||||
function reset_cp() { set_cp(1200); }
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,7 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ var make_offcrypto = function(O, _crypto) {
 | 
			
		||||
	var crypto;
 | 
			
		||||
	if(typeof _crypto !== 'undefined') crypto = _crypto;
 | 
			
		||||
	else if(typeof require !== 'undefined') {
 | 
			
		||||
		try { crypto = require('cry'+'pto'); }
 | 
			
		||||
		try { crypto = require('crypto'); }
 | 
			
		||||
		catch(e) { crypto = null; }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -68,7 +68,7 @@ function parse_VtVecHeadingPair(blob) {
 | 
			
		||||
/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
 | 
			
		||||
function parse_dictionary(blob,CodePage) {
 | 
			
		||||
	var cnt = blob.read_shift(4);
 | 
			
		||||
	var dict/*{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	var dict/*:{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	for(var j = 0; j != cnt; ++j) {
 | 
			
		||||
		var pid = blob.read_shift(4);
 | 
			
		||||
		var len = blob.read_shift(4);
 | 
			
		||||
@ -149,7 +149,7 @@ function parse_PropertySet(blob, PIDSI) {
 | 
			
		||||
	var NumProps = blob.read_shift(4);
 | 
			
		||||
	var Props = [], i = 0;
 | 
			
		||||
	var CodePage = 0;
 | 
			
		||||
	var Dictionary = -1, DictObj/*{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	var Dictionary = -1, DictObj/*:{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	for(i = 0; i != NumProps; ++i) {
 | 
			
		||||
		var PropID = blob.read_shift(4);
 | 
			
		||||
		var Offset = blob.read_shift(4);
 | 
			
		||||
 | 
			
		||||
@ -557,6 +557,7 @@ function parse_FormulaValue(blob) {
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.103 */
 | 
			
		||||
function parse_RgbExtra(blob, length, rgce, opts) {
 | 
			
		||||
	if(opts.biff < 8) return parsenoop(blob, length);
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var o = [];
 | 
			
		||||
	for(var i = 0; i !== rgce.length; ++i) {
 | 
			
		||||
@ -624,7 +625,6 @@ function parse_ArrayParsedFormula(blob, length, opts, ref) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.104 */
 | 
			
		||||
var gcnt = 0;
 | 
			
		||||
function parse_Rgce(blob, length, opts) {
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var R, id, ptgs = [];
 | 
			
		||||
@ -892,6 +892,7 @@ function stringify_formula(formula, range, cell, supbooks, opts) {
 | 
			
		||||
 | 
			
		||||
			/* 2.5.198.38 */
 | 
			
		||||
			case 'PtgAttrSpace':
 | 
			
		||||
			/* 2.5.198.39 */
 | 
			
		||||
			case 'PtgAttrSpaceSemi':
 | 
			
		||||
				last_sp = ff;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
@ -701,7 +701,7 @@ function parse_xlml_xml(d, opts) {
 | 
			
		||||
			}
 | 
			
		||||
			if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");
 | 
			
		||||
	}
 | 
			
		||||
	var out = ({}/*:Any*/);
 | 
			
		||||
	var out = ({}/*:any*/);
 | 
			
		||||
	if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;
 | 
			
		||||
	out.SheetNames = sheetnames;
 | 
			
		||||
	out.SSF = SSF.get_table();
 | 
			
		||||
 | 
			
		||||
@ -160,6 +160,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;
 | 
			
		||||
		var R = XLSRecordEnum[RecordType];
 | 
			
		||||
		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | 
			
		||||
		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | 
			
		||||
		if(R && R.f) {
 | 
			
		||||
			if(options.bookSheets) {
 | 
			
		||||
				if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;
 | 
			
		||||
@ -253,12 +254,13 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
				} break;
 | 
			
		||||
				case 'BOF': {
 | 
			
		||||
					if(opts.biff !== 8){}
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0009) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0209) opts.biff = 3;
 | 
			
		||||
					else if(RecordType  === 0x0409) opts.biff = 4;
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0600) opts.biff = 8;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					if(file_depth++) break;
 | 
			
		||||
					cell_valid = true;
 | 
			
		||||
					out = {};
 | 
			
		||||
 | 
			
		||||
@ -1,16 +1,21 @@
 | 
			
		||||
/* Helper functions to call out to ODS */
 | 
			
		||||
 | 
			
		||||
function get_ods() {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./ods.js');
 | 
			
		||||
	return ODS;
 | 
			
		||||
}
 | 
			
		||||
function parse_ods(zip, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_ods(zip, opts);
 | 
			
		||||
}
 | 
			
		||||
function write_ods(wb, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.write_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.write_ods(wb, opts);
 | 
			
		||||
}
 | 
			
		||||
function parse_fods(data, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_fods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_fods(data, opts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -10,13 +10,20 @@ function unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\$([A-Z])
 | 
			
		||||
 | 
			
		||||
function split_cell(cstr/*:string*/)/*:Array<string>*/ { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); }
 | 
			
		||||
function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
 | 
			
		||||
function encode_cell(cell/*:Cell*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
 | 
			
		||||
function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
 | 
			
		||||
function fix_cell(cstr/*:string*/)/*:string*/ { return fix_col(fix_row(cstr)); }
 | 
			
		||||
function unfix_cell(cstr/*:string*/)/*:string*/ { return unfix_col(unfix_row(cstr)); }
 | 
			
		||||
function decode_range(range/*:string*/)/*:Range*/ { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }
 | 
			
		||||
function encode_range(cs/*:any*/,ce/*:?any*/)/*:string*/ {
 | 
			
		||||
	if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);
 | 
			
		||||
	if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);
 | 
			
		||||
	if(typeof ce === 'undefined' || typeof ce === 'number') {
 | 
			
		||||
/*:: if(!(cs instanceof Range)) throw "unreachable"; */
 | 
			
		||||
		return encode_range(cs.s, cs.e);
 | 
			
		||||
	}
 | 
			
		||||
/*:: if((cs instanceof Range)) throw "unreachable"; */
 | 
			
		||||
	if(typeof cs !== 'string') cs = encode_cell((cs/*:any*/));
 | 
			
		||||
	if(typeof ce !== 'string') ce = encode_cell((ce/*:any*/));
 | 
			
		||||
/*:: if(typeof cs !== 'string') throw "unreachable"; */
 | 
			
		||||
/*:: if(typeof ce !== 'string') throw "unreachable"; */
 | 
			
		||||
	return cs == ce ? cs : cs + ":" + ce;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								demos/browserify/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								demos/browserify/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
browserify.js
 | 
			
		||||
browserify.min.js
 | 
			
		||||
							
								
								
									
										10
									
								
								demos/browserify/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								demos/browserify/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
TOOL=browserify
 | 
			
		||||
.PHONY: all
 | 
			
		||||
all: $(TOOL).min.js
 | 
			
		||||
 | 
			
		||||
$(TOOL).min.js: $(TOOL).js
 | 
			
		||||
	uglifyjs $< > $@
 | 
			
		||||
 | 
			
		||||
.PHONY: $(TOOL).js
 | 
			
		||||
$(TOOL).js:
 | 
			
		||||
	browserify -r './main.js:xlsx' > $@
 | 
			
		||||
							
								
								
									
										278
									
								
								demos/browserify/browserify.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										278
									
								
								demos/browserify/browserify.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,278 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!-- xlsx.js (C) 2013-present  SheetJS http://sheetjs.com -->
 | 
			
		||||
<!-- vim: set ts=2: -->
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 | 
			
		||||
<title>JS-XLSX Live Demo</title>
 | 
			
		||||
<style>
 | 
			
		||||
#drop{
 | 
			
		||||
	border:2px dashed #bbb;
 | 
			
		||||
	-moz-border-radius:5px;
 | 
			
		||||
	-webkit-border-radius:5px;
 | 
			
		||||
	border-radius:5px;
 | 
			
		||||
	padding:25px;
 | 
			
		||||
	text-align:center;
 | 
			
		||||
	font:20pt bold,"Vollkorn";color:#bbb
 | 
			
		||||
}
 | 
			
		||||
#b64data{
 | 
			
		||||
	width:100%;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<b>JS-XLSX Live Demo</b><br />
 | 
			
		||||
Output Format:
 | 
			
		||||
<select name="format">
 | 
			
		||||
<option value="csv" selected> CSV</option>
 | 
			
		||||
<option value="json"> JSON</option>
 | 
			
		||||
<option value="form"> FORMULAE</option>
 | 
			
		||||
</select><br />
 | 
			
		||||
 | 
			
		||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
 | 
			
		||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
 | 
			
		||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
 | 
			
		||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
 | 
			
		||||
Advanced Demo Options: <br />
 | 
			
		||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked><br />
 | 
			
		||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked><br />
 | 
			
		||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
 | 
			
		||||
<pre id="out"></pre>
 | 
			
		||||
<br />
 | 
			
		||||
<script src="browserify.min.js"></script>
 | 
			
		||||
<script>
 | 
			
		||||
var X = require('xlsx');
 | 
			
		||||
var XW = {
 | 
			
		||||
	/* worker message */
 | 
			
		||||
	msg: 'xlsx',
 | 
			
		||||
	/* worker scripts */
 | 
			
		||||
	rABS: './xlsxworker2.js',
 | 
			
		||||
	norABS: './xlsxworker1.js',
 | 
			
		||||
	noxfer: './xlsxworker.js'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
 | 
			
		||||
if(!rABS) {
 | 
			
		||||
	document.getElementsByName("userabs")[0].disabled = true;
 | 
			
		||||
	document.getElementsByName("userabs")[0].checked = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var use_worker = typeof Worker !== 'undefined';
 | 
			
		||||
if(!use_worker) {
 | 
			
		||||
	document.getElementsByName("useworker")[0].disabled = true;
 | 
			
		||||
	document.getElementsByName("useworker")[0].checked = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var transferable = use_worker;
 | 
			
		||||
if(!transferable) {
 | 
			
		||||
	document.getElementsByName("xferable")[0].disabled = true;
 | 
			
		||||
	document.getElementsByName("xferable")[0].checked = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var wtf_mode = false;
 | 
			
		||||
 | 
			
		||||
function fixdata(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function s2ab(s) {
 | 
			
		||||
	var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
 | 
			
		||||
	for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
 | 
			
		||||
	return [v, b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function xw_noxfer(data, cb) {
 | 
			
		||||
	var worker = new Worker(XW.noxfer);
 | 
			
		||||
	worker.onmessage = function(e) {
 | 
			
		||||
		switch(e.data.t) {
 | 
			
		||||
			case 'ready': break;
 | 
			
		||||
			case 'e': console.error(e.data.d); break;
 | 
			
		||||
			case XW.msg: cb(JSON.parse(e.data.d)); break;
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
	var arr = rABS ? data : btoa(fixdata(data));
 | 
			
		||||
	worker.postMessage({d:arr,b:rABS});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function xw_xfer(data, cb) {
 | 
			
		||||
	var worker = new Worker(rABS ? XW.rABS : XW.norABS);
 | 
			
		||||
	worker.onmessage = function(e) {
 | 
			
		||||
		switch(e.data.t) {
 | 
			
		||||
			case 'ready': break;
 | 
			
		||||
			case 'e': console.error(e.data.d); break;
 | 
			
		||||
			default: xx=ab2str(e.data).replace(/\n/g,"\\n").replace(/\r/g,"\\r"); console.log("done"); cb(JSON.parse(xx)); break;
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
	if(rABS) {
 | 
			
		||||
		var val = s2ab(data);
 | 
			
		||||
		worker.postMessage(val[1], [val[1]]);
 | 
			
		||||
	} else {
 | 
			
		||||
		worker.postMessage(data, [data]);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function xw(data, cb) {
 | 
			
		||||
	transferable = document.getElementsByName("xferable")[0].checked;
 | 
			
		||||
	if(transferable) xw_xfer(data, cb);
 | 
			
		||||
	else xw_noxfer(data, cb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function get_radio_value( radioName ) {
 | 
			
		||||
	var radios = document.getElementsByName( radioName );
 | 
			
		||||
	for( var i = 0; i < radios.length; i++ ) {
 | 
			
		||||
		if( radios[i].checked || radios.length === 1 ) {
 | 
			
		||||
			return radios[i].value;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_json(workbook) {
 | 
			
		||||
	var result = {};
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var roa = X.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(roa.length > 0){
 | 
			
		||||
			result[sheetName] = roa;
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_csv(workbook) {
 | 
			
		||||
	var result = [];
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(csv.length > 0){
 | 
			
		||||
			result.push("SHEET: " + sheetName);
 | 
			
		||||
			result.push("");
 | 
			
		||||
			result.push(csv);
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result.join("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_formulae(workbook) {
 | 
			
		||||
	var result = [];
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(formulae.length > 0){
 | 
			
		||||
			result.push("SHEET: " + sheetName);
 | 
			
		||||
			result.push("");
 | 
			
		||||
			result.push(formulae.join("\n"));
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result.join("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var tarea = document.getElementById('b64data');
 | 
			
		||||
function b64it() {
 | 
			
		||||
	if(typeof console !== 'undefined') console.log("onload", new Date());
 | 
			
		||||
	var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
 | 
			
		||||
	process_wb(wb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function process_wb(wb) {
 | 
			
		||||
	var output = "";
 | 
			
		||||
	switch(get_radio_value("format")) {
 | 
			
		||||
		case "json":
 | 
			
		||||
			output = JSON.stringify(to_json(wb), 2, 2);
 | 
			
		||||
			break;
 | 
			
		||||
		case "form":
 | 
			
		||||
			output = to_formulae(wb);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			output = to_csv(wb);
 | 
			
		||||
	}
 | 
			
		||||
	if(out.innerText === undefined) out.textContent = output;
 | 
			
		||||
	else out.innerText = output;
 | 
			
		||||
	if(typeof console !== 'undefined') console.log("output", new Date());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var drop = document.getElementById('drop');
 | 
			
		||||
function handleDrop(e) {
 | 
			
		||||
	e.stopPropagation();
 | 
			
		||||
	e.preventDefault();
 | 
			
		||||
	rABS = document.getElementsByName("userabs")[0].checked;
 | 
			
		||||
	use_worker = document.getElementsByName("useworker")[0].checked;
 | 
			
		||||
	var files = e.dataTransfer.files;
 | 
			
		||||
	var f = files[0];
 | 
			
		||||
	{
 | 
			
		||||
		var reader = new FileReader();
 | 
			
		||||
		var name = f.name;
 | 
			
		||||
		reader.onload = function(e) {
 | 
			
		||||
			if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
 | 
			
		||||
			var data = e.target.result;
 | 
			
		||||
			if(use_worker) {
 | 
			
		||||
				xw(data, process_wb);
 | 
			
		||||
			} else {
 | 
			
		||||
				var wb;
 | 
			
		||||
				if(rABS) {
 | 
			
		||||
					wb = X.read(data, {type: 'binary'});
 | 
			
		||||
				} else {
 | 
			
		||||
					var arr = fixdata(data);
 | 
			
		||||
					wb = X.read(btoa(arr), {type: 'base64'});
 | 
			
		||||
				}
 | 
			
		||||
				process_wb(wb);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		if(rABS) reader.readAsBinaryString(f);
 | 
			
		||||
		else reader.readAsArrayBuffer(f);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function handleDragover(e) {
 | 
			
		||||
	e.stopPropagation();
 | 
			
		||||
	e.preventDefault();
 | 
			
		||||
	e.dataTransfer.dropEffect = 'copy';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(drop.addEventListener) {
 | 
			
		||||
	drop.addEventListener('dragenter', handleDragover, false);
 | 
			
		||||
	drop.addEventListener('dragover', handleDragover, false);
 | 
			
		||||
	drop.addEventListener('drop', handleDrop, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var xlf = document.getElementById('xlf');
 | 
			
		||||
function handleFile(e) {
 | 
			
		||||
	rABS = document.getElementsByName("userabs")[0].checked;
 | 
			
		||||
	use_worker = document.getElementsByName("useworker")[0].checked;
 | 
			
		||||
	var files = e.target.files;
 | 
			
		||||
	var f = files[0];
 | 
			
		||||
	{
 | 
			
		||||
		var reader = new FileReader();
 | 
			
		||||
		var name = f.name;
 | 
			
		||||
		reader.onload = function(e) {
 | 
			
		||||
			if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
 | 
			
		||||
			var data = e.target.result;
 | 
			
		||||
			if(use_worker) {
 | 
			
		||||
				xw(data, process_wb);
 | 
			
		||||
			} else {
 | 
			
		||||
				var wb;
 | 
			
		||||
				if(rABS) {
 | 
			
		||||
					wb = X.read(data, {type: 'binary'});
 | 
			
		||||
				} else {
 | 
			
		||||
					var arr = fixdata(data);
 | 
			
		||||
					wb = X.read(btoa(arr), {type: 'base64'});
 | 
			
		||||
				}
 | 
			
		||||
				process_wb(wb);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		if(rABS) reader.readAsBinaryString(f);
 | 
			
		||||
		else reader.readAsArrayBuffer(f);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
 | 
			
		||||
</script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										3
									
								
								demos/browserify/main.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								demos/browserify/main.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
var XLSX = require('../../'); // test against development version
 | 
			
		||||
//var XLSX = require('xlsx'); // use in production
 | 
			
		||||
module.exports = XLSX;
 | 
			
		||||
							
								
								
									
										12
									
								
								demos/browserify/xlsxworker.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										12
									
								
								demos/browserify/xlsxworker.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
importScripts('browserify.min.js');
 | 
			
		||||
var XLSX = require('xlsx');
 | 
			
		||||
postMessage({t:"ready"});
 | 
			
		||||
 | 
			
		||||
onmessage = function (oEvent) {
 | 
			
		||||
  var v;
 | 
			
		||||
  try {
 | 
			
		||||
    v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
 | 
			
		||||
  } catch(e) { postMessage({t:"e",d:e.stack||e}); }
 | 
			
		||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										27
									
								
								demos/browserify/xlsxworker1.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										27
									
								
								demos/browserify/xlsxworker1.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
importScripts('browserify.min.js');
 | 
			
		||||
var XLSX = require('xlsx');
 | 
			
		||||
postMessage({t:"ready"});
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function s2ab(s) {
 | 
			
		||||
  var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
 | 
			
		||||
  for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
 | 
			
		||||
  return [v, b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
onmessage = function (oEvent) {
 | 
			
		||||
  var v;
 | 
			
		||||
  try {
 | 
			
		||||
    v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
 | 
			
		||||
  } catch(e) { postMessage({t:"e",d:e.stack}); }
 | 
			
		||||
  var res = {t:"xlsx", d:JSON.stringify(v)};
 | 
			
		||||
  var r = s2ab(res.d)[1];
 | 
			
		||||
postMessage(r, [r]);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										27
									
								
								demos/browserify/xlsxworker2.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										27
									
								
								demos/browserify/xlsxworker2.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
importScripts('browserify.min.js');
 | 
			
		||||
var XLSX = require('xlsx');
 | 
			
		||||
postMessage({t:"ready"});
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function s2ab(s) {
 | 
			
		||||
  var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
 | 
			
		||||
  for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
 | 
			
		||||
  return [v, b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
onmessage = function (oEvent) {
 | 
			
		||||
  var v;
 | 
			
		||||
  try {
 | 
			
		||||
    v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
 | 
			
		||||
  } catch(e) { postMessage({t:"e",d:e.stack}); }
 | 
			
		||||
  var res = {t:"xlsx", d:JSON.stringify(v)};
 | 
			
		||||
  var r = s2ab(res.d)[1];
 | 
			
		||||
postMessage(r, [r]);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										4
									
								
								demos/requirejs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								demos/requirejs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
xlsx.full*
 | 
			
		||||
r.js
 | 
			
		||||
require.js
 | 
			
		||||
requirejs-built.js
 | 
			
		||||
							
								
								
									
										9
									
								
								demos/requirejs/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										9
									
								
								demos/requirejs/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
TOOL=requirejs
 | 
			
		||||
.PHONY: all
 | 
			
		||||
all: $(TOOL).js
 | 
			
		||||
 | 
			
		||||
.PHONY: $(TOOL).js
 | 
			
		||||
$(TOOL).js:
 | 
			
		||||
	if [ ! -e require.js ]; then curl -O http://requirejs.org/docs/release/2.3.3/comments/require.js; fi
 | 
			
		||||
	if [ ! -e r.js ]; then curl -O http://requirejs.org/docs/release/2.3.3/r.js; fi
 | 
			
		||||
	node r.js -o build.js
 | 
			
		||||
							
								
								
									
										5
									
								
								demos/requirejs/build.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										5
									
								
								demos/requirejs/build.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
({
 | 
			
		||||
	baseUrl: ".",
 | 
			
		||||
	name: "requirejs",
 | 
			
		||||
	out: "requirejs-built.js"
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										173
									
								
								demos/requirejs/requirejs.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										173
									
								
								demos/requirejs/requirejs.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,173 @@
 | 
			
		||||
require(["xlsx.full"], function(_XLSX) {
 | 
			
		||||
var X = XLSX;
 | 
			
		||||
 | 
			
		||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
 | 
			
		||||
if(!rABS) {
 | 
			
		||||
	document.getElementsByName("userabs")[0].disabled = true;
 | 
			
		||||
	document.getElementsByName("userabs")[0].checked = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var wtf_mode = false;
 | 
			
		||||
 | 
			
		||||
function fixdata(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function s2ab(s) {
 | 
			
		||||
	var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
 | 
			
		||||
	for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
 | 
			
		||||
	return [v, b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function get_radio_value( radioName ) {
 | 
			
		||||
	var radios = document.getElementsByName( radioName );
 | 
			
		||||
	for( var i = 0; i < radios.length; i++ ) {
 | 
			
		||||
		if( radios[i].checked || radios.length === 1 ) {
 | 
			
		||||
			return radios[i].value;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_json(workbook) {
 | 
			
		||||
	var result = {};
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var roa = X.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(roa.length > 0){
 | 
			
		||||
			result[sheetName] = roa;
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_csv(workbook) {
 | 
			
		||||
	var result = [];
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(csv.length > 0){
 | 
			
		||||
			result.push("SHEET: " + sheetName);
 | 
			
		||||
			result.push("");
 | 
			
		||||
			result.push(csv);
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result.join("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_formulae(workbook) {
 | 
			
		||||
	var result = [];
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(formulae.length > 0){
 | 
			
		||||
			result.push("SHEET: " + sheetName);
 | 
			
		||||
			result.push("");
 | 
			
		||||
			result.push(formulae.join("\n"));
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result.join("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var tarea = document.getElementById('b64data');
 | 
			
		||||
function b64it() {
 | 
			
		||||
	if(typeof console !== 'undefined') console.log("onload", new Date());
 | 
			
		||||
	var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
 | 
			
		||||
	process_wb(wb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function process_wb(wb) {
 | 
			
		||||
	var output = "";
 | 
			
		||||
	switch(get_radio_value("format")) {
 | 
			
		||||
		case "json":
 | 
			
		||||
			output = JSON.stringify(to_json(wb), 2, 2);
 | 
			
		||||
			break;
 | 
			
		||||
		case "form":
 | 
			
		||||
			output = to_formulae(wb);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			output = to_csv(wb);
 | 
			
		||||
	}
 | 
			
		||||
	if(out.innerText === undefined) out.textContent = output;
 | 
			
		||||
	else out.innerText = output;
 | 
			
		||||
	if(typeof console !== 'undefined') console.log("output", new Date());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var drop = document.getElementById('drop');
 | 
			
		||||
function handleDrop(e) {
 | 
			
		||||
	e.stopPropagation();
 | 
			
		||||
	e.preventDefault();
 | 
			
		||||
	rABS = document.getElementsByName("userabs")[0].checked;
 | 
			
		||||
	var files = e.dataTransfer.files;
 | 
			
		||||
	var f = files[0];
 | 
			
		||||
	{
 | 
			
		||||
		var reader = new FileReader();
 | 
			
		||||
		var name = f.name;
 | 
			
		||||
		reader.onload = function(e) {
 | 
			
		||||
			if(typeof console !== 'undefined') console.log("onload", new Date(), rABS);
 | 
			
		||||
			var data = e.target.result;
 | 
			
		||||
			{
 | 
			
		||||
				var wb;
 | 
			
		||||
				if(rABS) {
 | 
			
		||||
					wb = X.read(data, {type: 'binary'});
 | 
			
		||||
				} else {
 | 
			
		||||
					var arr = fixdata(data);
 | 
			
		||||
					wb = X.read(btoa(arr), {type: 'base64'});
 | 
			
		||||
				}
 | 
			
		||||
				process_wb(wb);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		if(rABS) reader.readAsBinaryString(f);
 | 
			
		||||
		else reader.readAsArrayBuffer(f);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function handleDragover(e) {
 | 
			
		||||
	e.stopPropagation();
 | 
			
		||||
	e.preventDefault();
 | 
			
		||||
	e.dataTransfer.dropEffect = 'copy';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(drop.addEventListener) {
 | 
			
		||||
	drop.addEventListener('dragenter', handleDragover, false);
 | 
			
		||||
	drop.addEventListener('dragover', handleDragover, false);
 | 
			
		||||
	drop.addEventListener('drop', handleDrop, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var xlf = document.getElementById('xlf');
 | 
			
		||||
function handleFile(e) {
 | 
			
		||||
	rABS = document.getElementsByName("userabs")[0].checked;
 | 
			
		||||
	var files = e.target.files;
 | 
			
		||||
	var f = files[0];
 | 
			
		||||
	{
 | 
			
		||||
		var reader = new FileReader();
 | 
			
		||||
		var name = f.name;
 | 
			
		||||
		reader.onload = function(e) {
 | 
			
		||||
			if(typeof console !== 'undefined') console.log("onload", new Date(), rABS);
 | 
			
		||||
			var data = e.target.result;
 | 
			
		||||
			{
 | 
			
		||||
				var wb;
 | 
			
		||||
				if(rABS) {
 | 
			
		||||
					wb = X.read(data, {type: 'binary'});
 | 
			
		||||
				} else {
 | 
			
		||||
					var arr = fixdata(data);
 | 
			
		||||
					wb = X.read(btoa(arr), {type: 'base64'});
 | 
			
		||||
				}
 | 
			
		||||
				process_wb(wb);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		if(rABS) reader.readAsBinaryString(f);
 | 
			
		||||
		else reader.readAsArrayBuffer(f);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										2
									
								
								demos/webpack/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								demos/webpack/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
webpack.js
 | 
			
		||||
webpack.min.js
 | 
			
		||||
							
								
								
									
										10
									
								
								demos/webpack/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								demos/webpack/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
TOOL=webpack
 | 
			
		||||
.PHONY: all
 | 
			
		||||
all: $(TOOL).min.js
 | 
			
		||||
 | 
			
		||||
$(TOOL).min.js: $(TOOL).js
 | 
			
		||||
	uglifyjs $< > $@
 | 
			
		||||
 | 
			
		||||
.PHONY: $(TOOL).js
 | 
			
		||||
$(TOOL).js:
 | 
			
		||||
	webpack main.js --output-filename $@ --display-modules
 | 
			
		||||
							
								
								
									
										3
									
								
								demos/webpack/main.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								demos/webpack/main.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
var XLSX = require('../../');
 | 
			
		||||
console.log("it works!");
 | 
			
		||||
module.exports = XLSX;
 | 
			
		||||
							
								
								
									
										19
									
								
								demos/webpack/webpack.config.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										19
									
								
								demos/webpack/webpack.config.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
	output: {
 | 
			
		||||
		libraryTarget: 'var',
 | 
			
		||||
		library: 'XLSX'
 | 
			
		||||
	},
 | 
			
		||||
	module: {
 | 
			
		||||
		noParse: [/jszip.js$/]
 | 
			
		||||
	},
 | 
			
		||||
	node: {
 | 
			
		||||
		fs: false,
 | 
			
		||||
		Buffer: false
 | 
			
		||||
	},
 | 
			
		||||
	externals: [
 | 
			
		||||
		{
 | 
			
		||||
			'./cptable': 'var cptable',
 | 
			
		||||
			'../xlsx.js': 'var _XLSX'
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										278
									
								
								demos/webpack/webpack.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										278
									
								
								demos/webpack/webpack.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,278 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!-- xlsx.js (C) 2013-present  SheetJS http://sheetjs.com -->
 | 
			
		||||
<!-- vim: set ts=2: -->
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 | 
			
		||||
<title>JS-XLSX Live Demo</title>
 | 
			
		||||
<style>
 | 
			
		||||
#drop{
 | 
			
		||||
	border:2px dashed #bbb;
 | 
			
		||||
	-moz-border-radius:5px;
 | 
			
		||||
	-webkit-border-radius:5px;
 | 
			
		||||
	border-radius:5px;
 | 
			
		||||
	padding:25px;
 | 
			
		||||
	text-align:center;
 | 
			
		||||
	font:20pt bold,"Vollkorn";color:#bbb
 | 
			
		||||
}
 | 
			
		||||
#b64data{
 | 
			
		||||
	width:100%;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<b>JS-XLSX Live Demo</b><br />
 | 
			
		||||
Output Format:
 | 
			
		||||
<select name="format">
 | 
			
		||||
<option value="csv" selected> CSV</option>
 | 
			
		||||
<option value="json"> JSON</option>
 | 
			
		||||
<option value="form"> FORMULAE</option>
 | 
			
		||||
</select><br />
 | 
			
		||||
 | 
			
		||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
 | 
			
		||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
 | 
			
		||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
 | 
			
		||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
 | 
			
		||||
Advanced Demo Options: <br />
 | 
			
		||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked><br />
 | 
			
		||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked><br />
 | 
			
		||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
 | 
			
		||||
<pre id="out"></pre>
 | 
			
		||||
<br />
 | 
			
		||||
<script src="webpack.min.js"></script>
 | 
			
		||||
<script>
 | 
			
		||||
var X = XLSX;
 | 
			
		||||
var XW = {
 | 
			
		||||
	/* worker message */
 | 
			
		||||
	msg: 'xlsx',
 | 
			
		||||
	/* worker scripts */
 | 
			
		||||
	rABS: './xlsxworker2.js',
 | 
			
		||||
	norABS: './xlsxworker1.js',
 | 
			
		||||
	noxfer: './xlsxworker.js'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
 | 
			
		||||
if(!rABS) {
 | 
			
		||||
	document.getElementsByName("userabs")[0].disabled = true;
 | 
			
		||||
	document.getElementsByName("userabs")[0].checked = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var use_worker = typeof Worker !== 'undefined';
 | 
			
		||||
if(!use_worker) {
 | 
			
		||||
	document.getElementsByName("useworker")[0].disabled = true;
 | 
			
		||||
	document.getElementsByName("useworker")[0].checked = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var transferable = use_worker;
 | 
			
		||||
if(!transferable) {
 | 
			
		||||
	document.getElementsByName("xferable")[0].disabled = true;
 | 
			
		||||
	document.getElementsByName("xferable")[0].checked = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var wtf_mode = false;
 | 
			
		||||
 | 
			
		||||
function fixdata(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function s2ab(s) {
 | 
			
		||||
	var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
 | 
			
		||||
	for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
 | 
			
		||||
	return [v, b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function xw_noxfer(data, cb) {
 | 
			
		||||
	var worker = new Worker(XW.noxfer);
 | 
			
		||||
	worker.onmessage = function(e) {
 | 
			
		||||
		switch(e.data.t) {
 | 
			
		||||
			case 'ready': break;
 | 
			
		||||
			case 'e': console.error(e.data.d); break;
 | 
			
		||||
			case XW.msg: cb(JSON.parse(e.data.d)); break;
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
	var arr = rABS ? data : btoa(fixdata(data));
 | 
			
		||||
	worker.postMessage({d:arr,b:rABS});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function xw_xfer(data, cb) {
 | 
			
		||||
	var worker = new Worker(rABS ? XW.rABS : XW.norABS);
 | 
			
		||||
	worker.onmessage = function(e) {
 | 
			
		||||
		switch(e.data.t) {
 | 
			
		||||
			case 'ready': break;
 | 
			
		||||
			case 'e': console.error(e.data.d); break;
 | 
			
		||||
			default: xx=ab2str(e.data).replace(/\n/g,"\\n").replace(/\r/g,"\\r"); console.log("done"); cb(JSON.parse(xx)); break;
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
	if(rABS) {
 | 
			
		||||
		var val = s2ab(data);
 | 
			
		||||
		worker.postMessage(val[1], [val[1]]);
 | 
			
		||||
	} else {
 | 
			
		||||
		worker.postMessage(data, [data]);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function xw(data, cb) {
 | 
			
		||||
	transferable = document.getElementsByName("xferable")[0].checked;
 | 
			
		||||
	if(transferable) xw_xfer(data, cb);
 | 
			
		||||
	else xw_noxfer(data, cb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function get_radio_value( radioName ) {
 | 
			
		||||
	var radios = document.getElementsByName( radioName );
 | 
			
		||||
	for( var i = 0; i < radios.length; i++ ) {
 | 
			
		||||
		if( radios[i].checked || radios.length === 1 ) {
 | 
			
		||||
			return radios[i].value;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_json(workbook) {
 | 
			
		||||
	var result = {};
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var roa = X.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(roa.length > 0){
 | 
			
		||||
			result[sheetName] = roa;
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_csv(workbook) {
 | 
			
		||||
	var result = [];
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(csv.length > 0){
 | 
			
		||||
			result.push("SHEET: " + sheetName);
 | 
			
		||||
			result.push("");
 | 
			
		||||
			result.push(csv);
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result.join("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function to_formulae(workbook) {
 | 
			
		||||
	var result = [];
 | 
			
		||||
	workbook.SheetNames.forEach(function(sheetName) {
 | 
			
		||||
		var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
 | 
			
		||||
		if(formulae.length > 0){
 | 
			
		||||
			result.push("SHEET: " + sheetName);
 | 
			
		||||
			result.push("");
 | 
			
		||||
			result.push(formulae.join("\n"));
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
	return result.join("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var tarea = document.getElementById('b64data');
 | 
			
		||||
function b64it() {
 | 
			
		||||
	if(typeof console !== 'undefined') console.log("onload", new Date());
 | 
			
		||||
	var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
 | 
			
		||||
	process_wb(wb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function process_wb(wb) {
 | 
			
		||||
	var output = "";
 | 
			
		||||
	switch(get_radio_value("format")) {
 | 
			
		||||
		case "json":
 | 
			
		||||
			output = JSON.stringify(to_json(wb), 2, 2);
 | 
			
		||||
			break;
 | 
			
		||||
		case "form":
 | 
			
		||||
			output = to_formulae(wb);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			output = to_csv(wb);
 | 
			
		||||
	}
 | 
			
		||||
	if(out.innerText === undefined) out.textContent = output;
 | 
			
		||||
	else out.innerText = output;
 | 
			
		||||
	if(typeof console !== 'undefined') console.log("output", new Date());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var drop = document.getElementById('drop');
 | 
			
		||||
function handleDrop(e) {
 | 
			
		||||
	e.stopPropagation();
 | 
			
		||||
	e.preventDefault();
 | 
			
		||||
	rABS = document.getElementsByName("userabs")[0].checked;
 | 
			
		||||
	use_worker = document.getElementsByName("useworker")[0].checked;
 | 
			
		||||
	var files = e.dataTransfer.files;
 | 
			
		||||
	var f = files[0];
 | 
			
		||||
	{
 | 
			
		||||
		var reader = new FileReader();
 | 
			
		||||
		var name = f.name;
 | 
			
		||||
		reader.onload = function(e) {
 | 
			
		||||
			if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
 | 
			
		||||
			var data = e.target.result;
 | 
			
		||||
			if(use_worker) {
 | 
			
		||||
				xw(data, process_wb);
 | 
			
		||||
			} else {
 | 
			
		||||
				var wb;
 | 
			
		||||
				if(rABS) {
 | 
			
		||||
					wb = X.read(data, {type: 'binary'});
 | 
			
		||||
				} else {
 | 
			
		||||
					var arr = fixdata(data);
 | 
			
		||||
					wb = X.read(btoa(arr), {type: 'base64'});
 | 
			
		||||
				}
 | 
			
		||||
				process_wb(wb);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		if(rABS) reader.readAsBinaryString(f);
 | 
			
		||||
		else reader.readAsArrayBuffer(f);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function handleDragover(e) {
 | 
			
		||||
	e.stopPropagation();
 | 
			
		||||
	e.preventDefault();
 | 
			
		||||
	e.dataTransfer.dropEffect = 'copy';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(drop.addEventListener) {
 | 
			
		||||
	drop.addEventListener('dragenter', handleDragover, false);
 | 
			
		||||
	drop.addEventListener('dragover', handleDragover, false);
 | 
			
		||||
	drop.addEventListener('drop', handleDrop, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var xlf = document.getElementById('xlf');
 | 
			
		||||
function handleFile(e) {
 | 
			
		||||
	rABS = document.getElementsByName("userabs")[0].checked;
 | 
			
		||||
	use_worker = document.getElementsByName("useworker")[0].checked;
 | 
			
		||||
	var files = e.target.files;
 | 
			
		||||
	var f = files[0];
 | 
			
		||||
	{
 | 
			
		||||
		var reader = new FileReader();
 | 
			
		||||
		var name = f.name;
 | 
			
		||||
		reader.onload = function(e) {
 | 
			
		||||
			if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
 | 
			
		||||
			var data = e.target.result;
 | 
			
		||||
			if(use_worker) {
 | 
			
		||||
				xw(data, process_wb);
 | 
			
		||||
			} else {
 | 
			
		||||
				var wb;
 | 
			
		||||
				if(rABS) {
 | 
			
		||||
					wb = X.read(data, {type: 'binary'});
 | 
			
		||||
				} else {
 | 
			
		||||
					var arr = fixdata(data);
 | 
			
		||||
					wb = X.read(btoa(arr), {type: 'base64'});
 | 
			
		||||
				}
 | 
			
		||||
				process_wb(wb);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		if(rABS) reader.readAsBinaryString(f);
 | 
			
		||||
		else reader.readAsArrayBuffer(f);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
 | 
			
		||||
</script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										11
									
								
								demos/webpack/xlsxworker.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								demos/webpack/xlsxworker.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
importScripts('webpack.min.js');
 | 
			
		||||
postMessage({t:"ready"});
 | 
			
		||||
 | 
			
		||||
onmessage = function (oEvent) {
 | 
			
		||||
  var v;
 | 
			
		||||
  try {
 | 
			
		||||
    v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
 | 
			
		||||
  } catch(e) { postMessage({t:"e",d:e.stack||e}); }
 | 
			
		||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										26
									
								
								demos/webpack/xlsxworker1.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								demos/webpack/xlsxworker1.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
importScripts('webpack.min.js');
 | 
			
		||||
postMessage({t:"ready"});
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function s2ab(s) {
 | 
			
		||||
  var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
 | 
			
		||||
  for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
 | 
			
		||||
  return [v, b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
onmessage = function (oEvent) {
 | 
			
		||||
  var v;
 | 
			
		||||
  try {
 | 
			
		||||
    v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
 | 
			
		||||
  } catch(e) { postMessage({t:"e",d:e.stack}); }
 | 
			
		||||
  var res = {t:"xlsx", d:JSON.stringify(v)};
 | 
			
		||||
  var r = s2ab(res.d)[1];
 | 
			
		||||
postMessage(r, [r]);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										26
									
								
								demos/webpack/xlsxworker2.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								demos/webpack/xlsxworker2.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
importScripts('webpack.min.js');
 | 
			
		||||
postMessage({t:"ready"});
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function s2ab(s) {
 | 
			
		||||
  var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
 | 
			
		||||
  for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
 | 
			
		||||
  return [v, b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
onmessage = function (oEvent) {
 | 
			
		||||
  var v;
 | 
			
		||||
  try {
 | 
			
		||||
    v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
 | 
			
		||||
  } catch(e) { postMessage({t:"e",d:e.stack}); }
 | 
			
		||||
  var res = {t:"xlsx", d:JSON.stringify(v)};
 | 
			
		||||
  var r = s2ab(res.d)[1];
 | 
			
		||||
postMessage(r, [r]);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										2
									
								
								dist/jszip.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/jszip.js
									
									
									
									
										vendored
									
									
								
							@ -9,7 +9,7 @@ Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/js
 | 
			
		||||
JSZip uses the library pako released under the MIT license :
 | 
			
		||||
https://github.com/nodeca/pako/blob/master/LICENSE
 | 
			
		||||
*/
 | 
			
		||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 | 
			
		||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd){JSZip=e();define([],e);}else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 | 
			
		||||
'use strict';
 | 
			
		||||
// private property
 | 
			
		||||
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								dist/ods.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								dist/ods.js
									
									
									
									
										vendored
									
									
								
							@ -7,10 +7,9 @@ var ODS = {};
 | 
			
		||||
var get_utils = function() {
 | 
			
		||||
	if(typeof XLSX !== 'undefined') return XLSX.utils;
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined') try {
 | 
			
		||||
		return require('../' + 'xlsx').utils;
 | 
			
		||||
		return require('../xlsx.js').utils;
 | 
			
		||||
	} catch(e) {
 | 
			
		||||
		try { return require('./' + 'xlsx').utils; }
 | 
			
		||||
		catch(ee) { return require('xl' + 'sx').utils; }
 | 
			
		||||
		return require('./xlsx.js').utils;
 | 
			
		||||
	}
 | 
			
		||||
	throw new Error("Cannot find XLSX utils");
 | 
			
		||||
};
 | 
			
		||||
@ -29,7 +28,7 @@ function dup(o) {
 | 
			
		||||
	for(var k in o) if(o.hasOwnProperty(k)) out[k] = dup(o[k]);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
function getdata(data) {
 | 
			
		||||
function getdatastr(data) {
 | 
			
		||||
	if(!data) return null;
 | 
			
		||||
	if(data.data) return data.data;
 | 
			
		||||
	if(data.asNodeBuffer && has_buf) return data.asNodeBuffer().toString('binary');
 | 
			
		||||
@ -38,6 +37,10 @@ function getdata(data) {
 | 
			
		||||
	return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ODS and friends only use text files in container */
 | 
			
		||||
function getdata(data) { return getdatastr(data); }
 | 
			
		||||
 | 
			
		||||
/* NOTE: unlike ECMA-376, OASIS does not comment on filename case sensitivity */
 | 
			
		||||
function safegetzipfile(zip, file) {
 | 
			
		||||
	var f = file; if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	f = file.toLowerCase(); if(zip.files[f]) return zip.files[f];
 | 
			
		||||
@ -61,8 +64,8 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
var attregexg=/[^\s?>\/]+=["'][^"]*['"]/g;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								dist/ods.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/ods.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/ods.min.map
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/ods.min.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										22
									
								
								dist/xlsx.core.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										22
									
								
								dist/xlsx.core.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										23
									
								
								dist/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										23
									
								
								dist/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										45
									
								
								dist/xlsx.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										45
									
								
								dist/xlsx.js
									
									
									
									
										vendored
									
									
								
							@ -4,10 +4,10 @@
 | 
			
		||||
/*jshint funcscope:true, eqnull:true */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.8.6';
 | 
			
		||||
XLSX.version = '0.8.7';
 | 
			
		||||
var current_codepage = 1200, current_cptable;
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel.js');
 | 
			
		||||
	current_cptable = cptable[current_codepage];
 | 
			
		||||
}
 | 
			
		||||
function reset_cp() { set_cp(1200); }
 | 
			
		||||
@ -1377,8 +1377,8 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
 | 
			
		||||
@ -1847,7 +1847,7 @@ var make_offcrypto = function(O, _crypto) {
 | 
			
		||||
	var crypto;
 | 
			
		||||
	if(typeof _crypto !== 'undefined') crypto = _crypto;
 | 
			
		||||
	else if(typeof require !== 'undefined') {
 | 
			
		||||
		try { crypto = require('cry'+'pto'); }
 | 
			
		||||
		try { crypto = require('crypto'); }
 | 
			
		||||
		catch(e) { crypto = null; }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -2933,7 +2933,7 @@ function parse_VtVecHeadingPair(blob) {
 | 
			
		||||
/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
 | 
			
		||||
function parse_dictionary(blob,CodePage) {
 | 
			
		||||
	var cnt = blob.read_shift(4);
 | 
			
		||||
	var dict/*{[number]:string}*/ = ({});
 | 
			
		||||
	var dict = ({});
 | 
			
		||||
	for(var j = 0; j != cnt; ++j) {
 | 
			
		||||
		var pid = blob.read_shift(4);
 | 
			
		||||
		var len = blob.read_shift(4);
 | 
			
		||||
@ -3014,7 +3014,7 @@ function parse_PropertySet(blob, PIDSI) {
 | 
			
		||||
	var NumProps = blob.read_shift(4);
 | 
			
		||||
	var Props = [], i = 0;
 | 
			
		||||
	var CodePage = 0;
 | 
			
		||||
	var Dictionary = -1, DictObj/*{[number]:string}*/ = ({});
 | 
			
		||||
	var Dictionary = -1, DictObj = ({});
 | 
			
		||||
	for(i = 0; i != NumProps; ++i) {
 | 
			
		||||
		var PropID = blob.read_shift(4);
 | 
			
		||||
		var Offset = blob.read_shift(4);
 | 
			
		||||
@ -6215,6 +6215,7 @@ function parse_FormulaValue(blob) {
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.103 */
 | 
			
		||||
function parse_RgbExtra(blob, length, rgce, opts) {
 | 
			
		||||
	if(opts.biff < 8) return parsenoop(blob, length);
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var o = [];
 | 
			
		||||
	for(var i = 0; i !== rgce.length; ++i) {
 | 
			
		||||
@ -6282,7 +6283,6 @@ function parse_ArrayParsedFormula(blob, length, opts, ref) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.104 */
 | 
			
		||||
var gcnt = 0;
 | 
			
		||||
function parse_Rgce(blob, length, opts) {
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var R, id, ptgs = [];
 | 
			
		||||
@ -6550,6 +6550,7 @@ function stringify_formula(formula, range, cell, supbooks, opts) {
 | 
			
		||||
 | 
			
		||||
			/* 2.5.198.38 */
 | 
			
		||||
			case 'PtgAttrSpace':
 | 
			
		||||
			/* 2.5.198.39 */
 | 
			
		||||
			case 'PtgAttrSpaceSemi':
 | 
			
		||||
				last_sp = ff;
 | 
			
		||||
				break;
 | 
			
		||||
@ -10205,6 +10206,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;
 | 
			
		||||
		var R = XLSRecordEnum[RecordType];
 | 
			
		||||
		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | 
			
		||||
		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | 
			
		||||
		if(R && R.f) {
 | 
			
		||||
			if(options.bookSheets) {
 | 
			
		||||
				if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;
 | 
			
		||||
@ -10298,12 +10300,13 @@ function parse_workbook(blob, options) {
 | 
			
		||||
				} break;
 | 
			
		||||
				case 'BOF': {
 | 
			
		||||
					if(opts.biff !== 8){}
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0009) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0209) opts.biff = 3;
 | 
			
		||||
					else if(RecordType  === 0x0409) opts.biff = 4;
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0600) opts.biff = 8;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					if(file_depth++) break;
 | 
			
		||||
					cell_valid = true;
 | 
			
		||||
					out = {};
 | 
			
		||||
@ -12107,18 +12110,23 @@ function write_csv_str(wb, o) {
 | 
			
		||||
	return sheet_to_csv(wb.Sheets[wb.SheetNames[idx]], o);
 | 
			
		||||
}
 | 
			
		||||
/* Helper functions to call out to ODS */
 | 
			
		||||
 | 
			
		||||
function get_ods() {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./ods.js');
 | 
			
		||||
	return ODS;
 | 
			
		||||
}
 | 
			
		||||
function parse_ods(zip, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_ods(zip, opts);
 | 
			
		||||
}
 | 
			
		||||
function write_ods(wb, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.write_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.write_ods(wb, opts);
 | 
			
		||||
}
 | 
			
		||||
function parse_fods(data, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_fods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_fods(data, opts);
 | 
			
		||||
}
 | 
			
		||||
@ -12533,9 +12541,12 @@ function fix_cell(cstr) { return fix_col(fix_row(cstr)); }
 | 
			
		||||
function unfix_cell(cstr) { return unfix_col(unfix_row(cstr)); }
 | 
			
		||||
function decode_range(range) { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }
 | 
			
		||||
function encode_range(cs,ce) {
 | 
			
		||||
	if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);
 | 
			
		||||
	if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);
 | 
			
		||||
	return cs == ce ? cs : cs + ":" + ce;
 | 
			
		||||
	if(typeof ce === 'undefined' || typeof ce === 'number') {
 | 
			
		||||
return encode_range(cs.s, cs.e);
 | 
			
		||||
	}
 | 
			
		||||
if(typeof cs !== 'string') cs = encode_cell((cs));
 | 
			
		||||
	if(typeof ce !== 'string') ce = encode_cell((ce));
 | 
			
		||||
return cs == ce ? cs : cs + ":" + ce;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function safe_decode_range(range) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								dist/xlsx.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								dist/xlsx.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.min.map
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.min.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										11
									
								
								index.html
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								index.html
									
									
									
									
									
								
							@ -21,18 +21,15 @@
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<b>JS-XLSX (XLSX/XLSB/XLSM/XLS/XML/ODS) Live Demo</b><br />
 | 
			
		||||
<b>JS-XLSX Live Demo</b><br />
 | 
			
		||||
Output Format:
 | 
			
		||||
<select name="format">
 | 
			
		||||
<option value="csv" selected> CSV</option>
 | 
			
		||||
<option value="json"> JSON</option>
 | 
			
		||||
<option value="form"> FORMULAE</option>
 | 
			
		||||
</select><br />
 | 
			
		||||
<!--<input type="radio" name="format" value="csv" checked> CSV<br>
 | 
			
		||||
<input type="radio" name="format" value="json"> JSON<br>
 | 
			
		||||
<input type="radio" name="format" value="form"> FORMULAE<br> -->
 | 
			
		||||
 | 
			
		||||
<div id="drop">Drop an XLSX / XLSM / XLSB / ODS / XLS / XML file here to see sheet data</div>
 | 
			
		||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
 | 
			
		||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
 | 
			
		||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
 | 
			
		||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
 | 
			
		||||
@ -199,7 +196,7 @@ function process_wb(wb) {
 | 
			
		||||
			output = to_formulae(wb);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
		output = to_csv(wb);
 | 
			
		||||
			output = to_csv(wb);
 | 
			
		||||
	}
 | 
			
		||||
	if(out.innerText === undefined) out.textContent = output;
 | 
			
		||||
	else out.innerText = output;
 | 
			
		||||
@ -270,7 +267,7 @@ function handleFile(e) {
 | 
			
		||||
				if(rABS) {
 | 
			
		||||
					wb = X.read(data, {type: 'binary'});
 | 
			
		||||
				} else {
 | 
			
		||||
				var arr = fixdata(data);
 | 
			
		||||
					var arr = fixdata(data);
 | 
			
		||||
					wb = X.read(btoa(arr), {type: 'base64'});
 | 
			
		||||
				}
 | 
			
		||||
				process_wb(wb);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								jszip.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								jszip.js
									
									
									
									
									
								
							@ -9,7 +9,7 @@ Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/js
 | 
			
		||||
JSZip uses the library pako released under the MIT license :
 | 
			
		||||
https://github.com/nodeca/pako/blob/master/LICENSE
 | 
			
		||||
*/
 | 
			
		||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 | 
			
		||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd){JSZip=e();define([],e);}else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 | 
			
		||||
'use strict';
 | 
			
		||||
// private property
 | 
			
		||||
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								ods.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										21
									
								
								ods.flow.js
									
									
									
									
									
								
							@ -8,10 +8,9 @@ var ODS = {};
 | 
			
		||||
var get_utils = function() {
 | 
			
		||||
	if(typeof XLSX !== 'undefined') return XLSX.utils;
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined') try {
 | 
			
		||||
		return require('../' + 'xlsx').utils;
 | 
			
		||||
		return require('../xlsx.js').utils;
 | 
			
		||||
	} catch(e) {
 | 
			
		||||
		try { return require('./' + 'xlsx').utils; }
 | 
			
		||||
		catch(ee) { return require('xl' + 'sx').utils; }
 | 
			
		||||
		return require('./xlsx.js').utils;
 | 
			
		||||
	}
 | 
			
		||||
	throw new Error("Cannot find XLSX utils");
 | 
			
		||||
};
 | 
			
		||||
@ -30,7 +29,7 @@ function dup(o/*:any*/)/*:any*/ {
 | 
			
		||||
	for(var k in o) if(o.hasOwnProperty(k)) out[k] = dup(o[k]);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
function getdata(data) {
 | 
			
		||||
function getdatastr(data)/*:?string*/ {
 | 
			
		||||
	if(!data) return null;
 | 
			
		||||
	if(data.data) return data.data;
 | 
			
		||||
	if(data.asNodeBuffer && has_buf) return data.asNodeBuffer().toString('binary');
 | 
			
		||||
@ -39,20 +38,24 @@ function getdata(data) {
 | 
			
		||||
	return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function safegetzipfile(zip, file) {
 | 
			
		||||
/* ODS and friends only use text files in container */
 | 
			
		||||
function getdata(data) { return getdatastr(data); }
 | 
			
		||||
 | 
			
		||||
/* NOTE: unlike ECMA-376, OASIS does not comment on filename case sensitivity */
 | 
			
		||||
function safegetzipfile(zip, file/*:string*/) {
 | 
			
		||||
	var f = file; if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	f = file.toLowerCase(); if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	f = f.replace(/\//g,'\\'); if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getzipfile(zip, file) {
 | 
			
		||||
function getzipfile(zip, file/*:string*/) {
 | 
			
		||||
	var o = safegetzipfile(zip, file);
 | 
			
		||||
	if(o == null) throw new Error("Cannot find file " + file + " in zip");
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getzipdata(zip, file, safe/*:?boolean*/) {
 | 
			
		||||
function getzipdata(zip, file/*:string*/, safe/*:?boolean*/) {
 | 
			
		||||
	if(!safe) return getdata(getzipfile(zip, file));
 | 
			
		||||
	if(!file) return null;
 | 
			
		||||
	try { return getzipdata(zip, file); } catch(e) { return null; }
 | 
			
		||||
@ -63,8 +66,8 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
var attregexg=/[^\s?>\/]+=["'][^"]*['"]/g;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								ods.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								ods.js
									
									
									
									
									
								
							@ -7,10 +7,9 @@ var ODS = {};
 | 
			
		||||
var get_utils = function() {
 | 
			
		||||
	if(typeof XLSX !== 'undefined') return XLSX.utils;
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined') try {
 | 
			
		||||
		return require('../' + 'xlsx').utils;
 | 
			
		||||
		return require('../xlsx.js').utils;
 | 
			
		||||
	} catch(e) {
 | 
			
		||||
		try { return require('./' + 'xlsx').utils; }
 | 
			
		||||
		catch(ee) { return require('xl' + 'sx').utils; }
 | 
			
		||||
		return require('./xlsx.js').utils;
 | 
			
		||||
	}
 | 
			
		||||
	throw new Error("Cannot find XLSX utils");
 | 
			
		||||
};
 | 
			
		||||
@ -29,7 +28,7 @@ function dup(o) {
 | 
			
		||||
	for(var k in o) if(o.hasOwnProperty(k)) out[k] = dup(o[k]);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
function getdata(data) {
 | 
			
		||||
function getdatastr(data) {
 | 
			
		||||
	if(!data) return null;
 | 
			
		||||
	if(data.data) return data.data;
 | 
			
		||||
	if(data.asNodeBuffer && has_buf) return data.asNodeBuffer().toString('binary');
 | 
			
		||||
@ -38,6 +37,10 @@ function getdata(data) {
 | 
			
		||||
	return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ODS and friends only use text files in container */
 | 
			
		||||
function getdata(data) { return getdatastr(data); }
 | 
			
		||||
 | 
			
		||||
/* NOTE: unlike ECMA-376, OASIS does not comment on filename case sensitivity */
 | 
			
		||||
function safegetzipfile(zip, file) {
 | 
			
		||||
	var f = file; if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	f = file.toLowerCase(); if(zip.files[f]) return zip.files[f];
 | 
			
		||||
@ -61,8 +64,8 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
var attregexg=/[^\s?>\/]+=["'][^"]*['"]/g;
 | 
			
		||||
 | 
			
		||||
@ -2,10 +2,9 @@
 | 
			
		||||
var get_utils = function() {
 | 
			
		||||
	if(typeof XLSX !== 'undefined') return XLSX.utils;
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined') try {
 | 
			
		||||
		return require('../' + 'xlsx').utils;
 | 
			
		||||
		return require('../xlsx.js').utils;
 | 
			
		||||
	} catch(e) {
 | 
			
		||||
		try { return require('./' + 'xlsx').utils; }
 | 
			
		||||
		catch(ee) { return require('xl' + 'sx').utils; }
 | 
			
		||||
		return require('./xlsx.js').utils;
 | 
			
		||||
	}
 | 
			
		||||
	throw new Error("Cannot find XLSX utils");
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
function getdata(data) {
 | 
			
		||||
function getdatastr(data)/*:?string*/ {
 | 
			
		||||
	if(!data) return null;
 | 
			
		||||
	if(data.data) return data.data;
 | 
			
		||||
	if(data.asNodeBuffer && has_buf) return data.asNodeBuffer().toString('binary');
 | 
			
		||||
@ -7,20 +7,24 @@ function getdata(data) {
 | 
			
		||||
	return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function safegetzipfile(zip, file) {
 | 
			
		||||
/* ODS and friends only use text files in container */
 | 
			
		||||
function getdata(data) { return getdatastr(data); }
 | 
			
		||||
 | 
			
		||||
/* NOTE: unlike ECMA-376, OASIS does not comment on filename case sensitivity */
 | 
			
		||||
function safegetzipfile(zip, file/*:string*/) {
 | 
			
		||||
	var f = file; if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	f = file.toLowerCase(); if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	f = f.replace(/\//g,'\\'); if(zip.files[f]) return zip.files[f];
 | 
			
		||||
	return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getzipfile(zip, file) {
 | 
			
		||||
function getzipfile(zip, file/*:string*/) {
 | 
			
		||||
	var o = safegetzipfile(zip, file);
 | 
			
		||||
	if(o == null) throw new Error("Cannot find file " + file + " in zip");
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getzipdata(zip, file, safe/*:?boolean*/) {
 | 
			
		||||
function getzipdata(zip, file/*:string*/, safe/*:?boolean*/) {
 | 
			
		||||
	if(!safe) return getdata(getzipfile(zip, file));
 | 
			
		||||
	if(!file) return null;
 | 
			
		||||
	try { return getzipdata(zip, file); } catch(e) { return null; }
 | 
			
		||||
@ -31,7 +35,7 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "xlsx",
 | 
			
		||||
	"version": "0.8.6",
 | 
			
		||||
	"version": "0.8.7",
 | 
			
		||||
	"author": "sheetjs",
 | 
			
		||||
	"description": "Excel (XLSB/XLSX/XLSM/XLS/XML) and ODS (ODS/FODS/UOS) spreadsheet parser and writer",
 | 
			
		||||
	"keywords": [ "excel", "xls", "xlsx", "xlsb", "xlsm", "ods", "office", "spreadsheet" ],
 | 
			
		||||
@ -8,6 +8,12 @@
 | 
			
		||||
		"xlsx": "./bin/xlsx.njs"
 | 
			
		||||
	},
 | 
			
		||||
	"main": "./xlsx",
 | 
			
		||||
	"browser": {
 | 
			
		||||
		"node": false,
 | 
			
		||||
		"crypto": false,
 | 
			
		||||
		"fs": false,
 | 
			
		||||
		"../xlsx.js": false
 | 
			
		||||
	},
 | 
			
		||||
	"dependencies": {
 | 
			
		||||
		"exit-on-epipe":"",
 | 
			
		||||
		"ssf":"~0.8.1",
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,7 @@ BlankSheetTypes.xlsb.pending
 | 
			
		||||
ErrorTypes.xlsb
 | 
			
		||||
NumberFormatCondition.xlsb
 | 
			
		||||
RkNumber.xlsb
 | 
			
		||||
apachepoi_Simple.xlsb.pending
 | 
			
		||||
calendar_stress_test.xlsb.pending
 | 
			
		||||
cell_style_simple.xlsb
 | 
			
		||||
comments_stress_test.xlsb
 | 
			
		||||
@ -11,17 +12,20 @@ defined_names_simple.xlsb
 | 
			
		||||
formula_stress_test.xlsb
 | 
			
		||||
formulae_test_simple.xlsb
 | 
			
		||||
hyperlink_stress_test_2011.xlsb
 | 
			
		||||
large_strings.xlsb.pending
 | 
			
		||||
merge_cells.xlsb
 | 
			
		||||
named_ranges_2011.xlsb
 | 
			
		||||
number_format.xlsb
 | 
			
		||||
number_format_entities.xlsb
 | 
			
		||||
number_format_russian.xlsb
 | 
			
		||||
numfmt_1_russian.xlsb
 | 
			
		||||
pivot_table_named_range.xlsb
 | 
			
		||||
pivot_table_test.xlsb
 | 
			
		||||
rich_text_stress.xlsb
 | 
			
		||||
smart_tags_2007.xlsb
 | 
			
		||||
sushi.xlsb
 | 
			
		||||
text_and_numbers.xlsb
 | 
			
		||||
time_stress_test_1.xlsb.pending
 | 
			
		||||
xlsx-stream-d-date-cell.xlsb
 | 
			
		||||
2013/apachepoi_29982.xls.xlsb
 | 
			
		||||
2013/apachepoi_43251.xls.xlsb
 | 
			
		||||
@ -247,6 +251,7 @@ mixed_sheets.xlsx
 | 
			
		||||
named_ranges_2011.xlsx
 | 
			
		||||
number_format_entities.xlsx
 | 
			
		||||
openpyxl_g_NameWithValueBug.xlsx
 | 
			
		||||
openpyxl_g_empty.xlsx.pending
 | 
			
		||||
openpyxl_g_empty-no-string.xlsx
 | 
			
		||||
openpyxl_g_empty-with-styles.xlsx
 | 
			
		||||
openpyxl_g_empty_libre.xlsx
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										51
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										51
									
								
								xlsx.flow.js
									
									
									
									
									
								
							@ -4,10 +4,10 @@
 | 
			
		||||
/*jshint funcscope:true, eqnull:true */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.8.6';
 | 
			
		||||
XLSX.version = '0.8.7';
 | 
			
		||||
var current_codepage = 1200, current_cptable;
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel.js');
 | 
			
		||||
	current_cptable = cptable[current_codepage];
 | 
			
		||||
}
 | 
			
		||||
function reset_cp() { set_cp(1200); }
 | 
			
		||||
@ -1419,8 +1419,8 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
 | 
			
		||||
@ -1889,7 +1889,7 @@ var make_offcrypto = function(O, _crypto) {
 | 
			
		||||
	var crypto;
 | 
			
		||||
	if(typeof _crypto !== 'undefined') crypto = _crypto;
 | 
			
		||||
	else if(typeof require !== 'undefined') {
 | 
			
		||||
		try { crypto = require('cry'+'pto'); }
 | 
			
		||||
		try { crypto = require('crypto'); }
 | 
			
		||||
		catch(e) { crypto = null; }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -2975,7 +2975,7 @@ function parse_VtVecHeadingPair(blob) {
 | 
			
		||||
/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
 | 
			
		||||
function parse_dictionary(blob,CodePage) {
 | 
			
		||||
	var cnt = blob.read_shift(4);
 | 
			
		||||
	var dict/*{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	var dict/*:{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	for(var j = 0; j != cnt; ++j) {
 | 
			
		||||
		var pid = blob.read_shift(4);
 | 
			
		||||
		var len = blob.read_shift(4);
 | 
			
		||||
@ -3056,7 +3056,7 @@ function parse_PropertySet(blob, PIDSI) {
 | 
			
		||||
	var NumProps = blob.read_shift(4);
 | 
			
		||||
	var Props = [], i = 0;
 | 
			
		||||
	var CodePage = 0;
 | 
			
		||||
	var Dictionary = -1, DictObj/*{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	var Dictionary = -1, DictObj/*:{[number]:string}*/ = ({}/*:any*/);
 | 
			
		||||
	for(i = 0; i != NumProps; ++i) {
 | 
			
		||||
		var PropID = blob.read_shift(4);
 | 
			
		||||
		var Offset = blob.read_shift(4);
 | 
			
		||||
@ -6257,6 +6257,7 @@ function parse_FormulaValue(blob) {
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.103 */
 | 
			
		||||
function parse_RgbExtra(blob, length, rgce, opts) {
 | 
			
		||||
	if(opts.biff < 8) return parsenoop(blob, length);
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var o = [];
 | 
			
		||||
	for(var i = 0; i !== rgce.length; ++i) {
 | 
			
		||||
@ -6324,7 +6325,6 @@ function parse_ArrayParsedFormula(blob, length, opts, ref) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.104 */
 | 
			
		||||
var gcnt = 0;
 | 
			
		||||
function parse_Rgce(blob, length, opts) {
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var R, id, ptgs = [];
 | 
			
		||||
@ -6592,6 +6592,7 @@ function stringify_formula(formula, range, cell, supbooks, opts) {
 | 
			
		||||
 | 
			
		||||
			/* 2.5.198.38 */
 | 
			
		||||
			case 'PtgAttrSpace':
 | 
			
		||||
			/* 2.5.198.39 */
 | 
			
		||||
			case 'PtgAttrSpaceSemi':
 | 
			
		||||
				last_sp = ff;
 | 
			
		||||
				break;
 | 
			
		||||
@ -10064,7 +10065,7 @@ function parse_xlml_xml(d, opts) {
 | 
			
		||||
			}
 | 
			
		||||
			if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");
 | 
			
		||||
	}
 | 
			
		||||
	var out = ({}/*:Any*/);
 | 
			
		||||
	var out = ({}/*:any*/);
 | 
			
		||||
	if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;
 | 
			
		||||
	out.SheetNames = sheetnames;
 | 
			
		||||
	out.SSF = SSF.get_table();
 | 
			
		||||
@ -10249,6 +10250,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;
 | 
			
		||||
		var R = XLSRecordEnum[RecordType];
 | 
			
		||||
		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | 
			
		||||
		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | 
			
		||||
		if(R && R.f) {
 | 
			
		||||
			if(options.bookSheets) {
 | 
			
		||||
				if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;
 | 
			
		||||
@ -10342,12 +10344,13 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
				} break;
 | 
			
		||||
				case 'BOF': {
 | 
			
		||||
					if(opts.biff !== 8){}
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0009) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0209) opts.biff = 3;
 | 
			
		||||
					else if(RecordType  === 0x0409) opts.biff = 4;
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0600) opts.biff = 8;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					if(file_depth++) break;
 | 
			
		||||
					cell_valid = true;
 | 
			
		||||
					out = {};
 | 
			
		||||
@ -12151,18 +12154,23 @@ function write_csv_str(wb/*:Workbook*/, o/*:WriteOpts*/) {
 | 
			
		||||
	return sheet_to_csv(wb.Sheets[wb.SheetNames[idx]], o);
 | 
			
		||||
}
 | 
			
		||||
/* Helper functions to call out to ODS */
 | 
			
		||||
 | 
			
		||||
function get_ods() {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./ods.js');
 | 
			
		||||
	return ODS;
 | 
			
		||||
}
 | 
			
		||||
function parse_ods(zip, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_ods(zip, opts);
 | 
			
		||||
}
 | 
			
		||||
function write_ods(wb, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.write_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.write_ods(wb, opts);
 | 
			
		||||
}
 | 
			
		||||
function parse_fods(data, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_fods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_fods(data, opts);
 | 
			
		||||
}
 | 
			
		||||
@ -12574,13 +12582,20 @@ function unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\$([A-Z])
 | 
			
		||||
 | 
			
		||||
function split_cell(cstr/*:string*/)/*:Array<string>*/ { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); }
 | 
			
		||||
function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
 | 
			
		||||
function encode_cell(cell/*:Cell*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
 | 
			
		||||
function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
 | 
			
		||||
function fix_cell(cstr/*:string*/)/*:string*/ { return fix_col(fix_row(cstr)); }
 | 
			
		||||
function unfix_cell(cstr/*:string*/)/*:string*/ { return unfix_col(unfix_row(cstr)); }
 | 
			
		||||
function decode_range(range/*:string*/)/*:Range*/ { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }
 | 
			
		||||
function encode_range(cs/*:any*/,ce/*:?any*/)/*:string*/ {
 | 
			
		||||
	if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);
 | 
			
		||||
	if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);
 | 
			
		||||
	if(typeof ce === 'undefined' || typeof ce === 'number') {
 | 
			
		||||
/*:: if(!(cs instanceof Range)) throw "unreachable"; */
 | 
			
		||||
		return encode_range(cs.s, cs.e);
 | 
			
		||||
	}
 | 
			
		||||
/*:: if((cs instanceof Range)) throw "unreachable"; */
 | 
			
		||||
	if(typeof cs !== 'string') cs = encode_cell((cs/*:any*/));
 | 
			
		||||
	if(typeof ce !== 'string') ce = encode_cell((ce/*:any*/));
 | 
			
		||||
/*:: if(typeof cs !== 'string') throw "unreachable"; */
 | 
			
		||||
/*:: if(typeof ce !== 'string') throw "unreachable"; */
 | 
			
		||||
	return cs == ce ? cs : cs + ":" + ce;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								xlsx.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										45
									
								
								xlsx.js
									
									
									
									
									
								
							@ -4,10 +4,10 @@
 | 
			
		||||
/*jshint funcscope:true, eqnull:true */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.8.6';
 | 
			
		||||
XLSX.version = '0.8.7';
 | 
			
		||||
var current_codepage = 1200, current_cptable;
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');
 | 
			
		||||
	if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel.js');
 | 
			
		||||
	current_cptable = cptable[current_codepage];
 | 
			
		||||
}
 | 
			
		||||
function reset_cp() { set_cp(1200); }
 | 
			
		||||
@ -1377,8 +1377,8 @@ var _fs, jszip;
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
if (typeof exports !== 'undefined') {
 | 
			
		||||
	if (typeof module !== 'undefined' && module.exports) {
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
 | 
			
		||||
		_fs = require('f'+'s');
 | 
			
		||||
		if(typeof jszip === 'undefined') jszip = require('./jszip.js');
 | 
			
		||||
		_fs = require('fs');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
 | 
			
		||||
@ -1847,7 +1847,7 @@ var make_offcrypto = function(O, _crypto) {
 | 
			
		||||
	var crypto;
 | 
			
		||||
	if(typeof _crypto !== 'undefined') crypto = _crypto;
 | 
			
		||||
	else if(typeof require !== 'undefined') {
 | 
			
		||||
		try { crypto = require('cry'+'pto'); }
 | 
			
		||||
		try { crypto = require('crypto'); }
 | 
			
		||||
		catch(e) { crypto = null; }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -2933,7 +2933,7 @@ function parse_VtVecHeadingPair(blob) {
 | 
			
		||||
/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
 | 
			
		||||
function parse_dictionary(blob,CodePage) {
 | 
			
		||||
	var cnt = blob.read_shift(4);
 | 
			
		||||
	var dict/*{[number]:string}*/ = ({});
 | 
			
		||||
	var dict = ({});
 | 
			
		||||
	for(var j = 0; j != cnt; ++j) {
 | 
			
		||||
		var pid = blob.read_shift(4);
 | 
			
		||||
		var len = blob.read_shift(4);
 | 
			
		||||
@ -3014,7 +3014,7 @@ function parse_PropertySet(blob, PIDSI) {
 | 
			
		||||
	var NumProps = blob.read_shift(4);
 | 
			
		||||
	var Props = [], i = 0;
 | 
			
		||||
	var CodePage = 0;
 | 
			
		||||
	var Dictionary = -1, DictObj/*{[number]:string}*/ = ({});
 | 
			
		||||
	var Dictionary = -1, DictObj = ({});
 | 
			
		||||
	for(i = 0; i != NumProps; ++i) {
 | 
			
		||||
		var PropID = blob.read_shift(4);
 | 
			
		||||
		var Offset = blob.read_shift(4);
 | 
			
		||||
@ -6215,6 +6215,7 @@ function parse_FormulaValue(blob) {
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.103 */
 | 
			
		||||
function parse_RgbExtra(blob, length, rgce, opts) {
 | 
			
		||||
	if(opts.biff < 8) return parsenoop(blob, length);
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var o = [];
 | 
			
		||||
	for(var i = 0; i !== rgce.length; ++i) {
 | 
			
		||||
@ -6282,7 +6283,6 @@ function parse_ArrayParsedFormula(blob, length, opts, ref) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 2.5.198.104 */
 | 
			
		||||
var gcnt = 0;
 | 
			
		||||
function parse_Rgce(blob, length, opts) {
 | 
			
		||||
	var target = blob.l + length;
 | 
			
		||||
	var R, id, ptgs = [];
 | 
			
		||||
@ -6550,6 +6550,7 @@ function stringify_formula(formula, range, cell, supbooks, opts) {
 | 
			
		||||
 | 
			
		||||
			/* 2.5.198.38 */
 | 
			
		||||
			case 'PtgAttrSpace':
 | 
			
		||||
			/* 2.5.198.39 */
 | 
			
		||||
			case 'PtgAttrSpaceSemi':
 | 
			
		||||
				last_sp = ff;
 | 
			
		||||
				break;
 | 
			
		||||
@ -10205,6 +10206,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;
 | 
			
		||||
		var R = XLSRecordEnum[RecordType];
 | 
			
		||||
		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | 
			
		||||
		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | 
			
		||||
		if(R && R.f) {
 | 
			
		||||
			if(options.bookSheets) {
 | 
			
		||||
				if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;
 | 
			
		||||
@ -10298,12 +10300,13 @@ function parse_workbook(blob, options) {
 | 
			
		||||
				} break;
 | 
			
		||||
				case 'BOF': {
 | 
			
		||||
					if(opts.biff !== 8){}
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0009) opts.biff = 2;
 | 
			
		||||
					else if(RecordType  === 0x0209) opts.biff = 3;
 | 
			
		||||
					else if(RecordType  === 0x0409) opts.biff = 4;
 | 
			
		||||
					else if(val.BIFFVer === 0x0500) opts.biff = 5;
 | 
			
		||||
					else if(val.BIFFVer === 0x0600) opts.biff = 8;
 | 
			
		||||
					else if(val.BIFFVer === 0x0002) opts.biff = 2;
 | 
			
		||||
					else if(val.BIFFVer === 0x0007) opts.biff = 2;
 | 
			
		||||
					if(file_depth++) break;
 | 
			
		||||
					cell_valid = true;
 | 
			
		||||
					out = {};
 | 
			
		||||
@ -12107,18 +12110,23 @@ function write_csv_str(wb, o) {
 | 
			
		||||
	return sheet_to_csv(wb.Sheets[wb.SheetNames[idx]], o);
 | 
			
		||||
}
 | 
			
		||||
/* Helper functions to call out to ODS */
 | 
			
		||||
 | 
			
		||||
function get_ods() {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./ods.js');
 | 
			
		||||
	return ODS;
 | 
			
		||||
}
 | 
			
		||||
function parse_ods(zip, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_ods(zip, opts);
 | 
			
		||||
}
 | 
			
		||||
function write_ods(wb, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.write_ods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.write_ods(wb, opts);
 | 
			
		||||
}
 | 
			
		||||
function parse_fods(data, opts) {
 | 
			
		||||
	if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
 | 
			
		||||
	get_ods();
 | 
			
		||||
	if(typeof ODS === 'undefined' || !ODS.parse_fods) throw new Error("Unsupported ODS");
 | 
			
		||||
	return ODS.parse_fods(data, opts);
 | 
			
		||||
}
 | 
			
		||||
@ -12533,9 +12541,12 @@ function fix_cell(cstr) { return fix_col(fix_row(cstr)); }
 | 
			
		||||
function unfix_cell(cstr) { return unfix_col(unfix_row(cstr)); }
 | 
			
		||||
function decode_range(range) { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }
 | 
			
		||||
function encode_range(cs,ce) {
 | 
			
		||||
	if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);
 | 
			
		||||
	if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);
 | 
			
		||||
	return cs == ce ? cs : cs + ":" + ce;
 | 
			
		||||
	if(typeof ce === 'undefined' || typeof ce === 'number') {
 | 
			
		||||
return encode_range(cs.s, cs.e);
 | 
			
		||||
	}
 | 
			
		||||
if(typeof cs !== 'string') cs = encode_cell((cs));
 | 
			
		||||
	if(typeof ce !== 'string') ce = encode_cell((ce));
 | 
			
		||||
return cs == ce ? cs : cs + ":" + ce;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function safe_decode_range(range) {
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,8 @@ importScripts('dist/ods.js');
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,/*::(*/new Uint16Array(data.slice(l*w,l*w+w))/*:: :any)*/);
 | 
			
		||||
	o+=String.fromCharCode.apply(null, /*::(*/new Uint16Array(data.slice(l*w))/*:: :any)*/);
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,/*::(*/new Uint8Array(data.slice(l*w,l*w+w))/*:: :any)*/);
 | 
			
		||||
	o+=String.fromCharCode.apply(null, /*::(*/new Uint8Array(data.slice(l*w))/*:: :any)*/);
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,8 +9,8 @@ postMessage({t:"ready"});
 | 
			
		||||
 | 
			
		||||
function ab2str(data) {
 | 
			
		||||
	var o = "", l = 0, w = 10240;
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
 | 
			
		||||
	for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
 | 
			
		||||
	o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
 | 
			
		||||
	return o;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user