forked from sheetjs/sheetjs
		
	version bump 0.11.1: dist cleanup
- dist scripts properly export library - XLS/XLSB formulae quote sheet names containing spaces - skipHidden ported to streaming CSV write - updated codepage to 1.11.0 - flow and TS updates - webpack demo example using dist scripts - requirejs demo
This commit is contained in:
		
							parent
							
								
									0f39f2818f
								
							
						
					
					
						commit
						935821423f
					
				| @ -1,5 +1,6 @@ | ||||
| bits/ | ||||
| demos/ | ||||
| dist/ | ||||
| docbits/ | ||||
| misc/ | ||||
| node_modules/ | ||||
|  | ||||
							
								
								
									
										10
									
								
								Makefile
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								Makefile
									
									
									
									
									
								
							| @ -50,17 +50,17 @@ init: ## Initial setup for development | ||||
| 	git submodule foreach make | ||||
| 	mkdir -p tmp | ||||
| 
 | ||||
| DISTHDR=misc/suppress_export.js | ||||
| .PHONY: dist | ||||
| dist: dist-deps $(TARGET) bower.json ## Prepare JS files for distribution
 | ||||
| 	<$(TARGET) sed "s/require('stream')/{}/g;s/require('.*')/null/g" > dist/$(TARGET) | ||||
| 	<$(TARGET) sed "s/require('stream')/{}/g;s/require('....*')/undefined/g" > dist/$(TARGET) | ||||
| 	cp LICENSE dist/ | ||||
| 	uglifyjs dist/$(TARGET) $(UGLIFYOPTS) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)" | ||||
| 	uglifyjs $(DISTHDR) dist/$(TARGET) $(UGLIFYOPTS) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)" | ||||
| 	misc/strip_sourcemap.sh dist/$(LIB).min.js | ||||
| 	uglifyjs $(REQS) dist/$(TARGET) $(UGLIFYOPTS) -o dist/$(LIB).core.min.js --source-map dist/$(LIB).core.min.map --preamble "$$(head -n 1 bits/00_header.js)" | ||||
| 	uglifyjs $(DISTHDR) $(REQS) dist/$(TARGET) $(UGLIFYOPTS) -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 $(REQS) $(ADDONS) dist/$(TARGET) $(AUXTARGETS) $(UGLIFYOPTS) -o dist/$(LIB).full.min.js --source-map dist/$(LIB).full.min.map --preamble "$$(head -n 1 bits/00_header.js)" | ||||
| 	uglifyjs $(DISTHDR) $(REQS) $(ADDONS) dist/$(TARGET) $(AUXTARGETS) $(UGLIFYOPTS) -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: ## Copy dependencies for distribution
 | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| XLSX.version = '0.11.0'; | ||||
| XLSX.version = '0.11.1'; | ||||
|  | ||||
| @ -33,7 +33,7 @@ var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 | ||||
| var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; | ||||
| function datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch += 1462*24*60*60*1000; | ||||
| 	if(date1904) epoch -= 1462*24*60*60*1000; | ||||
| 	return (epoch - dnthresh) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| function numdate(v/*:number*/)/*:Date*/ { | ||||
|  | ||||
| @ -58,7 +58,7 @@ if(typeof JSZip !== 'undefined') jszip = JSZip; | ||||
| if (typeof exports !== 'undefined') { | ||||
| 	if (typeof module !== 'undefined' && module.exports) { | ||||
| 		if(typeof jszip === 'undefined') jszip = require('./jszip.js'); | ||||
| 		_fs = require('fs'); | ||||
| 		try { _fs = require('fs'); } catch(e) { } | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -28,8 +28,8 @@ function parse_VtStringBase(blob, stringType, pad) { | ||||
| 	return parse_lpstr(blob, stringType, pad); | ||||
| } | ||||
| 
 | ||||
| function parse_VtString(blob, t/*:number*/, pad/*:number*/) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); } | ||||
| function parse_VtUnalignedString(blob, t/*:number*/) { if(!t) throw new Error("dafuq?"); return parse_VtStringBase(blob, t, 0); } | ||||
| function parse_VtString(blob, t/*:number*/, pad/*:?boolean*/) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); } | ||||
| function parse_VtUnalignedString(blob, t/*:number*/) { if(!t) throw new Error("VtUnalignedString must have positive length"); return parse_VtStringBase(blob, t, 0); } | ||||
| 
 | ||||
| /* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */ | ||||
| function parse_VtVecUnalignedLpstrValue(blob) { | ||||
| @ -123,7 +123,7 @@ function parse_TypedPropertyValue(blob, type/*:number*/, _opts) { | ||||
| 		case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob); | ||||
| 		case 0x41 /*VT_BLOB*/: return parse_BLOB(blob); | ||||
| 		case 0x47 /*VT_CF*/: return parse_ClipboardData(blob); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,''); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,''); | ||||
| 		case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,''); | ||||
| 		case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob); | ||||
| 		case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob); | ||||
|  | ||||
| @ -294,7 +294,7 @@ function parse_FilePassHeader(blob, length/*:number*/, oo) { | ||||
| 	return o; | ||||
| } | ||||
| function parse_FilePass(blob, length/*:number*/, opts) { | ||||
| 	var o = { Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }; /* wEncryptionType */ | ||||
| 	var o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }/*:any*/); /* wEncryptionType */ | ||||
| 	if(o.Type) parse_FilePassHeader(blob, length-2, o); | ||||
| 	else parse_XORObfuscation(blob, length-2, opts, o); | ||||
| 	return o; | ||||
|  | ||||
							
								
								
									
										24
									
								
								bits/45_rtf.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								bits/45_rtf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| var RTF = (function() { | ||||
| 	function rtf_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { | ||||
| 		switch(opts.type) { | ||||
| 			case 'base64': return rtf_to_sheet_str(Base64.decode(d), opts); | ||||
| 			case 'binary': return rtf_to_sheet_str(d, opts); | ||||
| 			case 'buffer': return rtf_to_sheet_str(d.toString('binary'), opts); | ||||
| 			case 'array':  return rtf_to_sheet_str(cc2str(d), opts); | ||||
| 		} | ||||
| 		throw new Error("Unrecognized type " + opts.type); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ { | ||||
| 		throw new Error("Unsupported RTF"); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); } | ||||
| 	function sheet_to_rtf() { throw new Error("Unsupported"); } | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: rtf_to_workbook, | ||||
| 		to_sheet: rtf_to_sheet, | ||||
| 		from_sheet: sheet_to_rtf | ||||
| 	}; | ||||
| })(); | ||||
| @ -75,8 +75,9 @@ function parse_fills(t, styles, themes, opts) { | ||||
| 			case '<fills': case '<fills>': case '</fills>': break; | ||||
| 
 | ||||
| 			/* 18.8.20 fill CT_Fill */ | ||||
| 			case '<fill>': case '<fill': break; | ||||
| 			case '</fill>': styles.Fills.push(fill); fill = {}; break; | ||||
| 			case '<fill>': case '<fill': case '<fill/>': | ||||
| 				fill = {}; styles.Fills.push(fill); break; | ||||
| 			case '</fill>': break; | ||||
| 
 | ||||
| 			/* 18.8.24 gradientFill CT_GradientFill */ | ||||
| 			case '<gradientFill>': break; | ||||
|  | ||||
| @ -102,6 +102,7 @@ var XLSBFillPTNames = [ | ||||
| ]; | ||||
| var rev_XLSBFillPTNames/*:EvertNumType*/ = (evert(XLSBFillPTNames)/*:any*/); | ||||
| /* TODO: gradient fill representation */ | ||||
| var parse_BrtFill = parsenoop; | ||||
| function write_BrtFill(fill, o) { | ||||
| 	if(!o) o = new_buf(4*3 + 8*7 + 16*1); | ||||
| 	var fls/*:number*/ = rev_XLSBFillPTNames[fill.patternType]; | ||||
| @ -164,6 +165,7 @@ function write_Blxf(data, o) { | ||||
| 	return o; | ||||
| } | ||||
| /* [MS-XLSB] 2.4.299 BrtBorder TODO */ | ||||
| var parse_BrtBorder = parsenoop; | ||||
| function write_BrtBorder(border, o) { | ||||
| 	if(!o) o = new_buf(51); | ||||
| 	o.write_shift(1, 0); /* diagonal */ | ||||
|  | ||||
| @ -690,9 +690,17 @@ var PtgBinOp = { | ||||
| 	PtgPower: "^", | ||||
| 	PtgSub: "-" | ||||
| }; | ||||
| function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| function formula_quote_sheet_name(sname/*:string*/)/*:string*/ { | ||||
| 	if(!sname) return ""; | ||||
| 	if(sname.indexOf(" ") > -1) return "'" + sname + "'"; | ||||
| 	return sname; | ||||
| } | ||||
| function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	return supbooks.SheetNames[ixti]; | ||||
| } | ||||
| function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts)); | ||||
| } | ||||
| function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks, opts) { | ||||
| 	//console.log(formula);
 | ||||
| 	var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}}; | ||||
|  | ||||
| @ -60,7 +60,7 @@ function get_cell_style(styles, cell, opts) { | ||||
| 	return len; | ||||
| } | ||||
| 
 | ||||
