forked from sheetjs/sheetjs
		
	version bump 0.5.8: bookFiles, default change
- option bookFiles controls whether zip files and keys are written to object *** Default has been flipped from "true" to "false" - updated SSF to 0.5.8 - updated test_files to 20140216 (tests also look at 2013 XLSB) - added dist files (make dist)
This commit is contained in:
		
							parent
							
								
									c0a8bef07c
								
							
						
					
					
						commit
						33fbc389c5
					
				
							
								
								
									
										15
									
								
								Makefile
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,12 +1,13 @@ | ||||
| LIB=xlsx | ||||
| DEPS=$(wildcard bits/*.js) | ||||
| TARGET=xlsx.js | ||||
| TARGET=$(LIB).js | ||||
| FMT=xlsx xlsm xlsb | ||||
| 
 | ||||
| $(TARGET): $(DEPS) | ||||
| 	cat $^ > $@ | ||||
| 
 | ||||
| bits/31_version.js: package.json | ||||
| 	echo "XLSX.version = '"`grep version package.json | awk '{gsub(/[^0-9\.]/,"",$$2); print $$2}'`"';" > $@  | ||||
| 	echo "XLSX.version = '"`grep version package.json | awk '{gsub(/[^0-9\.]/,"",$$2); print $$2}'`"';" > $@ | ||||
| 
 | ||||
| .PHONY: clean | ||||
| clean: | ||||
| @ -21,7 +22,7 @@ init: | ||||
| 
 | ||||
| 
 | ||||
| .PHONY: test mocha | ||||
| test mocha: | ||||
| test mocha: test.js | ||||
| 	mocha -R spec | ||||
| 
 | ||||
| TESTFMT=$(patsubst %,test_%,$(FMT)) | ||||
| @ -40,7 +41,7 @@ lint: $(TARGET) | ||||
| .PHONY: cov | ||||
| cov: misc/coverage.html | ||||
| 
 | ||||
| misc/coverage.html: xlsx.js test.js | ||||
| misc/coverage.html: $(TARGET) test.js | ||||
| 	mocha --require blanket -R html-cov > misc/coverage.html | ||||
| 
 | ||||
| .PHONY: coveralls | ||||
| @ -48,5 +49,7 @@ coveralls: | ||||
| 	mocha --require blanket --reporter mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js | ||||
| 
 | ||||
| .PHONY: dist | ||||
| dist: xlsx.js | ||||
| 	uglifyjs xlsx.js -o dist/xlsx.min.js --source-map dist/xlsx.min.map --preamble "$$(head -n 1 bits/00_header.js)" | ||||
| dist: $(TARGET) | ||||
| 	cp $(TARGET) dist/ | ||||
| 	cp LICENSE dist/ | ||||
| 	uglifyjs $(TARGET) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)" | ||||
|  | ||||
| @ -6,7 +6,7 @@ var _strrev = function(x) { return String(x).split("").reverse().join("");}; | ||||
| function fill(c,l) { return new Array(l+1).join(c); } | ||||
| function pad(v,d,c){var t=String(v);return t.length>=d?t:(fill(c||0,d-t.length)+t);} | ||||
| function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));} | ||||
| SSF.version = '0.5.7'; | ||||
| SSF.version = '0.5.8'; | ||||
| /* Options */ | ||||
| var opts_fmt = {}; | ||||
| function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];} | ||||
| @ -113,7 +113,7 @@ var general_fmt = function(v) { | ||||
| 		return o.replace("e","E").replace(/\.0*$/,"").replace(/\.([0-9]*[^0])0*$/,".$1").replace(/(E[+-])([0-9])$/,"$1"+"0"+"$2"); | ||||
| 	} | ||||
| 	if(typeof v === 'string') return v; | ||||
| 	throw "unsupported value in General format: " + v; | ||||
| 	throw new Error("unsupported value in General format: " + v); | ||||
| }; | ||||
| SSF._general = general_fmt; | ||||
| var parse_date_code = function parse_date_code(v,opts) { | ||||
| @ -230,7 +230,7 @@ var write_num = function(type, fmt, val) { | ||||
| 		return o.replace("e","E"); | ||||
| 	} | ||||
| 	if(fmt[0] === "$") return "$"+write_num(type,fmt.substr(fmt[1]==' '?2:1),val); | ||||
| 	var r, ff, aval = val < 0 ? -val : val, sign = val < 0 ? "-" : ""; | ||||
| 	var r, rr, ff, aval = val < 0 ? -val : val, sign = val < 0 ? "-" : ""; | ||||
| 	if((r = fmt.match(/# (\?+)([ ]?)\/([ ]?)(\d+)/))) { | ||||
| 		var den = Number(r[4]), rnd = Math.round(aval * den), base = Math.floor(rnd/den); | ||||
| 		var myn = (rnd - base*den), myd = den; | ||||
| @ -243,8 +243,17 @@ var write_num = function(type, fmt, val) { | ||||
| 		o = Math.round(val * Math.pow(10,r[1].length)); | ||||
| 		return String(o/Math.pow(10,r[1].length)).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.([0-9]*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); }); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		o = Math.round(val*Math.pow(10,r[2].length)); | ||||
| 		return String(o * Math.pow(10,-r[2].length)).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^([-]?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,##0([.]?)$/))) return sign + commaify(String(Math.round(aval))); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		rr = Math.round((val-Math.floor(val))*Math.pow(10,r[1].length)); | ||||
| 		return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(rr,r[1].length,0); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([?]+)([ ]?)\/([ ]?)([?]+)/))) { | ||||
| 		var rr = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		rr = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,rr)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad(ff[1],rr," ") + r[2] + "/" + r[3] + rpad(ff[2],rr," "): fill(" ", 2*rr+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| @ -253,16 +262,6 @@ var write_num = function(type, fmt, val) { | ||||
| 		case "#.##": o = Math.round(val*100); | ||||
| 			return String(o/100).replace(/^([^\.]+)$/,"$1.").replace(/^0\.$/,"."); | ||||
| 		case "#,###": var x = commaify(String(Math.round(aval))); return x !== "0" ? sign + x : ""; | ||||
| 		case "#,##0": return sign + commaify(String(Math.round(aval))); | ||||
| 		case "#,##0.0": r = Math.round((val-Math.floor(val))*10); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,1,"0"); | ||||
| 		case "#,##0.00": r = Math.round((val-Math.floor(val))*100); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,2,"0"); | ||||
| 		case "#,##0.000": r = Math.round((val-Math.floor(val))*1000); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,3,0); | ||||
| 		case "#,##0.0000": r = Math.round((val-Math.floor(val))*10000); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,4,0); | ||||
| 		case "#,##0.00000": r = Math.round((val-Math.floor(val))*Math.pow(10,5)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,5,0); | ||||
| 		case "#,##0.000000": r = Math.round((val-Math.floor(val))*Math.pow(10,6)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,6,0); | ||||
| 		case "#,##0.0000000": r = Math.round((val-Math.floor(val))*Math.pow(10,7)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,7,0); | ||||
| 		case "#,##0.00000000": r = Math.round((val-Math.floor(val))*Math.pow(10,8)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,8,0); | ||||
| 		case "#,##0.000000000": r = Math.round((val-Math.floor(val))*Math.pow(10,9)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,9,0); | ||||
| 		default: | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| @ -279,7 +278,7 @@ function split_fmt(fmt) { | ||||
| 		j = i+1; | ||||
| 	} | ||||
| 	out.push(fmt.slice(j)); | ||||
| 	if(in_str !=-1) throw "Format |" + fmt + "| unterminated string at " + in_str; | ||||
| 	if(in_str !=-1) throw new Error("Format |" + fmt + "| unterminated string at " + in_str); | ||||
| 	return out; | ||||
| } | ||||
| SSF._split = split_fmt; | ||||
| @ -292,7 +291,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
| 		switch((c = fmt[i])) { | ||||
| 			case 'G': /* General */ | ||||
| 				if(fmt.substr(i, i+6).toLowerCase() !== "general") | ||||
| 					throw 'unrecognized character ' + fmt[i] + ' in ' + fmt; | ||||
| 					throw new Error('unrecognized character ' + fmt[i] + ' in ' +fmt); | ||||
| 				out.push({t:'G',v:'General'}); i+=7; break; | ||||
| 			case '"': /* Literal text */ | ||||
| 				for(o="";fmt[++i] !== '"' && i < fmt.length;) o += fmt[i]; | ||||
| @ -335,7 +334,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
| 				} else { o=""; } | ||||
| 				break; | ||||
| 			/* Numbers */ | ||||
| 			case '0': case '#': | ||||
| 			case '0': case '#': case '.': | ||||
| 				o = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) o += c; | ||||
| 				out.push({t:'n', v:o}); break; | ||||
| 			case '?': | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| XLSX.version = '0.5.7'; | ||||
| XLSX.version = '0.5.8'; | ||||
|  | ||||
| @ -16,7 +16,7 @@ function parse_sty_bin(data) { | ||||
| 	for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y]; | ||||
| 
 | ||||