| function safe_format(p, fmtid/*:number*/, fillid/*:number*/, opts, themes, styles) { | ||||
| function safe_format(p, fmtid/*:number*/, fillid/*:?number*/, opts, themes, styles) { | ||||
| 	if(p.t === 'z') return; | ||||
| 	if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v); | ||||
| 	try { | ||||
| @ -84,7 +84,8 @@ function safe_format(p, fmtid/*:number*/, fillid/*:number*/, opts, themes, style | ||||
| 		else if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts); | ||||
| 		else p.w = SSF.format(fmtid,p.v,_ssfopts); | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	if(fillid) try { | ||||
| 	if(!opts.cellStyles) return; | ||||
| 	if(fillid != null) try { | ||||
| 		p.s = styles.Fills[fillid]; | ||||
| 		if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) { | ||||
| 			p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0); | ||||
| @ -94,5 +95,5 @@ function safe_format(p, fmtid/*:number*/, fillid/*:number*/, opts, themes, style | ||||
| 			p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0); | ||||
| 			if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb; | ||||
| 		} | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	} catch(e) { if(opts.WTF && styles.Fills) throw e; } | ||||
| } | ||||
|  | ||||
| @ -817,12 +817,14 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| function parse_xlml(data/*:RawBytes*/, opts)/*:Workbook*/ { | ||||
| function arr2str(data/*:any*/)/*:string*/ { return data.map(_chr).join(""); } | ||||
| 
 | ||||
| function parse_xlml(data/*:RawBytes|string*/, opts)/*:Workbook*/ { | ||||
| 	fix_read_opts(opts=opts||{}); | ||||
| 	switch(opts.type||"base64") { | ||||
| 		case "base64": return parse_xlml_xml(Base64.decode(data), opts); | ||||
| 		case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts); | ||||
| 		case "array": return parse_xlml_xml(data.map(_chr).join(""), opts); | ||||
| 		case "array": return parse_xlml_xml(arr2str(data), opts); | ||||
| 	} | ||||
| 	/*:: throw new Error("unsupported type " + opts.type); */ | ||||
| } | ||||
|  | ||||
| @ -38,8 +38,8 @@ var XLSBRecordEnum = { | ||||
| 	/*::[*/0x002A/*::]*/: { n:"BrtIndexBlock", f:parsenoop }, | ||||
| 	/*::[*/0x002B/*::]*/: { n:"BrtFont", f:parse_BrtFont }, | ||||
| 	/*::[*/0x002C/*::]*/: { n:"BrtFmt", f:parse_BrtFmt }, | ||||
| 	/*::[*/0x002D/*::]*/: { n:"BrtFill", f:parsenoop }, | ||||
| 	/*::[*/0x002E/*::]*/: { n:"BrtBorder", f:parsenoop }, | ||||
| 	/*::[*/0x002D/*::]*/: { n:"BrtFill", f:parse_BrtFill }, | ||||
| 	/*::[*/0x002E/*::]*/: { n:"BrtBorder", f:parse_BrtBorder }, | ||||
| 	/*::[*/0x002F/*::]*/: { n:"BrtXF", f:parse_BrtXF }, | ||||
| 	/*::[*/0x0030/*::]*/: { n:"BrtStyle", f:parsenoop }, | ||||
| 	/*::[*/0x0031/*::]*/: { n:"BrtCellMeta", f:parsenoop }, | ||||
|  | ||||
| @ -4,10 +4,10 @@ var HTML_ = (function() { | ||||
| 		var opts = _opts || {}; | ||||
| 		if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 		var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var mtch = str.match(/<table/i); | ||||
| 		var mtch/*:any*/ = str.match(/<table/i); | ||||
| 		if(!mtch) throw new Error("Invalid HTML: could not find <table>"); | ||||
| 		var mtch2 = str.match(/<\/table/i); | ||||
| 		var i = mtch.index, j = mtch2 && mtch2.index || str.length; | ||||
| 		var mtch2/*:any*/ = str.match(/<\/table/i); | ||||
| 		var i/*:number*/ = mtch.index, j/*:number*/ = mtch2 && mtch2.index || str.length; | ||||
| 		var rows = str.slice(i, j).split(/(:?<tr[^>]*>)/i); | ||||
| 		var R = -1, C = 0, RS = 0, CS = 0; | ||||
| 		var range = {s:{r:10000000, c:10000000},e:{r:0,c:0}}; | ||||
|  | ||||
| @ -13,4 +13,5 @@ var write_csv_str = write_obj_str({from_sheet:sheet_to_csv}); | ||||
| var write_slk_str = write_obj_str(SYLK); | ||||
| var write_dif_str = write_obj_str(DIF); | ||||
| var write_prn_str = write_obj_str(PRN); | ||||
| var write_rtf_str = write_obj_str(RTF); | ||||
| var write_txt_str = write_obj_str({from_sheet:sheet_to_txt}); | ||||
|  | ||||
| @ -78,7 +78,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ { | ||||
| 		case 0xFF: if(n[1] == 0xFE){ return read_utf16(d, o); } break; | ||||
| 		case 0x00: if(n[1] == 0x00 && n[2] >= 0x02 && n[3] == 0x00) return WK_.to_workbook(d, o); break; | ||||
| 		case 0x03: case 0x83: case 0x8B: return DBF.to_workbook(d, o); | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) throw new Error("Unsupported RTF"); break; | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) return RTF.to_workbook(d, o); break; | ||||
| 		case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); | ||||
| 	} | ||||
| 	if(n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); | ||||
|  | ||||
| @ -69,6 +69,7 @@ function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) { | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o); | ||||
| 		case 'dif': return write_string_type(write_dif_str(wb, o), o); | ||||
| 		case 'prn': return write_string_type(write_prn_str(wb, o), o); | ||||
| 		case 'rtf': return write_string_type(write_rtf_str(wb, o), o); | ||||
| 		case 'fods': return write_string_type(write_ods(wb, o), o); | ||||
| 		case 'biff2': return write_binary_type(write_biff_buf(wb, o), o); | ||||
| 		case 'xlsx': | ||||
| @ -95,6 +96,7 @@ function resolve_book_type(o/*?WriteFileOpts*/) { | ||||
| 		case '.txt': o.bookType = 'txt'; break; | ||||
| 		case '.dif': o.bookType = 'dif'; break; | ||||
| 		case '.prn': o.bookType = 'prn'; break; | ||||
| 		case '.rtf': o.bookType = 'rtf'; break; | ||||
| 		case '.slk': o.bookType = 'sylk'; break; | ||||
| 		case '.htm': o.bookType = 'html'; break; | ||||
| 	} | ||||
|  | ||||
| @ -112,11 +112,11 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ { | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row = "", cols = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	var colInfos = o.skipHidden ? sheet["!cols"] : undefined; | ||||
| 	var rowInfos = o.skipHidden ? sheet["!rows"] : undefined; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!colInfos || !colInfos[C] || !colInfos[C].hidden) cols[C] = encode_col(C); | ||||
| 	var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		if (rowInfos && rowInfos[R] && rowInfos[R].hidden) continue; | ||||
| 		if ((rowInfos[R]||{}).hidden) continue; | ||||
| 		row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 		if(row == null) { continue; } | ||||
| 		if(o.strip) row = row.replace(endregex,""); | ||||
|  | ||||
| @ -12,13 +12,16 @@ if(has_buf && typeof require != 'undefined') (function() { | ||||
| 		var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 		var row/*:?string*/ = "", cols = []; | ||||
| 		o.dense = Array.isArray(sheet); | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 		var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 		var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 		var R = r.s.r; | ||||
| 		stream._read = function() { | ||||
| 			if(R > r.e.r) return stream.push(null); | ||||
| 			while(R <= r.e.r) { | ||||
| 				row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 				++R; | ||||
| 				if ((rowInfos[R-1]||{}).hidden) continue; | ||||
| 				row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o); | ||||
| 				if(row != null) { | ||||
| 					if(o.strip) row = row.replace(endregex,""); | ||||
| 					stream.push(row + RS); | ||||
|  | ||||
| @ -6,4 +6,5 @@ all: $(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 | ||||
| 	rm -f xlsx.full.min.js; ln -s ../../dist/xlsx.full.min.js | ||||
| 	node r.js -o build.js | ||||
|  | ||||
							
								
								
									
										11
									
								
								demos/requirejs/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								demos/requirejs/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| # RequireJS | ||||
| 
 | ||||
| The minified dist files trip up the RequireJS mechanism.  To bypass, the scripts | ||||
| automatically expose an `XLSX` variable that can be used if the require callback | ||||
| argument is `_XLSX` rather than `XLSX`: | ||||
| 
 | ||||
| ```js | ||||
| require(["xlsx.full.min"], function(_XLSX) { /* ... */ }); | ||||
| ``` | ||||
| 
 | ||||
| This demo uses the `r.js` optimizer to build a source file. | ||||
							
								
								
									
										55
									
								
								demos/requirejs/requirejs.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										55
									
								
								demos/requirejs/requirejs.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| <!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="require.js"></script> | ||||
| <script> | ||||
| var XW = { | ||||
| 	/* worker message */ | ||||
| 	msg: 'xlsx', | ||||
| 	/* worker scripts */ | ||||
| 	rABS: './xlsxworker2.js', | ||||
| 	norABS: './xlsxworker1.js', | ||||
| 	noxfer: './xlsxworker.js' | ||||
| }; | ||||
| </script> | ||||
| <script src="requirejs-built.js"></script> | ||||
| </body> | ||||
| </html> | ||||
| @ -1,4 +1,4 @@ | ||||
| require(["xlsx.full"], function(_XLSX) { | ||||
| require(["xlsx.full.min"], function(_XLSX) { | ||||
| var X = XLSX; | ||||
| 
 | ||||
| var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined"; | ||||
|  | ||||
							
								
								
									
										1
									
								
								demos/webpack/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/webpack/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,3 @@ | ||||
| webpack.js | ||||
| webpack.min.js | ||||
| *.out.js | ||||
|  | ||||
| @ -1,10 +1,15 @@ | ||||
| TOOL=webpack | ||||
| WPOPTS=--display-modules --display-reasons --profile | ||||
| .PHONY: all | ||||
| all: $(TOOL).min.js | ||||
| all: $(TOOL).min.js core.out.js full.out.js | ||||
| 
 | ||||
| $(TOOL).min.js: $(TOOL).js | ||||
| 	uglifyjs $< > $@ | ||||
| 
 | ||||
| .PHONY: $(TOOL).js | ||||
| $(TOOL).js: | ||||
| 	webpack main.js --output-filename $@ --display-modules --profile | ||||
| 	webpack main.js --output-filename $@ $(WPOPTS) | ||||
| 
 | ||||
| .PHONY: core.out.js full.out.js | ||||
| core.out.js full.out.js: %.out.js: %.js | ||||
| 	webpack $< --output-filename $@ $(WPOPTS) | ||||
|  | ||||
| @ -40,3 +40,16 @@ the module can be omitted by aliasing the dependency: | ||||
| 		alias: { "./dist/cpexcel.js": "" } | ||||
| 	}, | ||||
| ``` | ||||
| 
 | ||||
| ## Bower and minified versions | ||||
| 
 | ||||
| The minified versions, used in Bower, require `module.noParse` configuration: | ||||
| 
 | ||||
| ```js | ||||
| 	module: { | ||||
| 		noParse: [ | ||||
| 			/xlsx.core.min.js/, | ||||
| 			/xlsx.full.min.js/ | ||||
| 		] | ||||
| 	} | ||||
| ``` | ||||
|  | ||||
							
								
								
									
										227
									
								
								demos/webpack/app.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										227
									
								
								demos/webpack/app.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,227 @@ | ||||
| /*jshint browser:true */ | ||||
| /*global 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 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_json(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); | ||||
| 
 | ||||
							
								
								
									
										3
									
								
								demos/webpack/core.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								demos/webpack/core.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| var XLSX = require('./xlsx.core.min'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
							
								
								
									
										11
									
								
								demos/webpack/coreworker.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								demos/webpack/coreworker.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('core.out.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/coreworker1.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								demos/webpack/coreworker1.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('core.out.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/coreworker2.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								demos/webpack/coreworker2.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('core.out.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]); | ||||
| }; | ||||
							
								
								
									
										3
									
								
								demos/webpack/full.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								demos/webpack/full.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| var XLSX = require('./xlsx.full.min'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
							
								
								
									
										11
									
								
								demos/webpack/fullworker.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								demos/webpack/fullworker.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('full.out.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/fullworker1.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								demos/webpack/fullworker1.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('full.out.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/fullworker2.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								demos/webpack/fullworker2.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('full.out.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]); | ||||
| }; | ||||
| @ -3,6 +3,13 @@ module.exports = { | ||||
| 		libraryTarget: 'var', | ||||
| 		library: 'XLSX' | ||||
| 	}, | ||||
| 	/* module.noParse needed for bower */ | ||||
| 	module: { | ||||
| 		noParse: [ | ||||
| 			/xlsx.core.min.js/, | ||||
| 			/xlsx.full.min.js/ | ||||
| 		] | ||||
| 	}, | ||||
| 	/* Uncomment the next block to suppress codepage */ | ||||
| 	/* | ||||
| 	resolve: { | ||||
|  | ||||
| @ -41,9 +41,6 @@ Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" c | ||||
| <br /> | ||||
| <script src="webpack.min.js"></script> | ||||
| <script> | ||||
| /*jshint browser:true */ | ||||
| /*global XLSX */ | ||||
| var X = XLSX; | ||||
| var XW = { | ||||
| 	/* worker message */ | ||||
| 	msg: 'xlsx', | ||||
| @ -52,229 +49,7 @@ var XW = { | ||||
| 	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_json(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> | ||||
| <script src="app.js"></script> | ||||
| </body> | ||||
| </html> | ||||
|  | ||||
							
								
								
									
										1
									
								
								demos/webpack/xlsx.core.min.js
									
									
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/webpack/xlsx.core.min.js
									
									
									
									
										vendored
									
									
										Symbolic link
									
								
							| @ -0,0 +1 @@ | ||||
| ../../dist/xlsx.core.min.js | ||||
							
								
								
									
										1
									
								
								demos/webpack/xlsx.full.min.js
									
									
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/webpack/xlsx.full.min.js
									
									
									
									
										vendored
									
									
										Symbolic link
									
								
							| @ -0,0 +1 @@ | ||||
| ../../dist/xlsx.full.min.js | ||||
							
								
								
									
										6
									
								
								dist/cpexcel.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								dist/cpexcel.js
									
									
									
									
										vendored
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| /* cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /*jshint -W100 */ | ||||
| var cptable = {version:"1.10.0"}; | ||||
| var cptable = {version:"1.11.0"}; | ||||
| cptable[437] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); | ||||
| cptable[620] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖܢ٥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); | ||||
| cptable[737] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); | ||||
| @ -973,7 +973,7 @@ return {"enc": e, "dec": d }; })(); | ||||
| cptable[10029] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); | ||||
| cptable[10079] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); | ||||
| cptable[10081] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙ<C39B>ˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); | ||||
| if (typeof module !== 'undefined' && module.exports) module.exports = cptable; | ||||
| if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = cptable; | ||||
| /* cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ft=javascript: */ | ||||
| /*jshint newcap: false */ | ||||
| @ -982,7 +982,7 @@ if (typeof module !== 'undefined' && module.exports) module.exports = cptable; | ||||
|   if(typeof cptable === "undefined") { | ||||
|     if(typeof require !== "undefined"){ | ||||
|       var cpt = cptable; | ||||
|       if (typeof module !== 'undefined' && module.exports) module.exports = factory(cpt); | ||||
|       if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = factory(cpt); | ||||
|       else root.cptable = factory(cpt); | ||||
|     } else throw new Error("cptable not found"); | ||||
|   } else cptable = factory(cptable); | ||||
|  | ||||
							
								
								
									
										2
									
								
								dist/jszip.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/jszip.js
									
									
									
									
										vendored
									
									
								
							| @ -10,7 +10,7 @@ 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(); | ||||
| 	if("object"==typeof exports&&"undefined"!=typeof module&&"undefined"==typeof DO_NOT_EXPORT_JSZIP)module.exports=e(); | ||||
| 	else if("function"==typeof define&&define.amd){JSZip=e();define([],e);} | ||||
| 	else{ | ||||
| 		var f; | ||||
|  | ||||
							
								
								
									
										28
									
								
								dist/xlsx.core.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								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
											
										
									
								
							
							
								
								
									
										30
									
								
								dist/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										30
									
								
								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
											
										
									
								
							
							
								
								
									
										115
									
								
								dist/xlsx.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										115
									
								
								dist/xlsx.js
									
									
									
									
										vendored
									
									
								
							| @ -6,11 +6,11 @@ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false */ | ||||
| var XLSX = {}; | ||||
| (function make_xlsx(XLSX){ | ||||
| XLSX.version = '0.11.0'; | ||||
| XLSX.version = '0.11.1'; | ||||
| var current_codepage = 1200; | ||||
| /*global cptable:true */ | ||||
| if(typeof module !== "undefined" && typeof require !== 'undefined') { | ||||
| 	if(typeof cptable === 'undefined') global.cptable = null; | ||||
| 	if(typeof cptable === 'undefined') global.cptable = undefined; | ||||
| } | ||||
| function reset_cp() { set_cp(1200); } | ||||
| var set_cp = function(cp) { current_codepage = cp; }; | ||||
| @ -1347,7 +1347,7 @@ function read_date(blob, offset) { | ||||
| 
 | ||||
| var fs; | ||||
| function readFileSync(filename, options) { | ||||
| 	if(fs == null) fs = null; | ||||
| 	if(fs == null) fs = require('fs'); | ||||
| 	return parse(fs.readFileSync(filename), options); | ||||
| } | ||||
| 
 | ||||
| @ -1434,7 +1434,7 @@ var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 | ||||
| var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; | ||||
| function datenum(v, date1904) { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch += 1462*24*60*60*1000; | ||||
| 	if(date1904) epoch -= 1462*24*60*60*1000; | ||||
| 	return (epoch - dnthresh) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| function numdate(v) { | ||||
| @ -1583,8 +1583,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 = null; | ||||
| 		_fs = null; | ||||
| 		if(typeof jszip === 'undefined') jszip = undefined; | ||||
| 		try { _fs = require('fs'); } catch(e) { } | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -1739,12 +1739,15 @@ var vtregex = (function(){ var vt_cache = {}; | ||||
| 		return (vt_cache[bt] = new RegExp("<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">", 'g') ); | ||||
| };})(); | ||||
| var vtvregex = /<\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</; | ||||
| function parseVector(data) { | ||||
| function parseVector(data, opts) { | ||||
| 	var h = parsexmltag(data); | ||||
| 
 | ||||
| 	var matches = data.match(vtregex(h.baseType))||[]; | ||||
| 	if(matches.length != h.size) throw new Error("unexpected vector length " + matches.length + " != " + h.size); | ||||
| 	var res = []; | ||||
| 	if(matches.length != h.size) { | ||||
| 		if(opts.WTF) throw new Error("unexpected vector length " + matches.length + " != " + h.size); | ||||
| 		return res; | ||||
| 	} | ||||
| 	matches.forEach(function(x) { | ||||
| 		var v = x.replace(vtvregex,"").match(vtmregex); | ||||
| 		res.push({v:utf8read(v[2]), t:v[1]}); | ||||
| @ -2122,7 +2125,7 @@ var make_offcrypto = function(O, _crypto) { | ||||
| 	var crypto; | ||||
| 	if(typeof _crypto !== 'undefined') crypto = _crypto; | ||||
| 	else if(typeof require !== 'undefined') { | ||||
| 		try { crypto = null; } | ||||
| 		try { crypto = undefined; } | ||||
| 		catch(e) { crypto = null; } | ||||
| 	} | ||||
| 
 | ||||
| @ -3336,7 +3339,7 @@ var EXT_PROPS = [ | ||||
| XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"; | ||||
| RELS.EXT_PROPS  = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties'; | ||||
| 
 | ||||
| function parse_ext_props(data, p) { | ||||
| function parse_ext_props(data, p, opts) { | ||||
| 	var q = {}; if(!p) p = {}; | ||||
| 
 | ||||
| 	EXT_PROPS.forEach(function(f) { | ||||
| @ -3351,10 +3354,10 @@ function parse_ext_props(data, p) { | ||||
| 	}); | ||||
| 
 | ||||
| 	if(q.HeadingPairs && q.TitlesOfParts) { | ||||
| 		var v = parseVector(q.HeadingPairs); | ||||
| 		var parts = parseVector(q.TitlesOfParts).map(function(x) { return x.v; }); | ||||
| 		var v = parseVector(q.HeadingPairs, opts); | ||||
| 		var parts = parseVector(q.TitlesOfParts, opts).map(function (x) { return x.v; }); | ||||
| 		var idx = 0, len = 0; | ||||
| 		for(var i = 0; i !== v.length; i+=2) { | ||||
| 		if(parts.length > 0) for(var i = 0; i !== v.length; i += 2) { | ||||
| 			len = +(v[i+1].v); | ||||
| 			switch(v[i].v) { | ||||
| 				case "Worksheets": | ||||
| @ -3612,7 +3615,7 @@ function parse_VtStringBase(blob, stringType, pad) { | ||||
| } | ||||
| 
 | ||||
| function parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); } | ||||
| function parse_VtUnalignedString(blob, t) { if(!t) throw new Error("dafuq?"); return parse_VtStringBase(blob, t, 0); } | ||||
| function parse_VtUnalignedString(blob, t) { if(!t) throw new Error("VtUnalignedString must have positive length"); return parse_VtStringBase(blob, t, 0); } | ||||
| 
 | ||||
| /* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */ | ||||
| function parse_VtVecUnalignedLpstrValue(blob) { | ||||
| @ -3706,7 +3709,7 @@ function parse_TypedPropertyValue(blob, type, _opts) { | ||||
| 		case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob); | ||||
| 		case 0x41 /*VT_BLOB*/: return parse_BLOB(blob); | ||||
| 		case 0x47 /*VT_CF*/: return parse_ClipboardData(blob); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,''); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,''); | ||||
| 		case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,''); | ||||
| 		case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob); | ||||
| 		case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob); | ||||
| @ -6703,13 +6706,37 @@ function parse_FilePassHeader(blob, length, oo) { | ||||
| 	return o; | ||||
| } | ||||
| function parse_FilePass(blob, length, opts) { | ||||
| 	var o = { Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }; /* wEncryptionType */ | ||||
| 	var o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }); /* wEncryptionType */ | ||||
| 	if(o.Type) parse_FilePassHeader(blob, length-2, o); | ||||
| 	else parse_XORObfuscation(blob, length-2, opts, o); | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| var RTF = (function() { | ||||
| 	function rtf_to_sheet(d, opts) { | ||||
| 		switch(opts.type) { | ||||
| 			case 'base64': return rtf_to_sheet_str(Base64.decode(d), opts); | ||||
| 			case 'binary': return rtf_to_sheet_str(d, opts); | ||||
| 			case 'buffer': return rtf_to_sheet_str(d.toString('binary'), opts); | ||||
| 			case 'array':  return rtf_to_sheet_str(cc2str(d), opts); | ||||
| 		} | ||||
| 		throw new Error("Unrecognized type " + opts.type); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_sheet_str(str, opts) { | ||||
| 		throw new Error("Unsupported RTF"); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_workbook(d, opts) { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); } | ||||
| 	function sheet_to_rtf() { throw new Error("Unsupported"); } | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: rtf_to_workbook, | ||||
| 		to_sheet: rtf_to_sheet, | ||||
| 		from_sheet: sheet_to_rtf | ||||
| 	}; | ||||
| })(); | ||||
| function hex2RGB(h) { | ||||
| 	var o = h.substr(h[0]==="#"?1:0,6); | ||||
| 	return [parseInt(o.substr(0,2),16),parseInt(o.substr(2,2),16),parseInt(o.substr(4,2),16)]; | ||||
| @ -6905,8 +6932,9 @@ function parse_fills(t, styles, themes, opts) { | ||||
| 			case '<fills': case '<fills>': case '</fills>': break; | ||||
| 
 | ||||
| 			/* 18.8.20 fill CT_Fill */ | ||||
| 			case '<fill>': case '<fill': break; | ||||
| 			case '</fill>': styles.Fills.push(fill); fill = {}; break; | ||||
| 			case '<fill>': case '<fill': case '<fill/>': | ||||
| 				fill = {}; styles.Fills.push(fill); break; | ||||
| 			case '</fill>': break; | ||||
| 
 | ||||
| 			/* 18.8.24 gradientFill CT_GradientFill */ | ||||
| 			case '<gradientFill>': break; | ||||
| @ -7327,6 +7355,7 @@ var XLSBFillPTNames = [ | ||||
| ]; | ||||
| var rev_XLSBFillPTNames = (evert(XLSBFillPTNames)); | ||||
| /* TODO: gradient fill representation */ | ||||
| var parse_BrtFill = parsenoop; | ||||
| function write_BrtFill(fill, o) { | ||||
| 	if(!o) o = new_buf(4*3 + 8*7 + 16*1); | ||||
| 	var fls = rev_XLSBFillPTNames[fill.patternType]; | ||||
| @ -7389,6 +7418,7 @@ function write_Blxf(data, o) { | ||||
| 	return o; | ||||
| } | ||||
| /* [MS-XLSB] 2.4.299 BrtBorder TODO */ | ||||
| var parse_BrtBorder = parsenoop; | ||||
| function write_BrtBorder(border, o) { | ||||
| 	if(!o) o = new_buf(51); | ||||
| 	o.write_shift(1, 0); /* diagonal */ | ||||
| @ -9025,9 +9055,17 @@ var PtgBinOp = { | ||||
| 	PtgPower: "^", | ||||
| 	PtgSub: "-" | ||||
| }; | ||||
| function get_ixti(supbooks, ixti, opts) { | ||||
| function formula_quote_sheet_name(sname) { | ||||
| 	if(!sname) return ""; | ||||
| 	if(sname.indexOf(" ") > -1) return "'" + sname + "'"; | ||||
| 	return sname; | ||||
| } | ||||
| function get_ixti_raw(supbooks, ixti, opts) { | ||||
| 	return supbooks.SheetNames[ixti]; | ||||
| } | ||||
| function get_ixti(supbooks, ixti, opts) { | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts)); | ||||
| } | ||||
| function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) { | ||||
| 	//console.log(formula);
 | ||||
| 	var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}}; | ||||
| @ -10696,7 +10734,8 @@ function safe_format(p, fmtid, fillid, opts, themes, styles) { | ||||
| 		else if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts); | ||||
| 		else p.w = SSF.format(fmtid,p.v,_ssfopts); | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	if(fillid) try { | ||||
| 	if(!opts.cellStyles) return; | ||||
| 	if(fillid != null) try { | ||||
| 		p.s = styles.Fills[fillid]; | ||||
| 		if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) { | ||||
| 			p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0); | ||||
| @ -10706,7 +10745,7 @@ function safe_format(p, fmtid, fillid, opts, themes, styles) { | ||||
| 			p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0); | ||||
| 			if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb; | ||||
| 		} | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	} catch(e) { if(opts.WTF && styles.Fills) throw e; } | ||||
| } | ||||
| function parse_ws_xml_dim(ws, s) { | ||||
| 	var d = safe_decode_range(s); | ||||
| @ -13735,12 +13774,14 @@ Workbook.WBProps.date1904 = true; | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| function arr2str(data) { return data.map(_chr).join(""); } | ||||
| 
 | ||||
| function parse_xlml(data, opts) { | ||||
| 	fix_read_opts(opts=opts||{}); | ||||
| 	switch(opts.type||"base64") { | ||||
| 		case "base64": return parse_xlml_xml(Base64.decode(data), opts); | ||||
| 		case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts); | ||||
| 		case "array": return parse_xlml_xml(data.map(_chr).join(""), opts); | ||||
| 		case "array": return parse_xlml_xml(arr2str(data), opts); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -14900,8 +14941,8 @@ var XLSBRecordEnum = { | ||||
| 0x002A: { n:"BrtIndexBlock", f:parsenoop }, | ||||
| 0x002B: { n:"BrtFont", f:parse_BrtFont }, | ||||
| 0x002C: { n:"BrtFmt", f:parse_BrtFmt }, | ||||
| 0x002D: { n:"BrtFill", f:parsenoop }, | ||||
| 0x002E: { n:"BrtBorder", f:parsenoop }, | ||||
| 0x002D: { n:"BrtFill", f:parse_BrtFill }, | ||||
| 0x002E: { n:"BrtBorder", f:parse_BrtBorder }, | ||||
| 0x002F: { n:"BrtXF", f:parse_BrtXF }, | ||||
| 0x0030: { n:"BrtStyle", f:parsenoop }, | ||||
| 0x0031: { n:"BrtCellMeta", f:parsenoop }, | ||||
| @ -17060,6 +17101,7 @@ var write_csv_str = write_obj_str({from_sheet:sheet_to_csv}); | ||||
| var write_slk_str = write_obj_str(SYLK); | ||||
| var write_dif_str = write_obj_str(DIF); | ||||
| var write_prn_str = write_obj_str(PRN); | ||||
| var write_rtf_str = write_obj_str(RTF); | ||||
| var write_txt_str = write_obj_str({from_sheet:sheet_to_txt}); | ||||
| function fix_opts_func(defaults) { | ||||
| 	return function fix_opts(opts) { | ||||
| @ -17192,7 +17234,7 @@ function parse_zip(zip, opts) { | ||||
| 		if(propdata) props = parse_core_props(propdata); | ||||
| 		if(dir.extprops.length !== 0) { | ||||
| 			propdata = getzipstr(zip, dir.extprops[0].replace(/^\//,''), true); | ||||
| 			if(propdata) parse_ext_props(propdata, props); | ||||
| 			if(propdata) parse_ext_props(propdata, props, opts); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -17515,7 +17557,7 @@ function readSync(data, opts) { | ||||
| 		case 0xFF: if(n[1] == 0xFE){ return read_utf16(d, o); } break; | ||||
| 		case 0x00: if(n[1] == 0x00 && n[2] >= 0x02 && n[3] == 0x00) return WK_.to_workbook(d, o); break; | ||||
| 		case 0x03: case 0x83: case 0x8B: return DBF.to_workbook(d, o); | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) throw new Error("Unsupported RTF"); break; | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) return RTF.to_workbook(d, o); break; | ||||
| 		case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); | ||||
| 	} | ||||
| 	if(n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); | ||||
| @ -17598,6 +17640,7 @@ function writeSync(wb, opts) { | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o); | ||||
| 		case 'dif': return write_string_type(write_dif_str(wb, o), o); | ||||
| 		case 'prn': return write_string_type(write_prn_str(wb, o), o); | ||||
| 		case 'rtf': return write_string_type(write_rtf_str(wb, o), o); | ||||
| 		case 'fods': return write_string_type(write_ods(wb, o), o); | ||||
| 		case 'biff2': return write_binary_type(write_biff_buf(wb, o), o); | ||||
| 		case 'xlsx': | ||||
| @ -17624,6 +17667,7 @@ function resolve_book_type(o/*?WriteFileOpts*/) { | ||||
| 		case '.txt': o.bookType = 'txt'; break; | ||||
| 		case '.dif': o.bookType = 'dif'; break; | ||||
| 		case '.prn': o.bookType = 'prn'; break; | ||||
| 		case '.rtf': o.bookType = 'rtf'; break; | ||||
| 		case '.slk': o.bookType = 'sylk'; break; | ||||
| 		case '.htm': o.bookType = 'html'; break; | ||||
| 	} | ||||
| @ -17727,8 +17771,9 @@ function sheet_to_json(sheet, opts){ | ||||
| var qreg = /"/g; | ||||
| function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) { | ||||
| 	var isempty = true; | ||||
| 	var row = "", txt = "", rr = encode_row(R); | ||||
| 	var row = [], txt = "", rr = encode_row(R); | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		if (!cols[C]) continue; | ||||
| 		var val = o.dense ? (sheet[R]||[])[C]: sheet[cols[C] + rr]; | ||||
| 		if(val == null) txt = ""; | ||||
| 		else if(val.v != null) { | ||||
| @ -17741,10 +17786,10 @@ function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) { | ||||
| 			txt = '=' + val.f; if(txt.indexOf(",") >= 0) txt = '"' + txt.replace(qreg, '""') + '"'; | ||||
| 		} else txt = ""; | ||||
| 		/* NOTE: Excel CSV does not support array formulae */ | ||||
| 		row += (C === r.s.c ? "" : FS) + txt; | ||||
| 		row.push(txt); | ||||
| 	} | ||||
| 	if(o.blankrows === false && isempty) return null; | ||||
| 	return row; | ||||
| 	return row.join(FS); | ||||
| } | ||||
| 
 | ||||
| function sheet_to_csv(sheet, opts) { | ||||
| @ -17757,8 +17802,11 @@ function sheet_to_csv(sheet, opts) { | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row = "", cols = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		if ((rowInfos[R]||{}).hidden) continue; | ||||
| 		row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 		if(row == null) { continue; } | ||||
| 		if(o.strip) row = row.replace(endregex,""); | ||||
| @ -17987,13 +18035,16 @@ if(has_buf && typeof require != 'undefined') (function() { | ||||
| 		var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 		var row = "", cols = []; | ||||
| 		o.dense = Array.isArray(sheet); | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 		var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 		var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 		var R = r.s.r; | ||||
| 		stream._read = function() { | ||||
| 			if(R > r.e.r) return stream.push(null); | ||||
| 			while(R <= r.e.r) { | ||||
| 				row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 				++R; | ||||
| 				if ((rowInfos[R-1]||{}).hidden) continue; | ||||
| 				row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o); | ||||
| 				if(row != null) { | ||||
| 					if(o.strip) row = row.replace(endregex,""); | ||||
| 					stream.push(row + RS); | ||||
|  | ||||
							
								
								
									
										22
									
								
								dist/xlsx.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										22
									
								
								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
											
										
									
								
							| @ -27,5 +27,3 @@ | ||||
| - ISO/IEC 29500:2012(E) "Information technology — Document description and processing languages — Office Open XML File Formats" | ||||
| - Open Document Format for Office Applications Version 1.2 (29 September 2011) | ||||
| - Worksheet File Format (From Lotus) December 1984 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										2
									
								
								jszip.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								jszip.js
									
									
									
									
									
								
							| @ -10,7 +10,7 @@ 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(); | ||||
| 	if("object"==typeof exports&&"undefined"!=typeof module&&"undefined"==typeof DO_NOT_EXPORT_JSZIP)module.exports=e(); | ||||
| 	else if("function"==typeof define&&define.amd){JSZip=e();define([],e);} | ||||
| 	else{ | ||||
| 		var f; | ||||
|  | ||||
| @ -1559,6 +1559,7 @@ produces CSV output.  The function takes an options argument: | ||||
| | dateNF      |  fmt 14  | Use specified date format in string output          | | ||||
| | strip       |  false   | Remove trailing field separators in each record **  | | ||||
| | blankrows   |  true    | Include blank lines in the CSV output               | | ||||
| | skipHidden  |  false   | Skips hidden rows/columns in the CSV output         | | ||||
| 
 | ||||
| - `strip` will remove trailing commas from each line under default `FS/RS` | ||||
| - blankrows must be set to `false` to skip blank lines. | ||||
| @ -2100,5 +2101,3 @@ granted by the Apache 2.0 License are reserved by the Original Author. | ||||
| - ISO/IEC 29500:2012(E) "Information technology — Document description and processing languages — Office Open XML File Formats" | ||||
| - Open Document Format for Office Applications Version 1.2 (29 September 2011) | ||||
| - Worksheet File Format (From Lotus) December 1984 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										2
									
								
								misc/suppress_export.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								misc/suppress_export.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| var DO_NOT_EXPORT_CODEPAGE = true; | ||||
| var DO_NOT_EXPORT_JSZIP = true; | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "xlsx", | ||||
| 	"version": "0.11.0", | ||||
| 	"version": "0.11.1", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "Excel (XLSB/XLSX/XLS/XML) ODS and other spreadsheet format (CSV/DIF/DBF/SYLK) parser and writer", | ||||
| 	"keywords": [ "excel", "xls", "xlsx", "xlsb", "xlsm", "ods", "csv", "dbf", "dif", "sylk", "office", "spreadsheet" ], | ||||
| @ -19,7 +19,7 @@ | ||||
| 	"dependencies": { | ||||
| 		"exit-on-epipe":"~1.0.1", | ||||
| 		"ssf":"~0.10.1", | ||||
| 		"codepage":"~1.10.1", | ||||
| 		"codepage":"~1.11.0", | ||||
| 		"cfb":"~0.12.0", | ||||
| 		"crc-32":"~1.1.0", | ||||
| 		"adler-32":"~1.1.0", | ||||
|  | ||||
							
								
								
									
										414
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										414
									
								
								test.js
									
									
									
									
									
								
							| @ -7,21 +7,25 @@ var fs = require('fs'), assert = require('assert'); | ||||
| describe('source',function(){it('should load',function(){X=require(modp);});}); | ||||
| var DIF_XL = true; | ||||
| 
 | ||||
| var browser = false; | ||||
| 
 | ||||
| var opts = {cellNF: true}; | ||||
| if(process.env.WTF) { | ||||
| 	opts.WTF = true; | ||||
| 	opts.cellStyles = true; | ||||
| } | ||||
| var TYPE = browser ? "binary" : "buffer"; | ||||
| opts.type = TYPE; | ||||
| var fullex = [".xlsb", /*".xlsm",*/ ".xlsx"/*, ".xlml"*/]; | ||||
| var ofmt = ["xlsb", "xlsm", "xlsx", "ods", "biff2", "xlml", "sylk", "dif"]; | ||||
| var ex = fullex.slice(); ex = ex.concat([".ods", ".xls", ".xml", ".fods"]); | ||||
| if(process.env.FMTS === "full") process.env.FMTS = ex.join(":"); | ||||
| if(process.env.FMTS) ex=process.env.FMTS.split(":").map(function(x){return x[0]==="."?x:"."+x;}); | ||||
| if(typeof process != 'undefined' && ((process||{}).env)) { | ||||
| 	opts.WTF = true; | ||||
| 	opts.cellStyles = true; | ||||
| 	if(process.env.FMTS === "full") process.env.FMTS = ex.join(":"); | ||||
| 	if(process.env.FMTS) ex=process.env.FMTS.split(":").map(function(x){return x[0]==="."?x:"."+x;}); | ||||
| } | ||||
| var exp = ex.map(function(x){ return x + ".pending"; }); | ||||
| function test_file(x){ return ex.indexOf(x.substr(-5))>=0||exp.indexOf(x.substr(-13))>=0 || ex.indexOf(x.substr(-4))>=0||exp.indexOf(x.substr(-12))>=0; } | ||||
| 
 | ||||
| var files = (fs.existsSync('tests.lst') ? fs.readFileSync('tests.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : fs.readdirSync('test_files')).filter(test_file); | ||||
| var fileA = (fs.existsSync('tests/testA.lst') ? fs.readFileSync('tests/testA.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : []).filter(test_file); | ||||
| var files = browser ? [] : (fs.existsSync('tests.lst') ? fs.readFileSync('tests.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : fs.readdirSync('test_files')).filter(test_file); | ||||
| var fileA = browser ? [] : (fs.existsSync('tests/testA.lst') ? fs.readFileSync('tests/testA.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : []).filter(test_file); | ||||
| 
 | ||||
| /* Excel enforces 31 character sheet limit, although technical file limit is 255 */ | ||||
| function fixsheetname(x) { return x.substr(0,31); } | ||||
| @ -241,7 +245,7 @@ function parsetest(x, wb, full, ext) { | ||||
| 
 | ||||
| var wbtable = {}; | ||||
| 
 | ||||
| describe('should parse test files', function() { | ||||
| (browser ? describe.skip : describe)('should parse test files', function() { | ||||
| 	files.forEach(function(x) { | ||||
| 		if(x.slice(-8) == ".pending" || !fs.existsSync(dir + x)) return; | ||||
| 		it(x, function() { | ||||
| @ -304,14 +308,14 @@ describe('parse options', function() { | ||||
| 	else it('before', bef); | ||||
| 	describe('cell', function() { | ||||
| 		it('XLSX should generate HTML by default', function() { | ||||
| 			var wb = X.readFile(paths.cstxlsx); | ||||
| 			var wb = X.read(fs.readFileSync(paths.cstxlsx), {type:TYPE}); | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			each_cell(ws, function(cell) { | ||||
| 				assert(html_cell_types.indexOf(cell.t) === -1 || cell.h); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('XLSX should not generate HTML when requested', function() { | ||||
| 			var wb = X.readFile(paths.cstxlsx, {cellHTML:false}); | ||||
| 			var wb = X.read(fs.readFileSync(paths.cstxlsx), {type:TYPE, cellHTML:false}); | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			each_cell(ws, function(cell) { | ||||
| 				assert(typeof cell.h === 'undefined'); | ||||
| @ -319,7 +323,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should generate formulae by default', function() { | ||||
| 			FSTPaths.forEach(function(p) { | ||||
| 				var wb = X.readFile(p); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE}); | ||||
| 				var found = false; | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| @ -332,7 +336,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should not generate formulae when requested', function() { | ||||
| 			FSTPaths.forEach(function(p) { | ||||
| 				var wb =X.readFile(p,{cellFormula:false}); | ||||
| 				var wb =X.read(fs.readFileSync(p),{type:TYPE,cellFormula:false}); | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| 					each_cell(ws, function(cell) { | ||||
| @ -343,7 +347,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should generate formatted text by default', function() { | ||||
| 			FSTPaths.forEach(function(p) { | ||||
| 				var wb = X.readFile(p); | ||||
| 				var wb = X.read(fs.readFileSync(p),{type:TYPE}); | ||||
| 				var found = false; | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| @ -356,7 +360,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should not generate formatted text when requested', function() { | ||||
| 			FSTPaths.forEach(function(p) { | ||||
| 				var wb =X.readFile(p,{cellText:false}); | ||||
| 				var wb =X.read(fs.readFileSync(p),{type:TYPE, cellText:false}); | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| 					each_cell(ws, function(cell) { | ||||
| @ -367,7 +371,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should not generate number formats by default', function() { | ||||
| 			NFPaths.forEach(function(p) { | ||||
| 				var wb = X.readFile(p); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE}); | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| 					each_cell(ws, function(cell) { | ||||
| @ -378,7 +382,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should generate number formats when requested', function() { | ||||
| 			NFPaths.forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {cellNF: true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, cellNF: true}); | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| 					each_cell(ws, function(cell) { | ||||
| @ -389,7 +393,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should not generate cell styles by default', function() { | ||||
| 			[paths.cssxlsx, paths.cssxlsb, paths.cssxls, paths.cssxml].forEach(function(p) { | ||||
| 				var wb = X.readFile(p); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, WTF:1}); | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| 					each_cell(ws, function(cell) { | ||||
| @ -401,7 +405,7 @@ describe('parse options', function() { | ||||
| 		it('should generate cell styles when requested', function() { | ||||
| 			/* TODO: XLS / XLML */ | ||||
| 			[paths.cssxlsx /*, paths.cssxlsb, paths.cssxls, paths.cssxml*/].forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {cellStyles:true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, cellStyles:true}); | ||||
| 				var found = false; | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| @ -414,7 +418,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should not generate cell dates by default', function() { | ||||
| 			DTPaths.forEach(function(p) { | ||||
| 				var wb = X.readFile(p); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE}); | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| 					each_cell(ws, function(cell) { | ||||
| @ -425,7 +429,7 @@ describe('parse options', function() { | ||||
| 		}); | ||||
| 		it('should generate cell dates when requested', function() { | ||||
| 			DTPaths.forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {cellDates: true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, cellDates: true, WTF:1}); | ||||
| 				var found = false; | ||||
| 				wb.SheetNames.forEach(function(s) { | ||||
| 					var ws = wb.Sheets[s]; | ||||
| @ -440,23 +444,23 @@ describe('parse options', function() { | ||||
| 	describe('sheet', function() { | ||||
| 		it('should not generate sheet stubs by default', function() { | ||||
| 			[paths.mcxlsx, paths.mcxlsb, paths.mcods, paths.mcxls, paths.mcxml].forEach(function(p) { | ||||
| 				var wb = X.readFile(p); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE}); | ||||
| 				assert.throws(function() { return get_cell(wb.Sheets.Merge, "A2").v; }); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('should generate sheet stubs when requested', function() { | ||||
| 			[paths.mcxlsx, paths.mcxlsb, paths.mcods, paths.mcxls, paths.mcxml].forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {sheetStubs:true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, sheetStubs:true}); | ||||
| 				assert(get_cell(wb.Sheets.Merge, "A2").t == 'z'); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('should handle stub cells', function() { | ||||
| 			[paths.mcxlsx, paths.mcxlsb, paths.mcods, paths.mcxls, paths.mcxml].forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {sheetStubs:true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, sheetStubs:true}); | ||||
| 				X.utils.sheet_to_csv(wb.Sheets.Merge); | ||||
| 				X.utils.sheet_to_json(wb.Sheets.Merge); | ||||
| 				X.utils.sheet_to_formulae(wb.Sheets.Merge); | ||||
| 				ofmt.forEach(function(f) { X.write(wb, {type:"binary", bookType:f}); }); | ||||
| 				ofmt.forEach(function(f) { X.write(wb, {type:TYPE, bookType:f}); }); | ||||
| 			}); | ||||
| 		}); | ||||
| 		function checkcells(wb, A46, B26, C16, D2) { | ||||
| @ -467,48 +471,48 @@ describe('parse options', function() { | ||||
| 		} | ||||
| 		it('should read all cells by default', function() { | ||||
| 			[paths.fstxlsx, paths.fstxlsb, paths.fstods, paths.fstxls, paths.fstxml].forEach(function(p) { | ||||
| 				checkcells(X.readFile(p), true, true, true, true); | ||||
| 				checkcells(X.read(fs.readFileSync(p), {type:TYPE}), true, true, true, true); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('sheetRows n=20', function() { | ||||
| 			[paths.fstxlsx, paths.fstxlsb, paths.fstods, paths.fstxls, paths.fstxml].forEach(function(p) { | ||||
| 				checkcells(X.readFile(p, {sheetRows:20}), false, false, true, true); | ||||
| 				checkcells(X.read(fs.readFileSync(p), {type:TYPE, sheetRows:20}), false, false, true, true); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('sheetRows n=10', function() { | ||||
| 			[paths.fstxlsx, paths.fstxlsb, paths.fstods, paths.fstxls, paths.fstxml].forEach(function(p) { | ||||
| 				checkcells(X.readFile(p, {sheetRows:10}), false, false, false, true); | ||||
| 				checkcells(X.read(fs.readFileSync(p), {type:TYPE, sheetRows:10}), false, false, false, true); | ||||
| 			}); | ||||
| 		}); | ||||
| 	}); | ||||
| 	describe('book', function() { | ||||
| 		it('bookSheets should not generate sheets', function() { | ||||
| 			[paths.mcxlsx, paths.mcxlsb, paths.mcxls, paths.mcxml].forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {bookSheets:true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, bookSheets:true}); | ||||
| 				assert(typeof wb.Sheets === 'undefined'); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('bookProps should not generate sheets', function() { | ||||
| 			[paths.nfxlsx, paths.nfxlsb, paths.nfxls, paths.nfxml].forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {bookProps:true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, bookProps:true}); | ||||
| 				assert(typeof wb.Sheets === 'undefined'); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('bookProps && bookSheets should not generate sheets', function() { | ||||
| 			[paths.lonxlsx, paths.lonxls].forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {bookProps:true, bookSheets:true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, bookProps:true, bookSheets:true}); | ||||
| 				assert(typeof wb.Sheets === 'undefined'); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('should not generate deps by default', function() { | ||||
| 			[paths.fstxlsx, paths.fstxlsb, paths.fstxls, paths.fstxml].forEach(function(p) { | ||||
| 				var wb = X.readFile(p); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE}); | ||||
| 				assert(typeof wb.Deps === 'undefined' || !(wb.Deps && wb.Deps.length>0)); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('bookDeps should generate deps (XLSX/XLSB)', function() { | ||||
| 			[paths.fstxlsx, paths.fstxlsb].forEach(function(p) { | ||||
| 				var wb = X.readFile(p, {bookDeps:true}); | ||||
| 				var wb = X.read(fs.readFileSync(p), {type:TYPE, bookDeps:true}); | ||||
| 				assert(typeof wb.Deps !== 'undefined' && wb.Deps.length > 0); | ||||
| 			}); | ||||
| 		}); | ||||
| @ -517,32 +521,32 @@ describe('parse options', function() { | ||||
| 		}); }; | ||||
| 		it('should not generate book files by default', function() { | ||||
| 			var wb; | ||||
| 			wb = X.readFile(paths.fstxlsx); | ||||
| 			wb = X.read(fs.readFileSync(paths.fstxlsx), {type:TYPE}); | ||||
| 			ckf(wb, ['files', 'keys'], false); | ||||
| 			wb = X.readFile(paths.fstxlsb); | ||||
| 			wb = X.read(fs.readFileSync(paths.fstxlsb), {type:TYPE}); | ||||
| 			ckf(wb, ['files', 'keys'], false); | ||||
| 			wb = X.readFile(paths.fstxls); | ||||
| 			wb = X.read(fs.readFileSync(paths.fstxls), {type:TYPE}); | ||||
| 			ckf(wb, ['cfb'], false); | ||||
| 		}); | ||||
| 		it('bookFiles should generate book files', function() { | ||||
| 			var wb; | ||||
| 			wb = X.readFile(paths.fstxlsx, {bookFiles:true}); | ||||
| 			wb = X.read(fs.readFileSync(paths.fstxlsx), {type:TYPE, bookFiles:true}); | ||||
| 			ckf(wb, ['files', 'keys'], true); | ||||
| 			wb = X.readFile(paths.fstxlsb, {bookFiles:true}); | ||||
| 			wb = X.read(fs.readFileSync(paths.fstxlsb), {type:TYPE, bookFiles:true}); | ||||
| 			ckf(wb, ['files', 'keys'], true); | ||||
| 			wb = X.readFile(paths.fstxls, {bookFiles:true}); | ||||
| 			wb = X.read(fs.readFileSync(paths.fstxls), {type:TYPE, bookFiles:true}); | ||||
| 			ckf(wb, ['cfb'], true); | ||||
| 		}); | ||||
| 		it('should not generate VBA by default', function() { | ||||
| 			var wb = X.readFile(paths.nfxlsx); | ||||
| 			var wb = X.read(fs.readFileSync(paths.nfxlsx), {type:TYPE}); | ||||
| 			assert(typeof wb.vbaraw === 'undefined'); | ||||
| 			wb = X.readFile(paths.nfxlsb); | ||||
| 			wb = X.read(fs.readFileSync(paths.nfxlsb), {type:TYPE}); | ||||
| 			assert(typeof wb.vbaraw === 'undefined'); | ||||
| 		}); | ||||
| 		it('bookVBA should generate vbaraw (XLSX/XLSB)', function() { | ||||
| 			var wb = X.readFile(paths.nfxlsx,{bookVBA:true}); | ||||
| 			var wb = X.read(fs.readFileSync(paths.nfxlsx),{type:TYPE, bookVBA:true}); | ||||
| 			assert(wb.vbaraw); | ||||
| 			wb = X.readFile(paths.nfxlsb,{bookVBA:true}); | ||||
| 			wb = X.read(fs.readFileSync(paths.nfxlsb),{type:TYPE, bookVBA:true}); | ||||
| 			assert(wb.vbaraw); | ||||
| 		}); | ||||
| 	}); | ||||
| @ -563,19 +567,20 @@ describe('input formats', function() { | ||||
| 		X.read(fs.readFileSync(paths.cstxlsx, 'base64'), {type: 'base64'}); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsb, 'base64'), {type: 'base64'}); | ||||
| 	}); | ||||
| 	it('should read buffers', function() { | ||||
| 		X.read(fs.readFileSync(paths.cstxls), {type: 'buffer'}); | ||||
| 		X.read(fs.readFileSync(paths.cstxml), {type: 'buffer'}); | ||||
| 		X.read(fs.readFileSync(paths.cstods), {type: 'buffer'}); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsx), {type: 'buffer'}); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsb), {type: 'buffer'}); | ||||
| 	var k = browser ? 'array' : 'buffer'; | ||||
| 	(typeof UInt8Array !== 'undefined' ? it : it.skip)('should read ' + k + 's', function() { | ||||
| 		X.read(fs.readFileSync(paths.cstxls, 'buffer'), {type: k}); | ||||
| 		X.read(fs.readFileSync(paths.cstxml, 'buffer'), {type: k}); | ||||
| 		X.read(fs.readFileSync(paths.cstods, 'buffer'), {type: k}); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsx, 'buffer'), {type: k}); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsb, 'buffer'), {type: k}); | ||||
| 	}); | ||||
| 	it('should read array', function() { | ||||
| 		X.read(fs.readFileSync(paths.mcxls, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.mcxml, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.mcxlsx, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.mcxlsb, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.mcods, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	(typeof UInt8Array !== 'undefined' ? it : it.skip)('should read array', function() { | ||||
| 		X.read(fs.readFileSync(paths.cstxls, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.cstxml, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsx, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsb, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 		X.read(fs.readFileSync(paths.cstods, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); | ||||
| 	it('should throw if format is unknown', function() { | ||||
| 		assert.throws(function() { X.read(fs.readFileSync(paths.cstxls), {type: 'dafuq'}); }); | ||||
| @ -584,6 +589,15 @@ describe('input formats', function() { | ||||
| 		assert.throws(function() { X.read(fs.readFileSync(paths.cstxlsx), {type: 'dafuq'}); }); | ||||
| 		assert.throws(function() { X.read(fs.readFileSync(paths.cstxlsb), {type: 'dafuq'}); }); | ||||
| 	}); | ||||
| 
 | ||||
| 	if(browser) it('should default to base64 type', function() { | ||||
| 		X.read(fs.readFileSync(paths.cstxls, 'base64')); | ||||
| 		X.read(fs.readFileSync(paths.cstxml, 'base64')); | ||||
| 		X.read(fs.readFileSync(paths.cstods, 'base64')); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsx, 'base64')); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsb, 'base64')); | ||||
| 	}); | ||||
| 	else { | ||||
| 	it('should infer buffer type', function() { | ||||
| 		X.read(fs.readFileSync(paths.cstxls)); | ||||
| 		X.read(fs.readFileSync(paths.cstxml)); | ||||
| @ -591,25 +605,33 @@ describe('input formats', function() { | ||||
| 		X.read(fs.readFileSync(paths.cstxlsx)); | ||||
| 		X.read(fs.readFileSync(paths.cstxlsb)); | ||||
| 	}); | ||||
| 	it('should read files', function() { | ||||
| 		X.readFile(paths.cstxls); | ||||
| 		X.readFile(paths.cstxml); | ||||
| 		X.readFile(paths.cstods); | ||||
| 		X.readFile(paths.cstxlsx); | ||||
| 		X.readFile(paths.cstxlsb); | ||||
| 	}); | ||||
| 	} | ||||
| }); | ||||
| 
 | ||||
| describe('output formats', function() { | ||||
| 	var wb1, wb2, wb3, wb4; | ||||
| 	var bef = (function() { | ||||
| 		X = require(modp); | ||||
| 		wb1 = X.readFile(paths.cpxlsx); | ||||
| 		wb2 = X.readFile(paths.cpxlsb); | ||||
| 		wb3 = X.readFile(paths.cpxls); | ||||
| 		wb4 = X.readFile(paths.cpxml); | ||||
| 		wb1 = X.read(fs.readFileSync(paths.cpxlsx), {type:TYPE}); | ||||
| 		wb2 = X.read(fs.readFileSync(paths.cpxlsb), {type:TYPE}); | ||||
| 		wb3 = X.read(fs.readFileSync(paths.cpxls), {type:TYPE}); | ||||
| 		wb4 = X.read(fs.readFileSync(paths.cpxml), {type:TYPE}); | ||||
| 	}); | ||||
| 	if(typeof before != 'undefined') before(bef); | ||||
| 	else it('before', bef); | ||||
| 	it('should write binary strings', function() { | ||||
| 		if(!wb1) { | ||||
| 			wb1 = X.readFile(paths.cpxlsx); | ||||
| 			wb2 = X.readFile(paths.cpxlsb); | ||||
| 			wb3 = X.readFile(paths.cpxls); | ||||
| 			wb4 = X.readFile(paths.cpxml); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.cpxlsx), {type:TYPE}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.cpxlsb), {type:TYPE}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.cpxls), {type:TYPE}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.cpxml), {type:TYPE}); | ||||
| 		} | ||||
| 		X.write(wb1, {type: 'binary'}); | ||||
| 		X.write(wb2, {type: 'binary'}); | ||||
| @ -630,7 +652,7 @@ describe('output formats', function() { | ||||
| 		X.read(X.write(wb3, {type: 'base64'}), {type: 'base64'}); | ||||
| 		X.read(X.write(wb4, {type: 'base64'}), {type: 'base64'}); | ||||
| 	}); | ||||
| 	it('should write buffers', function() { | ||||
| 	if(!browser) it('should write buffers', function() { | ||||
| 		X.write(wb1, {type: 'buffer'}); | ||||
| 		X.write(wb2, {type: 'buffer'}); | ||||
| 		X.write(wb3, {type: 'buffer'}); | ||||
| @ -736,11 +758,11 @@ describe('parse features', function() { | ||||
| 	describe('sheet visibility', function() { | ||||
| 		var wb1, wb2, wb3, wb4, wb5; | ||||
| 		var bef = (function() { | ||||
| 			wb1 = X.readFile(paths.svxls); | ||||
| 			wb2 = X.readFile(paths.svxls5); | ||||
| 			wb3 = X.readFile(paths.svxml); | ||||
| 			wb4 = X.readFile(paths.svxlsx); | ||||
| 			wb5 = X.readFile(paths.svxlsb); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.svxls), {type:TYPE}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.svxls5), {type:TYPE}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.svxml), {type:TYPE}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.svxlsx), {type:TYPE}); | ||||
| 			wb5 = X.read(fs.readFileSync(paths.svxlsb), {type:TYPE}); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -768,10 +790,10 @@ describe('parse features', function() { | ||||
| 		if(fs.existsSync(paths.swcxlsx)) it('should have comment as part of cell properties', function(){ | ||||
| 			var X = require(modp); | ||||
| 			var sheet = 'Sheet1'; | ||||
| 			var wb1=X.readFile(paths.swcxlsx); | ||||
| 			var wb2=X.readFile(paths.swcxlsb); | ||||
| 			var wb3=X.readFile(paths.swcxls); | ||||
| 			var wb4=X.readFile(paths.swcxml); | ||||
| 			var wb1=X.read(fs.readFileSync(paths.swcxlsx), {type:TYPE}); | ||||
| 			var wb2=X.read(fs.readFileSync(paths.swcxlsb), {type:TYPE}); | ||||
| 			var wb3=X.read(fs.readFileSync(paths.swcxls), {type:TYPE}); | ||||
| 			var wb4=X.read(fs.readFileSync(paths.swcxml), {type:TYPE}); | ||||
| 
 | ||||
| 			[wb1,wb2,wb3,wb4].map(function(wb) { return wb.Sheets[sheet]; }).forEach(function(ws, i) { | ||||
| 				assert.equal(get_cell(ws, "B1").c.length, 1,"must have 1 comment"); | ||||
| @ -789,7 +811,7 @@ describe('parse features', function() { | ||||
| 			['xlml', paths.cstxml], | ||||
| 			['ods', paths.cstods] | ||||
| 		].forEach(function(m) { it(m[0] + ' stress test', function() { | ||||
| 			var wb = X.readFile(m[1]); | ||||
| 			var wb = X.read(fs.readFileSync(m[1]), {type:TYPE}); | ||||
| 			check_comments(wb); | ||||
| 			var ws0 = wb.Sheets.Sheet2; | ||||
| 			assert.equal(get_cell(ws0,"A1").c[0].a, 'Author'); | ||||
| @ -802,10 +824,10 @@ describe('parse features', function() { | ||||
| 	describe('should parse core properties and custom properties', function() { | ||||
| 		var wb1, wb2, wb3, wb4; | ||||
| 		var bef = (function() { | ||||
| 			wb1 = X.readFile(paths.cpxlsx); | ||||
| 			wb2 = X.readFile(paths.cpxlsb); | ||||
| 			wb3 = X.readFile(paths.cpxls); | ||||
| 			wb4 = X.readFile(paths.cpxml); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.cpxlsx), {type:TYPE}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.cpxlsb), {type:TYPE}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.cpxls), {type:TYPE}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.cpxml), {type:TYPE}); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -822,22 +844,22 @@ describe('parse features', function() { | ||||
| 
 | ||||
| 	describe('sheetRows', function() { | ||||
| 		it('should use original range if not set', function() { | ||||
| 			var opts = {}; | ||||
| 			var wb1 = X.readFile(paths.fstxlsx, opts); | ||||
| 			var wb2 = X.readFile(paths.fstxlsb, opts); | ||||
| 			var wb3 = X.readFile(paths.fstxls, opts); | ||||
| 			var wb4 = X.readFile(paths.fstxml, opts); | ||||
| 			var opts = {type:TYPE}; | ||||
| 			var wb1 = X.read(fs.readFileSync(paths.fstxlsx), opts); | ||||
| 			var wb2 = X.read(fs.readFileSync(paths.fstxlsb), opts); | ||||
| 			var wb3 = X.read(fs.readFileSync(paths.fstxls), opts); | ||||
| 			var wb4 = X.read(fs.readFileSync(paths.fstxml), opts); | ||||
| 			[wb1, wb2, wb3, wb4].forEach(function(wb) { | ||||
| 				assert.equal(wb.Sheets.Text["!ref"],"A1:F49"); | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('should adjust range if set', function() { | ||||
| 			var opts = {sheetRows:10}; | ||||
| 			var wb1 = X.readFile(paths.fstxlsx, opts); | ||||
| 			var wb2 = X.readFile(paths.fstxlsb, opts); | ||||
| 			var wb3 = X.readFile(paths.fstxls, opts); | ||||
| 			var wb4 = X.readFile(paths.fstxml, opts); | ||||
| 			var wb5 = X.readFile(paths.fstods, opts); | ||||
| 			var opts = {type:TYPE, sheetRows:10}; | ||||
| 			var wb1 = X.read(fs.readFileSync(paths.fstxlsx), opts); | ||||
| 			var wb2 = X.read(fs.readFileSync(paths.fstxlsb), opts); | ||||
| 			var wb3 = X.read(fs.readFileSync(paths.fstxls), opts); | ||||
| 			var wb4 = X.read(fs.readFileSync(paths.fstxml), opts); | ||||
| 			var wb5 = X.read(fs.readFileSync(paths.fstods), opts); | ||||
| 			/* TODO */ | ||||
| 			[wb1, wb2 /*, wb3, wb4, wb5 */].forEach(function(wb) { | ||||
| 				assert.equal(wb.Sheets.Text["!fullref"],"A1:F49"); | ||||
| @ -845,12 +867,12 @@ describe('parse features', function() { | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('should not generate comment cells', function() { | ||||
| 			var opts = {sheetRows:10}; | ||||
| 			var wb1 = X.readFile(paths.cstxlsx, opts); | ||||
| 			var wb2 = X.readFile(paths.cstxlsb, opts); | ||||
| 			var wb3 = X.readFile(paths.cstxls, opts); | ||||
| 			var wb4 = X.readFile(paths.cstxml, opts); | ||||
| 			var wb5 = X.readFile(paths.cstods, opts); | ||||
| 			var opts = {type:TYPE, sheetRows:10}; | ||||
| 			var wb1 = X.read(fs.readFileSync(paths.cstxlsx), opts); | ||||
| 			var wb2 = X.read(fs.readFileSync(paths.cstxlsb), opts); | ||||
| 			var wb3 = X.read(fs.readFileSync(paths.cstxls), opts); | ||||
| 			var wb4 = X.read(fs.readFileSync(paths.cstxml), opts); | ||||
| 			var wb5 = X.read(fs.readFileSync(paths.cstods), opts); | ||||
| 			/* TODO */ | ||||
| 			[wb1, wb2 /*, wb3, wb4, wb5 */].forEach(function(wb) { | ||||
| 				assert.equal(wb.Sheets.Sheet7["!fullref"],"A1:N34"); | ||||
| @ -863,12 +885,12 @@ describe('parse features', function() { | ||||
| 		var wb1, wb2, wb3, wb4, wb5, wb6; | ||||
| 		var bef = (function() { | ||||
| 			X = require(modp); | ||||
| 			wb1 = X.readFile(paths.cwxlsx, {cellStyles:true}); | ||||
| 			wb2 = X.readFile(paths.cwxlsb, {cellStyles:true}); | ||||
| 			wb3 = X.readFile(paths.cwxls, {cellStyles:true}); | ||||
| 			wb4 = X.readFile(paths.cwxls5, {cellStyles:true}); | ||||
| 			wb5 = X.readFile(paths.cwxml, {cellStyles:true}); | ||||
| 			wb6 = X.readFile(paths.cwslk, {cellStyles:true}); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.cwxlsx), {type:TYPE, cellStyles:true}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.cwxlsb), {type:TYPE, cellStyles:true}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.cwxls), {type:TYPE, cellStyles:true}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.cwxls5), {type:TYPE, cellStyles:true}); | ||||
| 			wb5 = X.read(fs.readFileSync(paths.cwxml), {type:TYPE, cellStyles:true}); | ||||
| 			wb6 = X.read(fs.readFileSync(paths.cwslk), {type:TYPE, cellStyles:true}); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -910,17 +932,17 @@ describe('parse features', function() { | ||||
| 		var ol1, ol2, ol3, ol4, ol5; | ||||
| 		var bef = (function() { | ||||
| 			X = require(modp); | ||||
| 			wb1 = X.readFile(paths.rhxlsx, {cellStyles:true}); | ||||
| 			wb2 = X.readFile(paths.rhxlsb, {cellStyles:true}); | ||||
| 			wb3 = X.readFile(paths.rhxls, {cellStyles:true}); | ||||
| 			wb4 = X.readFile(paths.rhxls5, {cellStyles:true}); | ||||
| 			wb5 = X.readFile(paths.rhxml, {cellStyles:true}); | ||||
| 			wb6 = X.readFile(paths.rhslk, {cellStyles:true}); | ||||
| 			ol1 = X.readFile(paths.olxlsx, {cellStyles:true}); | ||||
| 			ol2 = X.readFile(paths.olxlsb, {cellStyles:true}); | ||||
| 			ol3 = X.readFile(paths.olxls, {cellStyles:true}); | ||||
| 			ol4 = X.readFile(paths.olxls5, {cellStyles:true}); | ||||
| 			ol5 = X.readFile(paths.olods, {cellStyles:true}); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.rhxlsx), {type:TYPE, cellStyles:true}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.rhxlsb), {type:TYPE, cellStyles:true}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.rhxls), {type:TYPE, cellStyles:true}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.rhxls5), {type:TYPE, cellStyles:true}); | ||||
| 			wb5 = X.read(fs.readFileSync(paths.rhxml), {type:TYPE, cellStyles:true}); | ||||
| 			wb6 = X.read(fs.readFileSync(paths.rhslk), {type:TYPE, cellStyles:true}); | ||||
| 			ol1 = X.read(fs.readFileSync(paths.olxlsx), {type:TYPE, cellStyles:true}); | ||||
| 			ol2 = X.read(fs.readFileSync(paths.olxlsb), {type:TYPE, cellStyles:true}); | ||||
| 			ol3 = X.read(fs.readFileSync(paths.olxls), {type:TYPE, cellStyles:true}); | ||||
| 			ol4 = X.read(fs.readFileSync(paths.olxls5), {type:TYPE, cellStyles:true}); | ||||
| 			ol5 = X.read(fs.readFileSync(paths.olods), {type:TYPE, cellStyles:true}); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -964,11 +986,11 @@ describe('parse features', function() { | ||||
| 		var wb1, wb2, wb3, wb4, wb5; | ||||
| 		var bef = (function() { | ||||
| 			X = require(modp); | ||||
| 			wb1 = X.readFile(paths.mcxlsx); | ||||
| 			wb2 = X.readFile(paths.mcxlsb); | ||||
| 			wb3 = X.readFile(paths.mcods); | ||||
| 			wb4 = X.readFile(paths.mcxls); | ||||
| 			wb5 = X.readFile(paths.mcxml); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.mcxlsx), {type:TYPE}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.mcxlsb), {type:TYPE}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.mcods), {type:TYPE}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.mcxls), {type:TYPE}); | ||||
| 			wb5 = X.read(fs.readFileSync(paths.mcxml), {type:TYPE}); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -990,10 +1012,10 @@ describe('parse features', function() { | ||||
| 		var wb1, wb2, wb3, wb4; | ||||
| 		var bef = (function() { | ||||
| 			X = require(modp); | ||||
| 			wb1 = X.readFile(paths.hlxlsx); | ||||
| 			wb2 = X.readFile(paths.hlxlsb); | ||||
| 			wb3 = X.readFile(paths.hlxls); | ||||
| 			wb4 = X.readFile(paths.hlxml); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.hlxlsx), {type:TYPE}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.hlxlsb), {type:TYPE}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.hlxls), {type:TYPE}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.hlxml), {type:TYPE}); | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| @ -1008,7 +1030,7 @@ describe('parse features', function() { | ||||
| 		it('Must have read the date', function() { | ||||
| 			var wb, ws; | ||||
| 			var sheetName = 'Sheet1'; | ||||
| 			wb = X.readFile(paths.dtxlsx); | ||||
| 			wb = X.read(fs.readFileSync(paths.dtxlsx), {type:TYPE}); | ||||
| 			ws = wb.Sheets[sheetName]; | ||||
| 			var sheet = X.utils.sheet_to_json(ws); | ||||
| 			assert.equal(sheet[3]['てすと'], '2/14/14'); | ||||
| @ -1016,9 +1038,9 @@ describe('parse features', function() { | ||||
| 		it('cellDates should not affect formatted text', function() { | ||||
| 			var wb1, ws1, wb2, ws2; | ||||
| 			var sheetName = 'Sheet1'; | ||||
| 			wb1 = X.readFile(paths.dtxlsx); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.dtxlsx), {type:TYPE}); | ||||
| 			ws1 = wb1.Sheets[sheetName]; | ||||
| 			wb2 = X.readFile(paths.dtxlsb); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.dtxlsb), {type:TYPE}); | ||||
| 			ws2 = wb2.Sheets[sheetName]; | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws1),X.utils.sheet_to_csv(ws2)); | ||||
| 		}); | ||||
| @ -1035,14 +1057,14 @@ describe('parse features', function() { | ||||
| 		]; | ||||
| 		it('should not generate date cells by default', function() { fmts.forEach(function(f) { | ||||
| 			var wb, ws; | ||||
| 			wb = X.readFile(f[1]); | ||||
| 			wb = X.read(fs.readFileSync(f[1]), {type:TYPE}); | ||||
| 			ws = wb.Sheets[f[2]]; | ||||
| 			assert.equal(get_cell(ws, f[3]).w, f[4]); | ||||
| 			assert.equal(get_cell(ws, f[3]).t, 'n'); | ||||
| 		}); }); | ||||
| 		it('should generate date cells if cellDates is true', function() { fmts.forEach(function(f) { | ||||
| 			var wb, ws; | ||||
| 			wb = X.readFile(f[1], {cellDates:true}); | ||||
| 			wb = X.read(fs.readFileSync(f[1]), {type:TYPE, cellDates:true}); | ||||
| 			ws = wb.Sheets[f[2]]; | ||||
| 			assert.equal(get_cell(ws, f[3]).w, f[4]); | ||||
| 			assert.equal(get_cell(ws, f[3]).t, 'd'); | ||||
| @ -1057,7 +1079,7 @@ describe('parse features', function() { | ||||
| 			['xls',  paths.dnsxls,   true], | ||||
| 			['xlml', paths.dnsxml,  false], | ||||
| 		].forEach(function(m) { it(m[0], function() { | ||||
| 			var wb = X.readFile(m[1]); | ||||
| 			var wb = X.read(fs.readFileSync(m[1]), {type:TYPE}); | ||||
| 			var names = wb.Workbook.Names; | ||||
| 			for(var i = 0; i < names.length; ++i) if(names[i].Name == "SheetJS") break; | ||||
| 			assert(i < names.length, "Missing name"); | ||||
| @ -1080,7 +1102,7 @@ describe('parse features', function() { | ||||
| 			['xlml', paths.afxml], | ||||
| 			['ods', paths.afods] | ||||
| 		].forEach(function(m) { it(m[0], function() { | ||||
| 			var wb = X.readFile(m[1]); | ||||
| 			var wb = X.read(fs.readFileSync(m[1]), {type:TYPE}); | ||||
| 			assert(wb.Sheets[wb.SheetNames[0]]['!autofilter'] == null); | ||||
| 			for(var i = 1; i < wb.SheetNames.length; ++i) { | ||||
| 				assert(wb.Sheets[wb.SheetNames[i]]['!autofilter'] != null); | ||||
| @ -1101,7 +1123,7 @@ describe('parse features', function() { | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| 		else it('before', bef); | ||||
| 		['xlsx'].forEach(function(m) { it(m, function() { | ||||
| 			var wb2 = X.read(X.write(wb, {bookType:m, type:"binary"}),{type:"binary", cellHTML:true}); | ||||
| 			var wb2 = X.read(X.write(wb, {bookType:m, type:TYPE}),{type:TYPE, cellHTML:true}); | ||||
| 			assert.equal(get_cell(wb2.Sheets.Sheet1, "A2").h, "&"); | ||||
| 			assert.equal(get_cell(wb2.Sheets.Sheet1, "B2").h, "<"); | ||||
| 			assert.equal(get_cell(wb2.Sheets.Sheet1, "C2").h, ">"); | ||||
| @ -1113,11 +1135,11 @@ describe('parse features', function() { | ||||
| 		var wb1, wb2, wb3, wb4, wb5, wbs; | ||||
| 		var bef = (function() { | ||||
| 			if(!fs.existsSync(paths.pmxls)) return wbs=[]; | ||||
| 			wb1 = X.readFile(paths.pmxls); | ||||
| 			wb2 = X.readFile(paths.pmxls5); | ||||
| 			wb3 = X.readFile(paths.pmxml); | ||||
| 			wb4 = X.readFile(paths.pmxlsx); | ||||
| 			wb5 = X.readFile(paths.pmxlsb); | ||||
| 			wb1 = X.read(fs.readFileSync(paths.pmxls), {type:TYPE}); | ||||
| 			wb2 = X.read(fs.readFileSync(paths.pmxls5), {type:TYPE}); | ||||
| 			wb3 = X.read(fs.readFileSync(paths.pmxml), {type:TYPE}); | ||||
| 			wb4 = X.read(fs.readFileSync(paths.pmxlsx), {type:TYPE}); | ||||
| 			wb5 = X.read(fs.readFileSync(paths.pmxlsb), {type:TYPE}); | ||||
| 			wbs = [wb1, wb2, wb3, wb4, wb5]; | ||||
| 		}); | ||||
| 		if(typeof before != 'undefined') before(bef); | ||||
| @ -1148,8 +1170,8 @@ describe('parse features', function() { | ||||
| 	describe('should correctly handle styles', function() { | ||||
| 		var wsxls, wsxlsx, rn, rn2; | ||||
| 		var bef = (function() { | ||||
| 			wsxls=X.readFile(paths.cssxls, {cellStyles:true,WTF:1}).Sheets.Sheet1; | ||||
| 			wsxlsx=X.readFile(paths.cssxlsx, {cellStyles:true,WTF:1}).Sheets.Sheet1; | ||||
| 			wsxls=X.read(fs.readFileSync(paths.cssxls), {type:TYPE,cellStyles:true,WTF:1}).Sheets.Sheet1; | ||||
| 			wsxlsx=X.read(fs.readFileSync(paths.cssxlsx), {type:TYPE,cellStyles:true,WTF:1}).Sheets.Sheet1; | ||||
| 			rn = function(range) { | ||||
| 				var r = X.utils.decode_range(range); | ||||
| 				var out = []; | ||||
| @ -1255,9 +1277,9 @@ describe('write features', function() { | ||||
| 					Sheets: {Sheet1: ws} | ||||
| 				}; | ||||
| 				Object.keys(baseprops).forEach(function(k) { wb.Props[k] = baseprops[k]; }); | ||||
| 				var wb2 = X.read(X.write(wb, {bookType:w, type:"buffer"}), {type:"buffer"}); | ||||
| 				var wb2 = X.read(X.write(wb, {bookType:w, type:TYPE}), {type:TYPE}); | ||||
| 				Object.keys(baseprops).forEach(function(k) { assert.equal(baseprops[k], wb2.Props[k]); }); | ||||
| 				var wb3 = X.read(X.write(wb2, {bookType:w, type:"buffer", Props: {Author:"SheetJS"}}), {type:"buffer"}); | ||||
| 				var wb3 = X.read(X.write(wb2, {bookType:w, type:TYPE, Props: {Author:"SheetJS"}}), {type:TYPE}); | ||||
| 				assert.equal("SheetJS", wb3.Props.Author); | ||||
| 			}); }); | ||||
| 		}); | ||||
| @ -1280,6 +1302,31 @@ function seq(end, start) { | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
 | ||||
| var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; | ||||
| function datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch += 1462*24*60*60*1000; | ||||
| 	return (epoch - dnthresh) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| var good_pd_date = new Date('2017-02-19T19:06:09.000Z'); | ||||
| if(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17'); | ||||
| var good_pd = good_pd_date.getFullYear() == 2017; | ||||
| function parseDate(str/*:string|Date*/)/*:Date*/ { | ||||
| 	var d = new Date(str); | ||||
| 	if(good_pd) return d; | ||||
| 	if(str instanceof Date) return str; | ||||
| 	if(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) { | ||||
| 		var s = d.getFullYear(); | ||||
| 		if(str.indexOf("" + s) > -1) return d; | ||||
| 		d.setFullYear(d.getFullYear() + 100); return d; | ||||
| 	} | ||||
| 	var n = str.match(/\d+/g)||["2017","2","19","0","0","0"]; | ||||
| 	return new Date(Date.UTC(+n[0], +n[1] - 1, +n[2], +n[3], +n[4], +n[5])); | ||||
| } | ||||
| 
 | ||||
| var fixdate = browser ? parseDate("2014-02-19T14:30:00.000Z") : new Date("2014-02-19T14:30Z"); | ||||
| 
 | ||||
| describe('roundtrip features', function() { | ||||
| 	var bef = (function() { X = require(modp); }); | ||||
| 	if(typeof before != 'undefined') before(bef); | ||||
| @ -1290,8 +1337,8 @@ describe('roundtrip features', function() { | ||||
| 		['xlsb', paths.cpxlsb] | ||||
| 	].forEach(function(w) { | ||||
| 		it(w[0], function() { | ||||
| 				var wb1 = X.readFile(w[1]); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:"buffer"}), {type:"buffer"}); | ||||
| 				var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:TYPE}), {type:TYPE}); | ||||
| 				coreprop(wb1); | ||||
| 				coreprop(wb2); | ||||
| 		}); | ||||
| @ -1303,8 +1350,8 @@ describe('roundtrip features', function() { | ||||
| 		['xlsb', paths.cpxlsb] | ||||
| 	].forEach(function(w) { | ||||
| 		it(w[0], function() { | ||||
| 				var wb1 = X.readFile(w[1]); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:"buffer"}), {type:"buffer"}); | ||||
| 				var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:TYPE}), {type:TYPE}); | ||||
| 				custprop(wb1); | ||||
| 				custprop(wb2); | ||||
| 		}); | ||||
| @ -1312,7 +1359,7 @@ describe('roundtrip features', function() { | ||||
| 
 | ||||
| 	describe('should preserve merge cells', function() { | ||||
| 		["xlsx", "xlsb", "xlml", "ods"].forEach(function(f) { it(f, function() { | ||||
| 			var wb1 = X.readFile(paths.mcxlsx); | ||||
| 			var wb1 = X.read(fs.readFileSync(paths.mcxlsx), {type:TYPE}); | ||||
| 			var wb2 = X.read(X.write(wb1,{bookType:f,type:'binary'}),{type:'binary'}); | ||||
| 			var m1 = wb1.Sheets.Merge['!merges'].map(X.utils.encode_range); | ||||
| 			var m2 = wb2.Sheets.Merge['!merges'].map(X.utils.encode_range); | ||||
| @ -1331,7 +1378,7 @@ describe('roundtrip features', function() { | ||||
| 			if(dh) { f = paths.dtxlsx; sheet = 'Sheet1'; addr = 'B5'; } | ||||
| 			else { f = paths.nfxlsx; sheet = '2011'; addr = 'J36'; } | ||||
| 			it('[' + a + '] -> (' + b + ') -> [' + c + '] -> (' + d + ')', function() { | ||||
| 				var wb1 = X.readFile(f, {cellNF: true, cellDates: di, WTF: opts.WTF}); | ||||
| 				var wb1 = X.read(fs.readFileSync(f), {type:TYPE, cellNF: true, cellDates: di, WTF: opts.WTF}); | ||||
| 				var  _f = X.write(wb1, {type:'binary', cellDates:dj, WTF:opts.WTF}); | ||||
| 				var wb2 = X.read(_f, {type:'binary', cellDates: dk, WTF: opts.WTF}); | ||||
| 				var m = [wb1,wb2].map(function(x) { return get_cell(x.Sheets[sheet], addr); }); | ||||
| @ -1353,8 +1400,8 @@ describe('roundtrip features', function() { | ||||
| 			['ods',  paths.fstods] | ||||
| 		].forEach(function(w) { | ||||
| 			it(w[0], function() { | ||||
| 				var wb1 = X.readFile(w[1], {cellFormula:true}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:"buffer"}), {cellFormula:true, type:"buffer"}); | ||||
| 				var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE, cellFormula:true}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:TYPE}), {cellFormula:true, type:TYPE}); | ||||
| 				wb1.SheetNames.forEach(function(n) { | ||||
| 					assert.equal( X.utils.sheet_to_formulae(wb1.Sheets[n]).sort().join("\n"), X.utils.sheet_to_formulae(wb2.Sheets[n]).sort().join("\n") ); | ||||
| 				}); | ||||
| @ -1368,8 +1415,8 @@ describe('roundtrip features', function() { | ||||
| 			['xlsb', paths.hlxlsb] | ||||
| 		].forEach(function(w) { | ||||
| 			it(w[0], function() { | ||||
| 				var wb1 = X.readFile(w[1]); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:"buffer"}), {type:"buffer"}); | ||||
| 				var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:TYPE}), {type:TYPE}); | ||||
| 				hlink(wb1); | ||||
| 				hlink(wb2); | ||||
| 			}); | ||||
| @ -1381,7 +1428,7 @@ describe('roundtrip features', function() { | ||||
| 			['xlsx', paths.pmxlsx], | ||||
| 			['xlsb', paths.pmxlsb] | ||||
| 		].forEach(function(w) { it(w[0], function() { | ||||
| 			var wb1 = X.readFile(w[1]); | ||||
| 			var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); | ||||
| 			var wb2 = X.read(X.write(wb1, {bookType:w[0], type:"binary"}), {type:"binary"}); | ||||
| 			check_margin(wb2.Sheets["Normal"]["!margins"], [0.7, 0.7, 0.75, 0.75, 0.3, 0.3]); | ||||
| 			check_margin(wb2.Sheets["Wide"]["!margins"], [1, 1, 1, 1, 0.5, 0.5]); | ||||
| @ -1397,8 +1444,8 @@ describe('roundtrip features', function() { | ||||
| 			['xlsb', paths.svxlsb] | ||||
| 		].forEach(function(w) { | ||||
| 			it(w[0], function() { | ||||
| 				var wb1 = X.readFile(w[1]); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:"buffer"}), {type:"buffer"}); | ||||
| 				var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:TYPE}), {type:TYPE}); | ||||
| 				var wbs1 = wb1.Workbook.Sheets; | ||||
| 				var wbs2 = wb2.Workbook.Sheets; | ||||
| 				assert.equal(wbs1.length, wbs2.length); | ||||
| @ -1416,7 +1463,7 @@ describe('roundtrip features', function() { | ||||
| 				var ws1 = X.utils.aoa_to_sheet([["hpx12", "hpt24", "hpx48", "hidden"]]); | ||||
| 				ws1['!cols'] = [{wch:9},{wpx:100},{width:80},{hidden:true}]; | ||||
| 				var wb1 = {SheetNames:["Sheet1"], Sheets:{Sheet1:ws1}}; | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w, type:"buffer"}), {type:"buffer", cellStyles:true}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w, type:TYPE}), {type:TYPE, cellStyles:true}); | ||||
| 				var ws2 = wb2.Sheets.Sheet1; | ||||
| 				assert.equal(ws2['!cols'][3].hidden, true); | ||||
| 				assert.equal(ws2['!cols'][0].wch, 9); | ||||
| @ -1436,7 +1483,7 @@ describe('roundtrip features', function() { | ||||
| 				ws1['!rows'] = [{hpx:12},{hpt:24},{hpx:48},{hidden:true}]; | ||||
| 				for(var i = 0; i <= 7; ++i) ws1['!rows'].push({level:i}); | ||||
| 				var wb1 = {SheetNames:["Sheet1"], Sheets:{Sheet1:ws1}}; | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w, type:"buffer", cellStyles:true}), {type:"buffer", cellStyles:true}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w, type:TYPE, cellStyles:true}), {type:TYPE, cellStyles:true}); | ||||
| 				var ws2 = wb2.Sheets.Sheet1; | ||||
| 				assert.equal(ws2['!rows'][0].hpx, 12); | ||||
| 				assert.equal(ws2['!rows'][1].hpt, 24); | ||||
| @ -1454,8 +1501,8 @@ describe('roundtrip features', function() { | ||||
| 			//['ods', paths.cstods]
 | ||||
| 	].forEach(function(w) { | ||||
| 			it(w[0], function() { | ||||
| 				var wb1 = X.readFile(w[1]); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:"buffer"}), {type:"buffer"}); | ||||
| 				var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); | ||||
| 				var wb2 = X.read(X.write(wb1, {bookType:w[0], type:TYPE}), {type:TYPE}); | ||||
| 				check_comments(wb1); | ||||
| 				check_comments(wb2); | ||||
| 			}); | ||||
| @ -1468,7 +1515,7 @@ describe('roundtrip features', function() { | ||||
| 			{b:2,c:3}, | ||||
| 			{b:"a",d:"b"}, | ||||
| 			{a:true, c:false}, | ||||
| 			{c:new Date("2017-02-19T14:30Z")} | ||||
| 			{c:fixdate} | ||||
| 		]; | ||||
| 		var wb = X.utils.json_to_sheet(data, {cellDates:true}); | ||||
| 		var out = X.utils.sheet_to_json(wb, {raw:true}); | ||||
| @ -1490,24 +1537,24 @@ describe('invalid files', function() { | ||||
| 			['passwords', 'apachepoi_xor-encryption-abc.xls'], | ||||
| 			['DOC files', 'word_doc.doc'] | ||||
| 		].forEach(function(w) { it('should fail on ' + w[0], function() { | ||||
| 			assert.throws(function() { X.readFile(dir + w[1]); }); | ||||
| 			assert.throws(function() { X.read(fs.readFileSync(dir + w[1], {type:TYPE}), {type:TYPE}); }); | ||||
| 			assert.throws(function() { X.read(fs.readFileSync(dir+w[1], 'base64'), {type:'base64'}); }); | ||||
| 		}); }); | ||||
| 	}); | ||||
| 	describe('write', function() { | ||||
| 		it('should pass -> XLSX', function() { | ||||
| 			X.write(X.readFile(paths.fstxlsb), {type:'binary'}); | ||||
| 			X.write(X.readFile(paths.fstxlsx), {type:'binary'}); | ||||
| 			X.write(X.readFile(paths.fstxls), {type:'binary'}); | ||||
| 			X.write(X.readFile(paths.fstxml), {type:'binary'}); | ||||
| 			X.write(X.read(fs.readFileSync(paths.fstxlsb), {type:TYPE}), {type:TYPE}); | ||||
| 			X.write(X.read(fs.readFileSync(paths.fstxlsx), {type:TYPE}), {type:TYPE}); | ||||
| 			X.write(X.read(fs.readFileSync(paths.fstxls), {type:TYPE}), {type:TYPE}); | ||||
| 			X.write(X.read(fs.readFileSync(paths.fstxml), {type:TYPE}), {type:TYPE}); | ||||
| 		}); | ||||
| 		it('should pass if a sheet is missing', function() { | ||||
| 			var wb = X.readFile(paths.fstxlsx); delete wb.Sheets[wb.SheetNames[0]]; | ||||
| 			var wb = X.read(fs.readFileSync(paths.fstxlsx), {type:TYPE}); delete wb.Sheets[wb.SheetNames[0]]; | ||||
| 			X.read(X.write(wb, {type:'binary'}), {type:'binary'}); | ||||
| 		}); | ||||
| 		['Props', 'Custprops', 'SSF'].forEach(function(t) { | ||||
| 			it('should pass if ' + t + ' is missing', function() { | ||||
| 				var wb = X.readFile(paths.fstxlsx); | ||||
| 				var wb = X.read(fs.readFileSync(paths.fstxlsx), {type:TYPE}); | ||||
| 				assert.doesNotThrow(function() { | ||||
| 					delete wb[t]; | ||||
| 					X.write(wb, {type:'binary'}); | ||||
| @ -1516,7 +1563,7 @@ describe('invalid files', function() { | ||||
| 		}); | ||||
| 		['SheetNames', 'Sheets'].forEach(function(t) { | ||||
| 			it('should fail if ' + t + ' is missing', function() { | ||||
| 				var wb = X.readFile(paths.fstxlsx); | ||||
| 				var wb = X.read(fs.readFileSync(paths.fstxlsx), {type:TYPE}); | ||||
| 				assert.throws(function() { | ||||
| 					delete wb[t]; | ||||
| 					X.write(wb, {type:'binary'}); | ||||
| @ -1524,7 +1571,7 @@ describe('invalid files', function() { | ||||
| 			}); | ||||
| 		}); | ||||
| 		it('should fail if SheetNames has duplicate entries', function() { | ||||
| 			var wb = X.readFile(paths.fstxlsx); | ||||
| 			var wb = X.read(fs.readFileSync(paths.fstxlsx), {type:TYPE}); | ||||
| 			wb.SheetNames.push(wb.SheetNames[0]); | ||||
| 			assert.throws(function() { | ||||
| 				X.write(wb, {type:'binary'}); | ||||
| @ -1533,13 +1580,6 @@ describe('invalid files', function() { | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
 | ||||
| var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; | ||||
| function datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch += 1462*24*60*60*1000; | ||||
| 	return (epoch - dnthresh) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| 
 | ||||
| describe('json output', function() { | ||||
| 	function seeker(json, keys, val) { | ||||
| @ -1554,7 +1594,7 @@ describe('json output', function() { | ||||
| 		data = [ | ||||
| 			[1,2,3], | ||||
| 			[true, false, null, "sheetjs"], | ||||
| 			["foo", "bar", new Date("2014-02-19T14:30Z"), "0.3"], | ||||
| 			["foo", "bar", fixdate, "0.3"], | ||||
| 			["baz", undefined, "qux"] | ||||
| 		]; | ||||
| 		ws = X.utils.aoa_to_sheet(data); | ||||
| @ -1646,7 +1686,7 @@ describe('json output', function() { | ||||
| 		assert.equal(json[1][0], true); | ||||
| 		assert.equal(json[1][2], null); | ||||
| 		assert.equal(json[2][1], "bar"); | ||||
| 		assert.equal(json[2][2].getTime(), new Date("2014-02-19T14:30Z").getTime()); | ||||
| 		assert.equal(json[2][2].getTime(), fixdate.getTime()); | ||||
| 		assert.equal(json[3][2], "qux"); | ||||
| 	}); | ||||
| 	it('should include __rowNum__', function() { | ||||
| @ -1736,7 +1776,7 @@ describe('csv', function() { | ||||
| 			data = [ | ||||
| 				[1,2,3,null], | ||||
| 				[true, false, null, "sheetjs"], | ||||
| 				["foo", "bar", new Date("2014-02-19T14:30Z"), "0.3"], | ||||
| 				["foo", "bar", fixdate, "0.3"], | ||||
| 				[null, null, null], | ||||
| 				["baz", undefined, "qux"] | ||||
| 			]; | ||||
| @ -1782,7 +1822,9 @@ describe('csv', function() { | ||||
| 		}); | ||||
| 		it('should handle skipHidden for rows if requested', function() { | ||||
| 			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n"; | ||||
| 			delete ws["!rows"]; | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws), baseline); | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline); | ||||
| 			ws["!rows"] = [null,{hidden:true},null,null]; | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws), baseline); | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n"); | ||||
| @ -1790,7 +1832,9 @@ describe('csv', function() { | ||||
| 		}); | ||||
| 		it('should handle skipHidden for columns if requested', function() { | ||||
| 			var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n"; | ||||
| 			delete ws["!cols"]; | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws), baseline); | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline); | ||||
| 			ws["!cols"] = [null,{hidden:true},null,null]; | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws), baseline); | ||||
| 			assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,\n"); | ||||
| @ -1807,7 +1851,7 @@ describe('js -> file -> js', function() { | ||||
| 		data = [ | ||||
| 			[1,2,3], | ||||
| 			[true, false, null, "sheetjs"], | ||||
| 			["foo","bar",new Date("2014-02-19T14:30Z"), "0.3"], | ||||
| 			["foo", "bar", fixdate, "0.3"], | ||||
| 			["baz", 6.9, "qux"] | ||||
| 		]; | ||||
| 		ws = X.utils.aoa_to_sheet(data); | ||||
| @ -1850,7 +1894,7 @@ describe('corner cases', function() { | ||||
| 		var data = [ | ||||
| 			[1,2,3], | ||||
| 			[true, false, null, "sheetjs"], | ||||
| 			["foo","bar",new Date("2014-02-19T14:30Z"), "0.3"], | ||||
| 			["foo", "bar", fixdate, "0.3"], | ||||
| 			["baz", null, "q\"ux"] | ||||
| 		]; | ||||
| 		var ws = X.utils.aoa_to_sheet(data); | ||||
| @ -1864,7 +1908,7 @@ describe('corner cases', function() { | ||||
| 
 | ||||
| 		var wb = {SheetNames:['sheetjs'], Sheets:{sheetjs:ws}}; | ||||
| 		X.write(wb, {type: "binary", bookType: 'xlsx'}); | ||||
| 		X.write(wb, {type: "buffer", bookType: 'xlsm'}); | ||||
| 		X.write(wb, {type: TYPE, bookType: 'xlsm'}); | ||||
| 		X.write(wb, {type: "base64", bookType: 'xlsb'}); | ||||
| 		X.write(wb, {type: "binary", bookType: 'ods'}); | ||||
| 		X.write(wb, {type: "binary", bookType: 'biff2'}); | ||||
| @ -1895,17 +1939,17 @@ describe('corner cases', function() { | ||||
| 		}); | ||||
| 	}); | ||||
| 	it('codepage', function() { | ||||
| 		X.readFile(dir + "biff5/number_format_greek.xls"); | ||||
| 		X.read(fs.readFileSync(dir + "biff5/number_format_greek.xls"), {type:TYPE}); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| describe('encryption', function() { | ||||
| 	password_files.forEach(function(x) { | ||||
| 		describe(x, function() { | ||||
| 			it('should throw with no password', function() {assert.throws(function() { X.readFile(dir + x); }); }); | ||||
| 			it('should throw with no password', function() {assert.throws(function() { X.read(fs.readFileSync(dir + x), {type:TYPE}); }); }); | ||||
| 			it('should throw with wrong password', function() { | ||||
| 				try { | ||||
| 					X.readFile(dir + x, {password:'passwor',WTF:opts.WTF}); | ||||
| 					X.read(fs.readFileSync(dir + x), {type:TYPE,password:'passwor',WTF:opts.WTF}); | ||||
| 					throw new Error("incorrect password was accepted"); | ||||
| 				} catch(e) { | ||||
| 					if(e.message != "Password is incorrect") throw e; | ||||
| @ -1913,18 +1957,19 @@ describe('encryption', function() { | ||||
| 			}); | ||||
| 			it('should recognize correct password', function() { | ||||
| 				try { | ||||
| 					X.readFile(dir + x, {password:'password',WTF:opts.WTF}); | ||||
| 					X.read(fs.readFileSync(dir + x), {type:TYPE,password:'password',WTF:opts.WTF}); | ||||
| 				} catch(e) { | ||||
| 					if(e.message == "Password is incorrect") throw e; | ||||
| 				} | ||||
| 			}); | ||||
| 			it.skip('should decrypt file', function() { | ||||
| 				var wb = X.readFile(dir + x, {password:'password',WTF:opts.WTF}); | ||||
| 				var wb = X.read(fs.readFileSync(dir + x), {type:TYPE,password:'password',WTF:opts.WTF}); | ||||
| 			}); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| if(!browser || typeof cptable !== 'undefined') | ||||
| describe('multiformat tests', function() { | ||||
| var mfopts = opts; | ||||
| var mft = fs.readFileSync('multiformat.lst','utf-8').split("\n").map(function(x) { return x.trim(); }); | ||||
| @ -1933,8 +1978,9 @@ mft.forEach(function(x) { | ||||
| 	if(x.charAt(0)!="#") describe('MFT ' + x, function() { | ||||
| 		var fil = {}, f = [], r = x.split(/\s+/); | ||||
| 		if(r.length < 3) return; | ||||
| 		if(!fs.existsSync(dir + r[0] + r[1])) return; | ||||
| 		it('should parse all', function() { | ||||
| 			for(var j = 1; j < r.length; ++j) f[j-1] = X.readFile(dir + r[0] + r[j], mfopts); | ||||
| 			for(var j = 1; j < r.length; ++j) f[j-1] = X.read(fs.readFileSync(dir + r[0] + r[j]), mfopts); | ||||
| 		}); | ||||
| 		it('should have the same sheetnames', function() { | ||||
| 			cmparr(f.map(function(x) { return x.SheetNames; })); | ||||
|  | ||||
							
								
								
									
										803
									
								
								tests/core.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										803
									
								
								tests/core.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										11
									
								
								types/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								types/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -550,13 +550,24 @@ export interface Sheet2CSVOpts { | ||||
| 
 | ||||
|     /** Use specified date format */ | ||||
|     dateNF?: NumberFormat; | ||||
| 
 | ||||
|     /** Remove trailing field separators in each record */ | ||||
|     strip?: boolean; | ||||
| 
 | ||||
|     /** Include blank lines in the CSV output */ | ||||
|     blankrows?: boolean; | ||||
| 
 | ||||
|     /** Skip hidden rows and columns in the CSV output */ | ||||
|     skipHidden?: boolean; | ||||
| } | ||||
| 
 | ||||
| export interface Sheet2HTMLOpts { | ||||
|     /** Add contenteditable to every cell */ | ||||
|     editable?: boolean; | ||||
| 
 | ||||
|     /** Header HTML */ | ||||
|     header?: string; | ||||
| 
 | ||||
|     /** Footer HTML */ | ||||
|     footer?: string; | ||||
| } | ||||
|  | ||||
							
								
								
									
										98
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										98
									
								
								xlsx.flow.js
									
									
									
									
									
								
							| @ -6,7 +6,7 @@ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false */ | ||||
| var XLSX = {}; | ||||
| (function make_xlsx(XLSX){ | ||||
| XLSX.version = '0.11.0'; | ||||
| XLSX.version = '0.11.1'; | ||||
| var current_codepage = 1200; | ||||
| /*:: declare var cptable:any; */ | ||||
| /*global cptable:true */ | ||||
| @ -1496,7 +1496,7 @@ var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 | ||||
| var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; | ||||
| function datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch += 1462*24*60*60*1000; | ||||
| 	if(date1904) epoch -= 1462*24*60*60*1000; | ||||
| 	return (epoch - dnthresh) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| function numdate(v/*:number*/)/*:Date*/ { | ||||
| @ -1648,7 +1648,7 @@ if(typeof JSZip !== 'undefined') jszip = JSZip; | ||||
| if (typeof exports !== 'undefined') { | ||||
| 	if (typeof module !== 'undefined' && module.exports) { | ||||
| 		if(typeof jszip === 'undefined') jszip = require('./jszip.js'); | ||||
| 		_fs = require('fs'); | ||||
| 		try { _fs = require('fs'); } catch(e) { } | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -3688,8 +3688,8 @@ function parse_VtStringBase(blob, stringType, pad) { | ||||
| 	return parse_lpstr(blob, stringType, pad); | ||||
| } | ||||
| 
 | ||||
| function parse_VtString(blob, t/*:number*/, pad/*:number*/) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); } | ||||
| function parse_VtUnalignedString(blob, t/*:number*/) { if(!t) throw new Error("dafuq?"); return parse_VtStringBase(blob, t, 0); } | ||||
| function parse_VtString(blob, t/*:number*/, pad/*:?boolean*/) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); } | ||||
| function parse_VtUnalignedString(blob, t/*:number*/) { if(!t) throw new Error("VtUnalignedString must have positive length"); return parse_VtStringBase(blob, t, 0); } | ||||
| 
 | ||||
| /* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */ | ||||
| function parse_VtVecUnalignedLpstrValue(blob) { | ||||
| @ -3783,7 +3783,7 @@ function parse_TypedPropertyValue(blob, type/*:number*/, _opts) { | ||||
| 		case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob); | ||||
| 		case 0x41 /*VT_BLOB*/: return parse_BLOB(blob); | ||||
| 		case 0x47 /*VT_CF*/: return parse_ClipboardData(blob); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,''); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,''); | ||||
| 		case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,''); | ||||
| 		case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob); | ||||
| 		case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob); | ||||
| @ -6781,13 +6781,37 @@ function parse_FilePassHeader(blob, length/*:number*/, oo) { | ||||
| 	return o; | ||||
| } | ||||
| function parse_FilePass(blob, length/*:number*/, opts) { | ||||
| 	var o = { Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }; /* wEncryptionType */ | ||||
| 	var o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }/*:any*/); /* wEncryptionType */ | ||||
| 	if(o.Type) parse_FilePassHeader(blob, length-2, o); | ||||
| 	else parse_XORObfuscation(blob, length-2, opts, o); | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| var RTF = (function() { | ||||
| 	function rtf_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { | ||||
| 		switch(opts.type) { | ||||
| 			case 'base64': return rtf_to_sheet_str(Base64.decode(d), opts); | ||||
| 			case 'binary': return rtf_to_sheet_str(d, opts); | ||||
| 			case 'buffer': return rtf_to_sheet_str(d.toString('binary'), opts); | ||||
| 			case 'array':  return rtf_to_sheet_str(cc2str(d), opts); | ||||
| 		} | ||||
| 		throw new Error("Unrecognized type " + opts.type); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ { | ||||
| 		throw new Error("Unsupported RTF"); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); } | ||||
| 	function sheet_to_rtf() { throw new Error("Unsupported"); } | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: rtf_to_workbook, | ||||
| 		to_sheet: rtf_to_sheet, | ||||
| 		from_sheet: sheet_to_rtf | ||||
| 	}; | ||||
| })(); | ||||
| function hex2RGB(h) { | ||||
| 	var o = h.substr(h[0]==="#"?1:0,6); | ||||
| 	return [parseInt(o.substr(0,2),16),parseInt(o.substr(2,2),16),parseInt(o.substr(4,2),16)]; | ||||
| @ -6983,8 +7007,9 @@ function parse_fills(t, styles, themes, opts) { | ||||
| 			case '<fills': case '<fills>': case '</fills>': break; | ||||
| 
 | ||||
| 			/* 18.8.20 fill CT_Fill */ | ||||
| 			case '<fill>': case '<fill': break; | ||||
| 			case '</fill>': styles.Fills.push(fill); fill = {}; break; | ||||
| 			case '<fill>': case '<fill': case '<fill/>': | ||||
| 				fill = {}; styles.Fills.push(fill); break; | ||||
| 			case '</fill>': break; | ||||
| 
 | ||||
| 			/* 18.8.24 gradientFill CT_GradientFill */ | ||||
| 			case '<gradientFill>': break; | ||||
| @ -7405,6 +7430,7 @@ var XLSBFillPTNames = [ | ||||
| ]; | ||||
| var rev_XLSBFillPTNames/*:EvertNumType*/ = (evert(XLSBFillPTNames)/*:any*/); | ||||
| /* TODO: gradient fill representation */ | ||||
| var parse_BrtFill = parsenoop; | ||||
| function write_BrtFill(fill, o) { | ||||
| 	if(!o) o = new_buf(4*3 + 8*7 + 16*1); | ||||
| 	var fls/*:number*/ = rev_XLSBFillPTNames[fill.patternType]; | ||||
| @ -7467,6 +7493,7 @@ function write_Blxf(data, o) { | ||||
| 	return o; | ||||
| } | ||||
| /* [MS-XLSB] 2.4.299 BrtBorder TODO */ | ||||
| var parse_BrtBorder = parsenoop; | ||||
| function write_BrtBorder(border, o) { | ||||
| 	if(!o) o = new_buf(51); | ||||
| 	o.write_shift(1, 0); /* diagonal */ | ||||
| @ -9106,9 +9133,17 @@ var PtgBinOp = { | ||||
| 	PtgPower: "^", | ||||
| 	PtgSub: "-" | ||||
| }; | ||||
| function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| function formula_quote_sheet_name(sname/*:string*/)/*:string*/ { | ||||
| 	if(!sname) return ""; | ||||
| 	if(sname.indexOf(" ") > -1) return "'" + sname + "'"; | ||||
| 	return sname; | ||||
| } | ||||
| function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	return supbooks.SheetNames[ixti]; | ||||
| } | ||||
| function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ { | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts)); | ||||
| } | ||||
| function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks, opts) { | ||||
| 	//console.log(formula);
 | ||||
| 	var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}}; | ||||
| @ -10753,7 +10788,7 @@ function get_cell_style(styles, cell, opts) { | ||||
| 	return len; | ||||
| } | ||||
| 
 | ||||
| function safe_format(p, fmtid/*:number*/, fillid/*:number*/, opts, themes, styles) { | ||||
| function safe_format(p, fmtid/*:number*/, fillid/*:?number*/, opts, themes, styles) { | ||||
| 	if(p.t === 'z') return; | ||||
| 	if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v); | ||||
| 	try { | ||||
| @ -10777,7 +10812,8 @@ function safe_format(p, fmtid/*:number*/, fillid/*:number*/, opts, themes, style | ||||
| 		else if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts); | ||||
| 		else p.w = SSF.format(fmtid,p.v,_ssfopts); | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	if(fillid) try { | ||||
| 	if(!opts.cellStyles) return; | ||||
| 	if(fillid != null) try { | ||||
| 		p.s = styles.Fills[fillid]; | ||||
| 		if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) { | ||||
| 			p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0); | ||||
| @ -10787,7 +10823,7 @@ function safe_format(p, fmtid/*:number*/, fillid/*:number*/, opts, themes, style | ||||
| 			p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0); | ||||
| 			if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb; | ||||
| 		} | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	} catch(e) { if(opts.WTF && styles.Fills) throw e; } | ||||
| } | ||||
| function parse_ws_xml_dim(ws, s) { | ||||
| 	var d = safe_decode_range(s); | ||||
| @ -13822,12 +13858,14 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| function parse_xlml(data/*:RawBytes*/, opts)/*:Workbook*/ { | ||||
| function arr2str(data/*:any*/)/*:string*/ { return data.map(_chr).join(""); } | ||||
| 
 | ||||
| function parse_xlml(data/*:RawBytes|string*/, opts)/*:Workbook*/ { | ||||
| 	fix_read_opts(opts=opts||{}); | ||||
| 	switch(opts.type||"base64") { | ||||
| 		case "base64": return parse_xlml_xml(Base64.decode(data), opts); | ||||
| 		case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts); | ||||
| 		case "array": return parse_xlml_xml(data.map(_chr).join(""), opts); | ||||
| 		case "array": return parse_xlml_xml(arr2str(data), opts); | ||||
| 	} | ||||
| 	/*:: throw new Error("unsupported type " + opts.type); */ | ||||
| } | ||||
| @ -14989,8 +15027,8 @@ var XLSBRecordEnum = { | ||||
| 	/*::[*/0x002A/*::]*/: { n:"BrtIndexBlock", f:parsenoop }, | ||||
| 	/*::[*/0x002B/*::]*/: { n:"BrtFont", f:parse_BrtFont }, | ||||
| 	/*::[*/0x002C/*::]*/: { n:"BrtFmt", f:parse_BrtFmt }, | ||||
| 	/*::[*/0x002D/*::]*/: { n:"BrtFill", f:parsenoop }, | ||||
| 	/*::[*/0x002E/*::]*/: { n:"BrtBorder", f:parsenoop }, | ||||
| 	/*::[*/0x002D/*::]*/: { n:"BrtFill", f:parse_BrtFill }, | ||||
| 	/*::[*/0x002E/*::]*/: { n:"BrtBorder", f:parse_BrtBorder }, | ||||
| 	/*::[*/0x002F/*::]*/: { n:"BrtXF", f:parse_BrtXF }, | ||||
| 	/*::[*/0x0030/*::]*/: { n:"BrtStyle", f:parsenoop }, | ||||
| 	/*::[*/0x0031/*::]*/: { n:"BrtCellMeta", f:parsenoop }, | ||||
| @ -16315,10 +16353,10 @@ var HTML_ = (function() { | ||||
| 		var opts = _opts || {}; | ||||
| 		if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 		var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var mtch = str.match(/<table/i); | ||||
| 		var mtch/*:any*/ = str.match(/<table/i); | ||||
| 		if(!mtch) throw new Error("Invalid HTML: could not find <table>"); | ||||
| 		var mtch2 = str.match(/<\/table/i); | ||||
| 		var i = mtch.index, j = mtch2 && mtch2.index || str.length; | ||||
| 		var mtch2/*:any*/ = str.match(/<\/table/i); | ||||
| 		var i/*:number*/ = mtch.index, j/*:number*/ = mtch2 && mtch2.index || str.length; | ||||
| 		var rows = str.slice(i, j).split(/(:?<tr[^>]*>)/i); | ||||
| 		var R = -1, C = 0, RS = 0, CS = 0; | ||||
| 		var range = {s:{r:10000000, c:10000000},e:{r:0,c:0}}; | ||||
| @ -17150,6 +17188,7 @@ var write_csv_str = write_obj_str({from_sheet:sheet_to_csv}); | ||||
| var write_slk_str = write_obj_str(SYLK); | ||||
| var write_dif_str = write_obj_str(DIF); | ||||
| var write_prn_str = write_obj_str(PRN); | ||||
| var write_rtf_str = write_obj_str(RTF); | ||||
| var write_txt_str = write_obj_str({from_sheet:sheet_to_txt}); | ||||
| function fix_opts_func(defaults/*:Array<Array<any> >*/)/*:{(o:any):void}*/ { | ||||
| 	return function fix_opts(opts) { | ||||
| @ -17608,7 +17647,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ { | ||||
| 		case 0xFF: if(n[1] == 0xFE){ return read_utf16(d, o); } break; | ||||
| 		case 0x00: if(n[1] == 0x00 && n[2] >= 0x02 && n[3] == 0x00) return WK_.to_workbook(d, o); break; | ||||
| 		case 0x03: case 0x83: case 0x8B: return DBF.to_workbook(d, o); | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) throw new Error("Unsupported RTF"); break; | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) return RTF.to_workbook(d, o); break; | ||||
| 		case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); | ||||
| 	} | ||||
| 	if(n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); | ||||
| @ -17691,6 +17730,7 @@ function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) { | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o); | ||||
| 		case 'dif': return write_string_type(write_dif_str(wb, o), o); | ||||
| 		case 'prn': return write_string_type(write_prn_str(wb, o), o); | ||||
| 		case 'rtf': return write_string_type(write_rtf_str(wb, o), o); | ||||
| 		case 'fods': return write_string_type(write_ods(wb, o), o); | ||||
| 		case 'biff2': return write_binary_type(write_biff_buf(wb, o), o); | ||||
| 		case 'xlsx': | ||||
| @ -17717,6 +17757,7 @@ function resolve_book_type(o/*?WriteFileOpts*/) { | ||||
| 		case '.txt': o.bookType = 'txt'; break; | ||||
| 		case '.dif': o.bookType = 'dif'; break; | ||||
| 		case '.prn': o.bookType = 'prn'; break; | ||||
| 		case '.rtf': o.bookType = 'rtf'; break; | ||||
| 		case '.slk': o.bookType = 'sylk'; break; | ||||
| 		case '.htm': o.bookType = 'html'; break; | ||||
| 	} | ||||
| @ -17851,11 +17892,11 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ { | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row = "", cols = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	var colInfos = o.skipHidden ? sheet["!cols"] : undefined; | ||||
| 	var rowInfos = o.skipHidden ? sheet["!rows"] : undefined; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!colInfos || !colInfos[C] || !colInfos[C].hidden) cols[C] = encode_col(C); | ||||
| 	var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		if (rowInfos && rowInfos[R] && rowInfos[R].hidden) continue; | ||||
| 		if ((rowInfos[R]||{}).hidden) continue; | ||||
| 		row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 		if(row == null) { continue; } | ||||
| 		if(o.strip) row = row.replace(endregex,""); | ||||
| @ -18084,13 +18125,16 @@ if(has_buf && typeof require != 'undefined') (function() { | ||||
| 		var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 		var row/*:?string*/ = "", cols = []; | ||||
| 		o.dense = Array.isArray(sheet); | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 		var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 		var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 		var R = r.s.r; | ||||
| 		stream._read = function() { | ||||
| 			if(R > r.e.r) return stream.push(null); | ||||
| 			while(R <= r.e.r) { | ||||
| 				row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 				++R; | ||||
| 				if ((rowInfos[R-1]||{}).hidden) continue; | ||||
| 				row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o); | ||||
| 				if(row != null) { | ||||
| 					if(o.strip) row = row.replace(endregex,""); | ||||
| 					stream.push(row + RS); | ||||
|  | ||||
							
								
								
									
										86
									
								
								xlsx.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										86
									
								
								xlsx.js
									
									
									
									
									
								
							| @ -6,7 +6,7 @@ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false */ | ||||
| var XLSX = {}; | ||||
| (function make_xlsx(XLSX){ | ||||
| XLSX.version = '0.11.0'; | ||||
| XLSX.version = '0.11.1'; | ||||
| var current_codepage = 1200; | ||||
| /*global cptable:true */ | ||||
| if(typeof module !== "undefined" && typeof require !== 'undefined') { | ||||
| @ -1434,7 +1434,7 @@ var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 | ||||
| var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; | ||||
| function datenum(v, date1904) { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch += 1462*24*60*60*1000; | ||||
| 	if(date1904) epoch -= 1462*24*60*60*1000; | ||||
| 	return (epoch - dnthresh) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| function numdate(v) { | ||||
| @ -1584,7 +1584,7 @@ if(typeof JSZip !== 'undefined') jszip = JSZip; | ||||
| if (typeof exports !== 'undefined') { | ||||
| 	if (typeof module !== 'undefined' && module.exports) { | ||||
| 		if(typeof jszip === 'undefined') jszip = require('./jszip.js'); | ||||
| 		_fs = require('fs'); | ||||
| 		try { _fs = require('fs'); } catch(e) { } | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -3615,7 +3615,7 @@ function parse_VtStringBase(blob, stringType, pad) { | ||||
| } | ||||
| 
 | ||||
| function parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); } | ||||
| function parse_VtUnalignedString(blob, t) { if(!t) throw new Error("dafuq?"); return parse_VtStringBase(blob, t, 0); } | ||||
| function parse_VtUnalignedString(blob, t) { if(!t) throw new Error("VtUnalignedString must have positive length"); return parse_VtStringBase(blob, t, 0); } | ||||
| 
 | ||||
| /* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */ | ||||
| function parse_VtVecUnalignedLpstrValue(blob) { | ||||
| @ -3709,7 +3709,7 @@ function parse_TypedPropertyValue(blob, type, _opts) { | ||||
| 		case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob); | ||||
| 		case 0x41 /*VT_BLOB*/: return parse_BLOB(blob); | ||||
| 		case 0x47 /*VT_CF*/: return parse_ClipboardData(blob); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,''); | ||||
| 		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,''); | ||||
| 		case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,''); | ||||
| 		case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob); | ||||
| 		case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob); | ||||
| @ -6706,13 +6706,37 @@ function parse_FilePassHeader(blob, length, oo) { | ||||
| 	return o; | ||||
| } | ||||
| function parse_FilePass(blob, length, opts) { | ||||
| 	var o = { Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }; /* wEncryptionType */ | ||||
| 	var o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }); /* wEncryptionType */ | ||||
| 	if(o.Type) parse_FilePassHeader(blob, length-2, o); | ||||
| 	else parse_XORObfuscation(blob, length-2, opts, o); | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| var RTF = (function() { | ||||
| 	function rtf_to_sheet(d, opts) { | ||||
| 		switch(opts.type) { | ||||
| 			case 'base64': return rtf_to_sheet_str(Base64.decode(d), opts); | ||||
| 			case 'binary': return rtf_to_sheet_str(d, opts); | ||||
| 			case 'buffer': return rtf_to_sheet_str(d.toString('binary'), opts); | ||||
| 			case 'array':  return rtf_to_sheet_str(cc2str(d), opts); | ||||
| 		} | ||||
| 		throw new Error("Unrecognized type " + opts.type); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_sheet_str(str, opts) { | ||||
| 		throw new Error("Unsupported RTF"); | ||||
| 	} | ||||
| 
 | ||||
| 	function rtf_to_workbook(d, opts) { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); } | ||||
| 	function sheet_to_rtf() { throw new Error("Unsupported"); } | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: rtf_to_workbook, | ||||
| 		to_sheet: rtf_to_sheet, | ||||
| 		from_sheet: sheet_to_rtf | ||||
| 	}; | ||||
| })(); | ||||
| function hex2RGB(h) { | ||||
| 	var o = h.substr(h[0]==="#"?1:0,6); | ||||
| 	return [parseInt(o.substr(0,2),16),parseInt(o.substr(2,2),16),parseInt(o.substr(4,2),16)]; | ||||
| @ -6908,8 +6932,9 @@ function parse_fills(t, styles, themes, opts) { | ||||
| 			case '<fills': case '<fills>': case '</fills>': break; | ||||
| 
 | ||||
| 			/* 18.8.20 fill CT_Fill */ | ||||
| 			case '<fill>': case '<fill': break; | ||||
| 			case '</fill>': styles.Fills.push(fill); fill = {}; break; | ||||
| 			case '<fill>': case '<fill': case '<fill/>': | ||||
| 				fill = {}; styles.Fills.push(fill); break; | ||||
| 			case '</fill>': break; | ||||
| 
 | ||||
| 			/* 18.8.24 gradientFill CT_GradientFill */ | ||||
| 			case '<gradientFill>': break; | ||||
| @ -7330,6 +7355,7 @@ var XLSBFillPTNames = [ | ||||
| ]; | ||||
| var rev_XLSBFillPTNames = (evert(XLSBFillPTNames)); | ||||
| /* TODO: gradient fill representation */ | ||||
| var parse_BrtFill = parsenoop; | ||||
| function write_BrtFill(fill, o) { | ||||
| 	if(!o) o = new_buf(4*3 + 8*7 + 16*1); | ||||
| 	var fls = rev_XLSBFillPTNames[fill.patternType]; | ||||
| @ -7392,6 +7418,7 @@ function write_Blxf(data, o) { | ||||
| 	return o; | ||||
| } | ||||
| /* [MS-XLSB] 2.4.299 BrtBorder TODO */ | ||||
| var parse_BrtBorder = parsenoop; | ||||
| function write_BrtBorder(border, o) { | ||||
| 	if(!o) o = new_buf(51); | ||||
| 	o.write_shift(1, 0); /* diagonal */ | ||||
| @ -9028,9 +9055,17 @@ var PtgBinOp = { | ||||
| 	PtgPower: "^", | ||||
| 	PtgSub: "-" | ||||
| }; | ||||
| function get_ixti(supbooks, ixti, opts) { | ||||
| function formula_quote_sheet_name(sname) { | ||||
| 	if(!sname) return ""; | ||||
| 	if(sname.indexOf(" ") > -1) return "'" + sname + "'"; | ||||
| 	return sname; | ||||
| } | ||||
| function get_ixti_raw(supbooks, ixti, opts) { | ||||
| 	return supbooks.SheetNames[ixti]; | ||||
| } | ||||
| function get_ixti(supbooks, ixti, opts) { | ||||
| 	return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts)); | ||||
| } | ||||
| function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) { | ||||
| 	//console.log(formula);
 | ||||
| 	var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}}; | ||||
| @ -10699,7 +10734,8 @@ function safe_format(p, fmtid, fillid, opts, themes, styles) { | ||||
| 		else if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts); | ||||
| 		else p.w = SSF.format(fmtid,p.v,_ssfopts); | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	if(fillid) try { | ||||
| 	if(!opts.cellStyles) return; | ||||
| 	if(fillid != null) try { | ||||
| 		p.s = styles.Fills[fillid]; | ||||
| 		if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) { | ||||
| 			p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0); | ||||
| @ -10709,7 +10745,7 @@ function safe_format(p, fmtid, fillid, opts, themes, styles) { | ||||
| 			p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0); | ||||
| 			if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb; | ||||
| 		} | ||||
| 	} catch(e) { if(opts.WTF) throw e; } | ||||
| 	} catch(e) { if(opts.WTF && styles.Fills) throw e; } | ||||
| } | ||||
| function parse_ws_xml_dim(ws, s) { | ||||
| 	var d = safe_decode_range(s); | ||||
| @ -13738,12 +13774,14 @@ Workbook.WBProps.date1904 = true; | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| function arr2str(data) { return data.map(_chr).join(""); } | ||||
| 
 | ||||
| function parse_xlml(data, opts) { | ||||
| 	fix_read_opts(opts=opts||{}); | ||||
| 	switch(opts.type||"base64") { | ||||
| 		case "base64": return parse_xlml_xml(Base64.decode(data), opts); | ||||
| 		case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts); | ||||
| 		case "array": return parse_xlml_xml(data.map(_chr).join(""), opts); | ||||
| 		case "array": return parse_xlml_xml(arr2str(data), opts); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -14903,8 +14941,8 @@ var XLSBRecordEnum = { | ||||
| 0x002A: { n:"BrtIndexBlock", f:parsenoop }, | ||||
| 0x002B: { n:"BrtFont", f:parse_BrtFont }, | ||||
| 0x002C: { n:"BrtFmt", f:parse_BrtFmt }, | ||||
| 0x002D: { n:"BrtFill", f:parsenoop }, | ||||
| 0x002E: { n:"BrtBorder", f:parsenoop }, | ||||
| 0x002D: { n:"BrtFill", f:parse_BrtFill }, | ||||
| 0x002E: { n:"BrtBorder", f:parse_BrtBorder }, | ||||
| 0x002F: { n:"BrtXF", f:parse_BrtXF }, | ||||
| 0x0030: { n:"BrtStyle", f:parsenoop }, | ||||
| 0x0031: { n:"BrtCellMeta", f:parsenoop }, | ||||
| @ -17063,6 +17101,7 @@ var write_csv_str = write_obj_str({from_sheet:sheet_to_csv}); | ||||
| var write_slk_str = write_obj_str(SYLK); | ||||
| var write_dif_str = write_obj_str(DIF); | ||||
| var write_prn_str = write_obj_str(PRN); | ||||
| var write_rtf_str = write_obj_str(RTF); | ||||
| var write_txt_str = write_obj_str({from_sheet:sheet_to_txt}); | ||||
| function fix_opts_func(defaults) { | ||||
| 	return function fix_opts(opts) { | ||||
| @ -17518,7 +17557,7 @@ function readSync(data, opts) { | ||||
| 		case 0xFF: if(n[1] == 0xFE){ return read_utf16(d, o); } break; | ||||
| 		case 0x00: if(n[1] == 0x00 && n[2] >= 0x02 && n[3] == 0x00) return WK_.to_workbook(d, o); break; | ||||
| 		case 0x03: case 0x83: case 0x8B: return DBF.to_workbook(d, o); | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) throw new Error("Unsupported RTF"); break; | ||||
| 		case 0x7B: if(n[1] == 0x5C && n[2] == 0x72 && n[3] == 0x74) return RTF.to_workbook(d, o); break; | ||||
| 		case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); | ||||
| 	} | ||||
| 	if(n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); | ||||
| @ -17601,6 +17640,7 @@ function writeSync(wb, opts) { | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o); | ||||
| 		case 'dif': return write_string_type(write_dif_str(wb, o), o); | ||||
| 		case 'prn': return write_string_type(write_prn_str(wb, o), o); | ||||
| 		case 'rtf': return write_string_type(write_rtf_str(wb, o), o); | ||||
| 		case 'fods': return write_string_type(write_ods(wb, o), o); | ||||
| 		case 'biff2': return write_binary_type(write_biff_buf(wb, o), o); | ||||
| 		case 'xlsx': | ||||
| @ -17627,6 +17667,7 @@ function resolve_book_type(o/*?WriteFileOpts*/) { | ||||
| 		case '.txt': o.bookType = 'txt'; break; | ||||
| 		case '.dif': o.bookType = 'dif'; break; | ||||
| 		case '.prn': o.bookType = 'prn'; break; | ||||
| 		case '.rtf': o.bookType = 'rtf'; break; | ||||
| 		case '.slk': o.bookType = 'sylk'; break; | ||||
| 		case '.htm': o.bookType = 'html'; break; | ||||
| 	} | ||||
| @ -17761,11 +17802,11 @@ function sheet_to_csv(sheet, opts) { | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row = "", cols = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	var colInfos = o.skipHidden ? sheet["!cols"] : undefined; | ||||
| 	var rowInfos = o.skipHidden ? sheet["!rows"] : undefined; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!colInfos || !colInfos[C] || !colInfos[C].hidden) cols[C] = encode_col(C); | ||||
| 	var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		if (rowInfos && rowInfos[R] && rowInfos[R].hidden) continue; | ||||
| 		if ((rowInfos[R]||{}).hidden) continue; | ||||
| 		row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 		if(row == null) { continue; } | ||||
| 		if(o.strip) row = row.replace(endregex,""); | ||||
| @ -17994,13 +18035,16 @@ if(has_buf && typeof require != 'undefined') (function() { | ||||
| 		var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 		var row = "", cols = []; | ||||
| 		o.dense = Array.isArray(sheet); | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 		var colInfos = o.skipHidden && sheet["!cols"] || []; | ||||
| 		var rowInfos = o.skipHidden && sheet["!rows"] || []; | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) if (!((colInfos[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| 		var R = r.s.r; | ||||
| 		stream._read = function() { | ||||
| 			if(R > r.e.r) return stream.push(null); | ||||
| 			while(R <= r.e.r) { | ||||
| 				row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); | ||||
| 				++R; | ||||
| 				if ((rowInfos[R-1]||{}).hidden) continue; | ||||
| 				row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o); | ||||
| 				if(row != null) { | ||||
| 					if(o.strip) row = row.replace(endregex,""); | ||||
| 					stream.push(row + RS); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user