| 	styles.CellXf = []; | ||||
| 	var state = ""; | ||||
| 	var state = ""; /* TODO: this should be a stack */ | ||||
| 	var pass = false; | ||||
| 	recordhopper(data, function(val, R, RT) { | ||||
| 		switch(R.n) { | ||||
| @ -35,8 +35,14 @@ function parse_sty_bin(data) { | ||||
| 			case 'BrtStyle': break; /* TODO */ | ||||
| 			case 'BrtRowHdr': break; /* TODO */ | ||||
| 			case 'BrtCellMeta': break; /* ?? */ | ||||
| 			case 'BrtDXF': break; /* TODO */ | ||||
| 			case 'BrtMRUColor': break; /* TODO */ | ||||
| 			case 'BrtIndexedColor': break; /* TODO */ | ||||
| 			case 'BrtBeginStyleSheet': break; | ||||
| 			case 'BrtEndStyleSheet': break; | ||||
| 			case 'BrtBeginTableStyle': break; | ||||
| 			case 'BrtTableStyleElement': break; | ||||
| 			case 'BrtEndTableStyle': break; | ||||
| 			case 'BrtBeginFmts': state = "FMTS"; break; | ||||
| 			case 'BrtEndFmts': state = ""; break; | ||||
| 			case 'BrtBeginFonts': state = "FONTS"; break; | ||||
| @ -57,6 +63,12 @@ function parse_sty_bin(data) { | ||||
| 			case 'BrtEndDXFs': state = ""; break; | ||||
| 			case 'BrtBeginTableStyles': state = "TABLESTYLES"; break; | ||||
| 			case 'BrtEndTableStyles': state = ""; break; | ||||
| 			case 'BrtBeginColorPalette': state = "COLORPALETTE"; break; | ||||
| 			case 'BrtBeginIndexedColors': state = "INDEXEDCOLORS"; break; | ||||
| 			case 'BrtEndIndexedColors': state = ""; break; | ||||
| 			case 'BrtBeginMRUColors': state = "MRUCOLORS"; break; | ||||
| 			case 'BrtEndMRUColors': state = ""; break; | ||||
| 			case 'BrtEndColorPalette': state = ""; break; | ||||
| 			case 'BrtFRTBegin': pass = true; break; | ||||
| 			case 'BrtFRTEnd': pass = false; break; | ||||
| 			//default: if(!pass) throw new Error("Unexpected record " + RT + " " + R.n);
 | ||||
|  | ||||
| @ -20,6 +20,11 @@ var parse_wb_bin = function(data) { | ||||
| 			case 'BrtBeginBook': break; | ||||
| 			case 'BrtFileVersion': break; | ||||
| 			case 'BrtWbProp': break; | ||||
| 			case 'BrtACBegin': break; | ||||
| 			case 'BrtAbsPath15': break; | ||||
| 			case 'BrtACEnd': break; | ||||
| 			/*case 'BrtBookProtectionIso': break;*/ | ||||
| 			case 'BrtBookProtection': break; | ||||
| 			case 'BrtBeginBookViews': break; | ||||
| 			case 'BrtBookView': break; | ||||
| 			case 'BrtEndBookViews': break; | ||||
| @ -29,15 +34,22 @@ var parse_wb_bin = function(data) { | ||||
| 			case 'BrtEndFnGroup': break; | ||||
| 			case 'BrtBeginExternals': break; | ||||
| 			case 'BrtSupSelf': break; | ||||
| 			case 'BrtSupBookSrc': break; | ||||
| 			case 'BrtExternSheet': break; | ||||
| 			case 'BrtEndExternals': break; | ||||
| 			case 'BrtName': break; | ||||
| 			case 'BrtCalcProp': break; | ||||
| 			case 'BrtUserBookView': break; | ||||
| 			case 'BrtBeginPivotCacheIDs': break; | ||||
| 			case 'BrtBeginPivotCacheID': break; | ||||
| 			case 'BrtEndPivotCacheID': break; | ||||
| 			case 'BrtEndPivotCacheIDs': break; | ||||
| 			case 'BrtWebOpt': break; | ||||
| 			case 'BrtFileRecover': break; | ||||
| 			/*case 'BrtBeginWebPubItems': break; | ||||
| 			case 'BrtBeginWebPubItem': break; | ||||
| 			case 'BrtEndWebPubItem': break; | ||||
| 			case 'BrtEndWebPubItems': break;*/ | ||||
| 			case 'BrtFRTBegin': pass = true; break; | ||||
| 			case 'BrtFRTEnd': pass = false; break; | ||||
| 			case 'BrtEndBook': break; | ||||
|  | ||||
| @ -9,6 +9,7 @@ function fixopts(opts) { | ||||
| 		['bookDeps', false], /* parse calculation chains */ | ||||
| 		['bookSheets', false], /* only try to get sheet names (no Sheets) */ | ||||
| 		['bookProps', false], /* only try to get properties (no Sheets) */ | ||||
| 		['bookFiles', false], /* include raw file structure (keys, files) */ | ||||
| 
 | ||||
| 		['WTF', false] /* WTF mode (throws errors) */ | ||||
| 	]; | ||||
|  | ||||
| @ -85,7 +85,7 @@ function parseZip(zip, opts) { | ||||
| 
 | ||||
| 	if(dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts); | ||||
| 
 | ||||
| 	return { | ||||
| 	out = { | ||||
| 		Directory: dir, | ||||
| 		Workbook: wb, | ||||
| 		Props: props, | ||||
| @ -95,7 +95,10 @@ function parseZip(zip, opts) { | ||||
| 		SheetNames: props.SheetNames, | ||||
| 		Strings: strs, | ||||
| 		Styles: styles, | ||||
| 		keys: keys, | ||||
| 		files: zip.files | ||||
| 	}; | ||||
| 	if(opts.bookFiles) { | ||||
| 		out.keys = keys, | ||||
| 		out.files = zip.files | ||||
| 	} | ||||
| 	return out; | ||||
| } | ||||
|  | ||||
| @ -37,7 +37,7 @@ function sheet_to_row_object_array(sheet, opts){ | ||||
| 			if(typeof val.w !== 'undefined' && !opts.raw) { row[hdr[C]] = val.w; isempty = false; } | ||||
| 			else switch(val.t){ | ||||
| 				case 's': case 'str': case 'b': case 'n': | ||||
| 					if(val.v !== undefined) { | ||||
| 					if(typeof val.v !== 'undefined') { | ||||
| 						row[hdr[C]] = val.v; | ||||
| 						isempty = false; | ||||
| 					} | ||||
| @ -68,6 +68,7 @@ function sheet_to_csv(sheet, opts) { | ||||
| 	if(!sheet || !sheet["!ref"]) return out; | ||||
| 	var r = XLSX.utils.decode_range(sheet["!ref"]); | ||||
| 	var fs = opts.FS||",", rs = opts.RS||"\n"; | ||||
| 
 | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		var row = []; | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| @ -90,8 +91,8 @@ function get_formulae(ws) { | ||||
| 		var x = ws[y]; | ||||
| 		var val = ""; | ||||
| 		if(x.f) val = x.f; | ||||
| 		else if(typeof x.w !== 'undefined') val = "'" + x.w; | ||||
| 		else if(typeof x.v === 'undefined') continue; | ||||
| 		else if(typeof x.v === 'number') val = x.v; | ||||
| 		else val = x.v; | ||||
| 		cmds.push(y + "=" + val); | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										17
									
								
								dist/LICENSE
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										17
									
								
								dist/LICENSE
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| Copyright (C) 2012-2014 SheetJS  | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| 
 | ||||
| Except where noted, this license applies to any and all software programs and associated documentation files created by the Original Author and distributed with the Software: | ||||
| 
 | ||||
| 'jszip.js' is a modified version of JSZip, Copyright (c) Stuart Knightley, David Duponchel, Franz Buchinger, Ant'onio Afonso.  JSZip is dual licensed and is used according to the terms of the MIT License. | ||||
							
								
								
									
										2963
									
								
								dist/xlsx.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2963
									
								
								dist/xlsx.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5
									
								
								dist/xlsx.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										5
									
								
								dist/xlsx.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								dist/xlsx.min.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								dist/xlsx.min.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "xlsx", | ||||
| 	"version": "0.5.7", | ||||
| 	"version": "0.5.8", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "XLSB / XLSX / XLSM parser", | ||||
| 	"keywords": [ "xlsx", "xlsb", "xlsm", "office", "excel", "spreadsheet" ], | ||||
|  | ||||
							
								
								
									
										26
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								test.js
									
									
									
									
									
								
							| @ -63,6 +63,12 @@ function parsetest(x, wb) { | ||||
| 			} : null); | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(!fs.existsSync(dir + '2013/' + x + '.xlsb')) return; | ||||
| 	describe(x + '.xlsb from 2013', function() { | ||||
| 		it('should parse', function() { | ||||
| 			var xlsb = XLSX.readFile(dir + '2013/' + x + '.xlsb', opts); | ||||
| 		}); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| describe('should parse test files', function() { | ||||
| @ -163,12 +169,28 @@ describe('options', function() { | ||||
| 			assert(typeof wb.Sheets === 'undefined'); | ||||
| 		}); | ||||
| 		it('should not generate deps by default', function() { | ||||
| 			var wb = XLSX.readFile(dir+'formula_stress_test.xlsx'); | ||||
| 			assert(typeof wb.Deps === 'undefined' || !(wb.Deps.length>0)); | ||||
| 		}); | ||||
| 		it('bookDeps should generate deps', function() { | ||||
| 			var wb = XLSX.readFile(dir+'formula_stress_test.xlsx', {bookDeps:true}); | ||||
| 			assert(typeof wb.Deps !== 'undefined' && wb.Deps.length > 0); | ||||
| 		}); | ||||
| 		it('bookDeps should generate deps', function() { | ||||
| 		it('should not generate files or keys by default', function() { | ||||
| 			var wb = XLSX.readFile(dir+'formula_stress_test.xlsx'); | ||||
| 			assert(typeof wb.Deps === 'undefined' || !(wb.Deps.length>0)); | ||||
| 			assert(typeof wb.files === 'undefined'); | ||||
| 			assert(typeof wb.keys === 'undefined'); | ||||
| 			wb = XLSX.readFile(dir+'formula_stress_test.xlsb'); | ||||
| 			assert(typeof wb.files === 'undefined'); | ||||
| 			assert(typeof wb.keys === 'undefined'); | ||||
| 		}); | ||||
| 		it('bookFiles should generate files and keys', function() { | ||||
| 			var wb = XLSX.readFile(dir+'formula_stress_test.xlsx', {bookFiles:true}); | ||||
| 			assert(typeof wb.files !== 'undefined'); | ||||
| 			assert(typeof wb.keys !== 'undefined'); | ||||
| 			wb = XLSX.readFile(dir+'formula_stress_test.xlsb', {bookFiles:true}); | ||||
| 			assert(typeof wb.files !== 'undefined'); | ||||
| 			assert(typeof wb.keys !== 'undefined'); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| Subproject commit 09abbe1b28237722d93a8510f42c71094c1244fd | ||||
| Subproject commit 15d10e8eba67bafd07a406b3345c9309739b5da1 | ||||
							
								
								
									
										76
									
								
								xlsx.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										76
									
								
								xlsx.js
									
									
									
									
									
								
							| @ -9,7 +9,7 @@ var _strrev = function(x) { return String(x).split("").reverse().join("");}; | ||||
| function fill(c,l) { return new Array(l+1).join(c); } | ||||
| function pad(v,d,c){var t=String(v);return t.length>=d?t:(fill(c||0,d-t.length)+t);} | ||||
| function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));} | ||||
| SSF.version = '0.5.7'; | ||||
| SSF.version = '0.5.8'; | ||||
| /* Options */ | ||||
| var opts_fmt = {}; | ||||
| function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];} | ||||
| @ -116,7 +116,7 @@ var general_fmt = function(v) { | ||||
| 		return o.replace("e","E").replace(/\.0*$/,"").replace(/\.([0-9]*[^0])0*$/,".$1").replace(/(E[+-])([0-9])$/,"$1"+"0"+"$2"); | ||||
| 	} | ||||
| 	if(typeof v === 'string') return v; | ||||
| 	throw "unsupported value in General format: " + v; | ||||
| 	throw new Error("unsupported value in General format: " + v); | ||||
| }; | ||||
| SSF._general = general_fmt; | ||||
| var parse_date_code = function parse_date_code(v,opts) { | ||||
| @ -233,7 +233,7 @@ var write_num = function(type, fmt, val) { | ||||
| 		return o.replace("e","E"); | ||||
| 	} | ||||
| 	if(fmt[0] === "$") return "$"+write_num(type,fmt.substr(fmt[1]==' '?2:1),val); | ||||
| 	var r, ff, aval = val < 0 ? -val : val, sign = val < 0 ? "-" : ""; | ||||
| 	var r, rr, ff, aval = val < 0 ? -val : val, sign = val < 0 ? "-" : ""; | ||||
| 	if((r = fmt.match(/# (\?+)([ ]?)\/([ ]?)(\d+)/))) { | ||||
| 		var den = Number(r[4]), rnd = Math.round(aval * den), base = Math.floor(rnd/den); | ||||
| 		var myn = (rnd - base*den), myd = den; | ||||
| @ -246,8 +246,17 @@ var write_num = function(type, fmt, val) { | ||||
| 		o = Math.round(val * Math.pow(10,r[1].length)); | ||||
| 		return String(o/Math.pow(10,r[1].length)).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.([0-9]*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); }); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		o = Math.round(val*Math.pow(10,r[2].length)); | ||||
| 		return String(o * Math.pow(10,-r[2].length)).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^([-]?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,##0([.]?)$/))) return sign + commaify(String(Math.round(aval))); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		rr = Math.round((val-Math.floor(val))*Math.pow(10,r[1].length)); | ||||
| 		return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(rr,r[1].length,0); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([?]+)([ ]?)\/([ ]?)([?]+)/))) { | ||||
| 		var rr = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		rr = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,rr)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad(ff[1],rr," ") + r[2] + "/" + r[3] + rpad(ff[2],rr," "): fill(" ", 2*rr+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| @ -256,16 +265,6 @@ var write_num = function(type, fmt, val) { | ||||
| 		case "#.##": o = Math.round(val*100); | ||||
| 			return String(o/100).replace(/^([^\.]+)$/,"$1.").replace(/^0\.$/,"."); | ||||
| 		case "#,###": var x = commaify(String(Math.round(aval))); return x !== "0" ? sign + x : ""; | ||||
| 		case "#,##0": return sign + commaify(String(Math.round(aval))); | ||||
| 		case "#,##0.0": r = Math.round((val-Math.floor(val))*10); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,1,"0"); | ||||
| 		case "#,##0.00": r = Math.round((val-Math.floor(val))*100); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,2,"0"); | ||||
| 		case "#,##0.000": r = Math.round((val-Math.floor(val))*1000); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,3,0); | ||||
| 		case "#,##0.0000": r = Math.round((val-Math.floor(val))*10000); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,4,0); | ||||
| 		case "#,##0.00000": r = Math.round((val-Math.floor(val))*Math.pow(10,5)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,5,0); | ||||
| 		case "#,##0.000000": r = Math.round((val-Math.floor(val))*Math.pow(10,6)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,6,0); | ||||
| 		case "#,##0.0000000": r = Math.round((val-Math.floor(val))*Math.pow(10,7)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,7,0); | ||||
| 		case "#,##0.00000000": r = Math.round((val-Math.floor(val))*Math.pow(10,8)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,8,0); | ||||
| 		case "#,##0.000000000": r = Math.round((val-Math.floor(val))*Math.pow(10,9)); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + pad(r,9,0); | ||||
| 		default: | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| @ -282,7 +281,7 @@ function split_fmt(fmt) { | ||||
| 		j = i+1; | ||||
| 	} | ||||
| 	out.push(fmt.slice(j)); | ||||
| 	if(in_str !=-1) throw "Format |" + fmt + "| unterminated string at " + in_str; | ||||
| 	if(in_str !=-1) throw new Error("Format |" + fmt + "| unterminated string at " + in_str); | ||||
| 	return out; | ||||
| } | ||||
| SSF._split = split_fmt; | ||||
| @ -295,7 +294,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
| 		switch((c = fmt[i])) { | ||||
| 			case 'G': /* General */ | ||||
| 				if(fmt.substr(i, i+6).toLowerCase() !== "general") | ||||
| 					throw 'unrecognized character ' + fmt[i] + ' in ' + fmt; | ||||
| 					throw new Error('unrecognized character ' + fmt[i] + ' in ' +fmt); | ||||
| 				out.push({t:'G',v:'General'}); i+=7; break; | ||||
| 			case '"': /* Literal text */ | ||||
| 				for(o="";fmt[++i] !== '"' && i < fmt.length;) o += fmt[i]; | ||||
| @ -338,7 +337,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
| 				} else { o=""; } | ||||
| 				break; | ||||
| 			/* Numbers */ | ||||
| 			case '0': case '#': | ||||
| 			case '0': case '#': case '.': | ||||
| 				o = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) o += c; | ||||
| 				out.push({t:'n', v:o}); break; | ||||
| 			case '?': | ||||
| @ -424,7 +423,7 @@ SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i]) SSF.loa | ||||
| make_ssf(SSF); | ||||
| var XLSX = {}; | ||||
| (function(XLSX){ | ||||
| XLSX.version = '0.5.7'; | ||||
| XLSX.version = '0.5.8'; | ||||
| var current_codepage, current_cptable, cptable; | ||||
| if(typeof module !== "undefined" && typeof require !== 'undefined') { | ||||
| 	if(typeof cptable === 'undefined') cptable = require('codepage'); | ||||
| @ -982,7 +981,7 @@ function parse_sty_bin(data) { | ||||
| 	for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y]; | ||||
| 
 | ||||
| 	styles.CellXf = []; | ||||
| 	var state = ""; | ||||
| 	var state = ""; /* TODO: this should be a stack */ | ||||
| 	var pass = false; | ||||
| 	recordhopper(data, function(val, R, RT) { | ||||
| 		switch(R.n) { | ||||
| @ -1001,8 +1000,14 @@ function parse_sty_bin(data) { | ||||
| 			case 'BrtStyle': break; /* TODO */ | ||||
| 			case 'BrtRowHdr': break; /* TODO */ | ||||
| 			case 'BrtCellMeta': break; /* ?? */ | ||||
| 			case 'BrtDXF': break; /* TODO */ | ||||
| 			case 'BrtMRUColor': break; /* TODO */ | ||||
| 			case 'BrtIndexedColor': break; /* TODO */ | ||||
| 			case 'BrtBeginStyleSheet': break; | ||||
| 			case 'BrtEndStyleSheet': break; | ||||
| 			case 'BrtBeginTableStyle': break; | ||||
| 			case 'BrtTableStyleElement': break; | ||||
| 			case 'BrtEndTableStyle': break; | ||||
| 			case 'BrtBeginFmts': state = "FMTS"; break; | ||||
| 			case 'BrtEndFmts': state = ""; break; | ||||
| 			case 'BrtBeginFonts': state = "FONTS"; break; | ||||
| @ -1023,6 +1028,12 @@ function parse_sty_bin(data) { | ||||
| 			case 'BrtEndDXFs': state = ""; break; | ||||
| 			case 'BrtBeginTableStyles': state = "TABLESTYLES"; break; | ||||
| 			case 'BrtEndTableStyles': state = ""; break; | ||||
| 			case 'BrtBeginColorPalette': state = "COLORPALETTE"; break; | ||||
| 			case 'BrtBeginIndexedColors': state = "INDEXEDCOLORS"; break; | ||||
| 			case 'BrtEndIndexedColors': state = ""; break; | ||||
| 			case 'BrtBeginMRUColors': state = "MRUCOLORS"; break; | ||||
| 			case 'BrtEndMRUColors': state = ""; break; | ||||
| 			case 'BrtEndColorPalette': state = ""; break; | ||||
| 			case 'BrtFRTBegin': pass = true; break; | ||||
| 			case 'BrtFRTEnd': pass = false; break; | ||||
| 			//default: if(!pass) throw new Error("Unexpected record " + RT + " " + R.n);
 | ||||
| @ -1797,6 +1808,11 @@ var parse_wb_bin = function(data) { | ||||
| 			case 'BrtBeginBook': break; | ||||
| 			case 'BrtFileVersion': break; | ||||
| 			case 'BrtWbProp': break; | ||||
| 			case 'BrtACBegin': break; | ||||
| 			case 'BrtAbsPath15': break; | ||||
| 			case 'BrtACEnd': break; | ||||
| 			/*case 'BrtBookProtectionIso': break;*/ | ||||
| 			case 'BrtBookProtection': break; | ||||
| 			case 'BrtBeginBookViews': break; | ||||
| 			case 'BrtBookView': break; | ||||
| 			case 'BrtEndBookViews': break; | ||||
| @ -1806,15 +1822,22 @@ var parse_wb_bin = function(data) { | ||||
| 			case 'BrtEndFnGroup': break; | ||||
| 			case 'BrtBeginExternals': break; | ||||
| 			case 'BrtSupSelf': break; | ||||
| 			case 'BrtSupBookSrc': break; | ||||
| 			case 'BrtExternSheet': break; | ||||
| 			case 'BrtEndExternals': break; | ||||
| 			case 'BrtName': break; | ||||
| 			case 'BrtCalcProp': break; | ||||
| 			case 'BrtUserBookView': break; | ||||
| 			case 'BrtBeginPivotCacheIDs': break; | ||||
| 			case 'BrtBeginPivotCacheID': break; | ||||
| 			case 'BrtEndPivotCacheID': break; | ||||
| 			case 'BrtEndPivotCacheIDs': break; | ||||
| 			case 'BrtWebOpt': break; | ||||
| 			case 'BrtFileRecover': break; | ||||
| 			/*case 'BrtBeginWebPubItems': break; | ||||
| 			case 'BrtBeginWebPubItem': break; | ||||
| 			case 'BrtEndWebPubItem': break; | ||||
| 			case 'BrtEndWebPubItems': break;*/ | ||||
| 			case 'BrtFRTBegin': pass = true; break; | ||||
| 			case 'BrtFRTEnd': pass = false; break; | ||||
| 			case 'BrtEndBook': break; | ||||
| @ -2679,6 +2702,7 @@ function fixopts(opts) { | ||||
| 		['bookDeps', false], /* parse calculation chains */ | ||||
| 		['bookSheets', false], /* only try to get sheet names (no Sheets) */ | ||||
| 		['bookProps', false], /* only try to get properties (no Sheets) */ | ||||
| 		['bookFiles', false], /* include raw file structure (keys, files) */ | ||||
| 
 | ||||
| 		['WTF', false] /* WTF mode (throws errors) */ | ||||
| 	]; | ||||
| @ -2771,7 +2795,7 @@ function parseZip(zip, opts) { | ||||
| 
 | ||||
| 	if(dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts); | ||||
| 
 | ||||
| 	return { | ||||
| 	out = { | ||||
| 		Directory: dir, | ||||
| 		Workbook: wb, | ||||
| 		Props: props, | ||||
| @ -2781,9 +2805,12 @@ function parseZip(zip, opts) { | ||||
| 		SheetNames: props.SheetNames, | ||||
| 		Strings: strs, | ||||
| 		Styles: styles, | ||||
| 		keys: keys, | ||||
| 		files: zip.files | ||||
| 	}; | ||||
| 	if(opts.bookFiles) { | ||||
| 		out.keys = keys, | ||||
| 		out.files = zip.files | ||||
| 	} | ||||
| 	return out; | ||||
| } | ||||
| function readSync(data, options) { | ||||
| 	var zip, d = data; | ||||
| @ -2850,7 +2877,7 @@ function sheet_to_row_object_array(sheet, opts){ | ||||
| 			if(typeof val.w !== 'undefined' && !opts.raw) { row[hdr[C]] = val.w; isempty = false; } | ||||
| 			else switch(val.t){ | ||||
| 				case 's': case 'str': case 'b': case 'n': | ||||
| 					if(val.v !== undefined) { | ||||
| 					if(typeof val.v !== 'undefined') { | ||||
| 						row[hdr[C]] = val.v; | ||||
| 						isempty = false; | ||||
| 					} | ||||
| @ -2881,6 +2908,7 @@ function sheet_to_csv(sheet, opts) { | ||||
| 	if(!sheet || !sheet["!ref"]) return out; | ||||
| 	var r = XLSX.utils.decode_range(sheet["!ref"]); | ||||
| 	var fs = opts.FS||",", rs = opts.RS||"\n"; | ||||
| 
 | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		var row = []; | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| @ -2903,8 +2931,8 @@ function get_formulae(ws) { | ||||
| 		var x = ws[y]; | ||||
| 		var val = ""; | ||||
| 		if(x.f) val = x.f; | ||||
| 		else if(typeof x.w !== 'undefined') val = "'" + x.w; | ||||
| 		else if(typeof x.v === 'undefined') continue; | ||||
| 		else if(typeof x.v === 'number') val = x.v; | ||||
| 		else val = x.v; | ||||
| 		cmds.push(y + "=" + val); | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user