forked from sheetjs/sheetjs
		
	version bump 0.19.0
This commit is contained in:
		
							parent
							
								
									2f329b64e2
								
							
						
					
					
						commit
						050f66ce1b
					
				| @ -4,6 +4,12 @@ This log is intended to keep track of backwards-incompatible changes, including | ||||
| but not limited to API changes and file location changes.  Minor behavioral | ||||
| changes may not be included if they are not expected to break existing code. | ||||
| 
 | ||||
| ## v0.19.0 | ||||
| 
 | ||||
| * XLSX export hyperlinks compatible with google sheets (h/t Evan Bovie) | ||||
| * NUMBERS export multiple sheets, full worksheet range | ||||
| * formalized `dense` mode | ||||
| 
 | ||||
| ## v0.18.12 | ||||
| 
 | ||||
| * `package.json` added types in `exports` structure | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| /*exported XLSX */ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false, Set:false */ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ | ||||
| var XLSX = {}; | ||||
| function make_xlsx_lib(XLSX){ | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| XLSX.version = '0.18.12'; | ||||
| XLSX.version = '0.19.0'; | ||||
|  | ||||
| @ -306,7 +306,7 @@ sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs); | ||||
| /** Chains */ | ||||
| var sector_list/*:SectorList*/ = make_sector_list(sectors, dir_start, fat_addrs, ssz); | ||||
| 
 | ||||
| sector_list[dir_start].name = "!Directory"; | ||||
| if(dir_start < sector_list.length) sector_list[dir_start].name = "!Directory"; | ||||
| if(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT"; | ||||
| sector_list[fat_addrs[0]].name = "!FAT"; | ||||
| sector_list.fat_addrs = fat_addrs; | ||||
|  | ||||
| @ -9,7 +9,6 @@ function fix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^([A-Z])/,"$ | ||||
| function unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\$([A-Z])/,"$1"); } | ||||
| 
 | ||||
| function split_cell(cstr/*:string*/)/*:Array<string>*/ { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); } | ||||
| //function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
 | ||||
| function decode_cell(cstr/*:string*/)/*:CellAddress*/ { | ||||
| 	var R = 0, C = 0; | ||||
| 	for(var i = 0; i < cstr.length; ++i) { | ||||
| @ -19,7 +18,6 @@ function decode_cell(cstr/*:string*/)/*:CellAddress*/ { | ||||
| 	} | ||||
| 	return { c: C - 1, r:R - 1 }; | ||||
| } | ||||
| //function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
 | ||||
| function encode_cell(cell/*:CellAddress*/)/*:string*/ { | ||||
| 	var col = cell.c + 1; | ||||
| 	var s=""; | ||||
| @ -112,9 +110,10 @@ function sheet_to_workbook(sheet/*:Worksheet*/, opts)/*:Workbook*/ { | ||||
| 
 | ||||
| function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksheet*/ { | ||||
| 	var o = opts || {}; | ||||
| 	var dense = _ws ? Array.isArray(_ws) : o.dense; | ||||
| 	var dense = _ws ? (_ws["!data"] != null) : o.dense; | ||||
| 	if(DENSE != null && dense == null) dense = DENSE; | ||||
| 	var ws/*:Worksheet*/ = _ws || (dense ? ([]/*:any*/) : ({}/*:any*/)); | ||||
| 	var ws/*:Worksheet*/ = _ws || ({}/*:any*/); | ||||
| 	if(dense && !ws["!data"]) ws["!data"] = []; | ||||
| 	var _R = 0, _C = 0; | ||||
| 	if(ws && o.origin != null) { | ||||
| 		if(typeof o.origin == 'number') _R = o.origin; | ||||
| @ -133,13 +132,19 @@ function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksh | ||||
| 		range.e.r = Math.max(range.e.r, _range.e.r); | ||||
| 		if(_R == -1) range.e.r = _R = _range.e.r + 1; | ||||
| 	} | ||||
| 	var row = []; | ||||
| 	for(var R = 0; R != data.length; ++R) { | ||||
| 		if(!data[R]) continue; | ||||
| 		if(!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays"); | ||||
| 		var __R = _R + R, __Rstr = "" + (__R + 1); | ||||
| 		if(dense) { | ||||
| 			if(!ws["!data"][__R]) ws["!data"][__R] = []; | ||||
| 			row = ws["!data"][__R]; | ||||
| 		} | ||||
| 		for(var C = 0; C != data[R].length; ++C) { | ||||
| 			if(typeof data[R][C] === 'undefined') continue; | ||||
| 			var cell/*:Cell*/ = ({v: data[R][C] }/*:any*/); | ||||
| 			var __R = _R + R, __C = _C + C; | ||||
| 			var __C = _C + C; | ||||
| 			if(range.s.r > __R) range.s.r = __R; | ||||
| 			if(range.s.c > __C) range.s.c = __C; | ||||
| 			if(range.e.r < __R) range.e.r = __R; | ||||
| @ -163,11 +168,10 @@ function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksh | ||||
| 				else cell.t = 's'; | ||||
| 			} | ||||
| 			if(dense) { | ||||
| 				if(!ws[__R]) ws[__R] = []; | ||||
| 				if(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z; | ||||
| 				ws[__R][__C] = cell; | ||||
| 				if(row[__C] && row[__C].z) cell.z = row[__C].z; | ||||
| 				row[__C] = cell; | ||||
| 			} else { | ||||
| 				var cell_ref = encode_cell(({c:__C,r:__R}/*:any*/)); | ||||
| 				var cell_ref = encode_col(__C) + __Rstr/*:any*/; | ||||
| 				if(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z; | ||||
| 				ws[cell_ref] = cell; | ||||
| 			} | ||||
|  | ||||
| @ -611,7 +611,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		/* TODO: codepage */ | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PSheetJS;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		var RS = "\r\n"; | ||||
| 		var d1904 = (((wb||{}).Workbook||{}).WBProps||{}).date1904; | ||||
| 
 | ||||
| @ -623,10 +623,10 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		preamble.push("B;Y" + (r.e.r - r.s.r + 1) + ";X" + (r.e.c - r.s.c + 1) + ";D" + [r.s.c,r.s.r,r.e.c,r.e.r].join(" ")); | ||||
| 		preamble.push("O;L;D;B" + (d1904 ? ";V4" : "") + ";K47;G100 0.001"); | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			if(dense && !ws["!data"][R]) continue; | ||||
| 			var p = []; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 				cell = dense ? ws["!data"][R][C] : ws[encode_col(C) + encode_row(R)]; | ||||
| 				if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; | ||||
| 				p.push(write_ws_cell_sylk(cell, ws, R, C, opts)); // TODO: pass date1904 info
 | ||||
| 			} | ||||
| @ -699,7 +699,7 @@ var DIF = /*#__PURE__*/(function() { | ||||
| 	function sheet_to_dif(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ { | ||||
| 		var _DIF_XL = DIF_XL; | ||||
| 		var r = safe_decode_range(ws['!ref']); | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		var o/*:Array<string>*/ = [ | ||||
| 			"TABLE\r\n0,1\r\n\"sheetjs\"\r\n", | ||||
| 			"VECTORS\r\n0," + (r.e.r - r.s.r + 1) + "\r\n\"\"\r\n", | ||||
| @ -707,9 +707,10 @@ var DIF = /*#__PURE__*/(function() { | ||||
| 			"DATA\r\n0,0\r\n\"\"\r\n" | ||||
| 		]; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			var row = dense ? ws["!data"][R] : []; | ||||
| 			var p = "-1,0\r\nBOT\r\n"; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var cell/*:Cell*/ = dense ? (ws[R] && ws[R][C]) : ws[encode_cell({r:R,c:C})]; | ||||
| 				var cell/*:Cell*/ = dense ? (row && row[C]) : ws[encode_cell({r:R,c:C})]; | ||||
| 				if(cell == null) { p +=("1,0\r\n\"\"\r\n"); continue;} | ||||
| 				switch(cell.t) { | ||||
| 					case 'n': | ||||
| @ -804,11 +805,11 @@ var ETH = /*#__PURE__*/(function() { | ||||
| 		if(!ws || !ws['!ref']) return ""; | ||||
| 		var o/*:Array<string>*/ = [], oo/*:Array<string>*/ = [], cell, coord = ""; | ||||
| 		var r = decode_range(ws['!ref']); | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null || cell.t === 'z') continue; | ||||
| 				oo = ["cell", coord, 't']; | ||||
| 				switch(cell.t) { | ||||
| @ -930,7 +931,8 @@ var PRN = /*#__PURE__*/(function() { | ||||
| 		var o = opts || {}; | ||||
| 		var sep = ""; | ||||
| 		if(DENSE != null && o.dense == null) o.dense = DENSE; | ||||
| 		var ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var ws/*:Worksheet*/ = ({}/*:any*/); | ||||
| 		if(o.dense) ws["!data"] = []; | ||||
| 		var range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:0}}/*:any*/); | ||||
| 
 | ||||
| 		if(str.slice(0,4) == "sep=") { | ||||
| @ -976,7 +978,7 @@ var PRN = /*#__PURE__*/(function() { | ||||
| 				cell.v = s; | ||||
| 			} | ||||
| 			if(cell.t == 'z'){} | ||||
| 			else if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; } | ||||
| 			else if(o.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = cell; } | ||||
| 			else ws[encode_cell({c:C,r:R})] = cell; | ||||
| 			start = end+1; startcc = str.charCodeAt(start); | ||||
| 			if(range.e.c < C) range.e.c = C; | ||||
| @ -1032,12 +1034,12 @@ var PRN = /*#__PURE__*/(function() { | ||||
| 	function sheet_to_prn(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ { | ||||
| 		var o/*:Array<string>*/ = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			var oo/*:Array<string>*/ = []; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null) { oo.push("          "); continue; } | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10); | ||||
| 				while(w.length < 10) w += " "; | ||||
|  | ||||
| @ -28,8 +28,9 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 		if(!d) return d; | ||||
| 		var o = opts || {}; | ||||
| 		if(DENSE != null && o.dense == null) o.dense = DENSE; | ||||
| 		var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = "Sheet1", next_n = "", sidx = 0; | ||||
| 		var sheets = {}, snames = [], realnames = []; | ||||
| 		var s/*:Worksheet*/ = ({}/*:any*/), n = "Sheet1", next_n = "", sidx = 0; | ||||
| 		var sheets = {}, snames = [], realnames = [], sdata = []; | ||||
| 		if(o.dense) sdata = s["!data"] = []; | ||||
| 
 | ||||
| 		var refguess = {s: {r:0, c:0}, e: {r:0, c:0} }; | ||||
| 		var sheetRows = o.sheetRows || 0; | ||||
| @ -74,13 +75,13 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 							s["!ref"] = encode_range(refguess); | ||||
| 							sheets[n] = s; | ||||
| 							snames.push(n); | ||||
| 							s = (o.dense ? [] : {}); | ||||
| 							s = ({}/*:any*/); if(o.dense) sdata = s["!data"] = []; | ||||
| 							refguess = {s: {r:0, c:0}, e: {r:0, c:0} }; | ||||
| 							sidx = val[3]; n = next_n || "Sheet" + (sidx + 1); next_n = ""; | ||||
| 						} | ||||
| 					} | ||||
| 
 | ||||
| 					var tmpcell = o.dense ? (s[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])]; | ||||
| 					var tmpcell = o.dense ? (sdata[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])]; | ||||
| 					if(tmpcell) { | ||||
| 						tmpcell.t = val[1].t; tmpcell.v = val[1].v; | ||||
| 						if(val[1].z != null) tmpcell.z = val[1].z; | ||||
| @ -88,8 +89,8 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 						break; | ||||
| 					} | ||||
| 					if(o.dense) { | ||||
| 						if(!s[val[0].r]) s[val[0].r] = []; | ||||
| 						s[val[0].r][val[0].c] = val[1]; | ||||
| 						if(!sdata[val[0].r]) sdata[val[0].r] = []; | ||||
| 						sdata[val[0].r][val[0].c] = val[1]; | ||||
| 					} else s[encode_cell(val[0])] = val[1]; | ||||
| 					break; | ||||
| 				case 0x5405: o.works2 = true; break; | ||||
| @ -115,14 +116,14 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 						s["!ref"] = encode_range(refguess); | ||||
| 						sheets[n] = s; | ||||
| 						snames.push(n); | ||||
| 						s = (o.dense ? [] : {}); | ||||
| 						s = ({}/*:any*/); if(o.dense) sdata = s["!data"] = []; | ||||
| 						refguess = {s: {r:0, c:0}, e: {r:0, c:0} }; | ||||
| 						sidx = val[3]; n = "Sheet" + (sidx + 1); | ||||
| 					} | ||||
| 					if(sheetRows > 0 && val[0].r >= sheetRows) break; | ||||
| 					if(o.dense) { | ||||
| 						if(!s[val[0].r]) s[val[0].r] = []; | ||||
| 						s[val[0].r][val[0].c] = val[1]; | ||||
| 						if(!sdata[val[0].r]) sdata[val[0].r] = []; | ||||
| 						sdata[val[0].r][val[0].c] = val[1]; | ||||
| 					} else s[encode_cell(val[0])] = val[1]; | ||||
| 					if(refguess.e.c < val[0].c) refguess.e.c = val[0].c; | ||||
| 					if(refguess.e.r < val[0].r) refguess.e.r = val[0].r; | ||||
| @ -157,18 +158,17 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 		if(o.type == "string") throw new Error("Cannot write WK1 to JS string"); | ||||
| 		var ba = buf_array(); | ||||
| 		var range = safe_decode_range(ws["!ref"]); | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		var cols = []; | ||||
| 
 | ||||
| 		write_biff_rec(ba, 0x00, write_BOF_WK1(0x0406)); | ||||
| 		write_biff_rec(ba, 0x06, write_RANGE(range)); | ||||
| 		var max_R = Math.min(range.e.r, 8191); | ||||
| 		for(var C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); | ||||
| 		for(var R = range.s.r; R <= max_R; ++R) { | ||||
| 			var rr = encode_row(R); | ||||
| 			for(var C = range.s.c; C <= range.e.c; ++C) { | ||||
| 				if(R === range.s.r) cols[C] = encode_col(C); | ||||
| 				var ref = cols[C] + rr; | ||||
| 				var cell = dense ? (ws[R]||[])[C] : ws[ref]; | ||||
| 			for(C = range.s.c; C <= range.e.c; ++C) { | ||||
| 				var cell = dense ? (ws["!data"][R]||[])[C] : ws[cols[C] + rr]; | ||||
| 				if(!cell || cell.t == "z") continue; | ||||
| 				/* TODO: formula records */ | ||||
| 				if(cell.t == "n") { | ||||
| @ -200,7 +200,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 			var ws = wb.Sheets[wb.SheetNames[i]]; | ||||
| 			if(!ws || !ws["!ref"]) continue; | ||||
| 			var range = safe_decode_range(ws["!ref"]); | ||||
| 			var dense = Array.isArray(ws); | ||||
| 			var dense = ws["!data"] != null; | ||||
| 			var cols = []; | ||||
| 			var max_R = Math.min(range.e.r, 8191); | ||||
| 			for(var R = range.s.r; R <= max_R; ++R) { | ||||
| @ -208,7 +208,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 				for(var C = range.s.c; C <= range.e.c; ++C) { | ||||
| 					if(R === range.s.r) cols[C] = encode_col(C); | ||||
| 					var ref = cols[C] + rr; | ||||
| 					var cell = dense ? (ws[R]||[])[C] : ws[ref]; | ||||
| 					var cell = dense ? (ws["!data"][R]||[])[C] : ws[ref]; | ||||
| 					if(!cell || cell.t == "z") continue; | ||||
| 					/* TODO: FORMULA19 NUMBER18 records */ | ||||
| 					if(cell.t == "n") { | ||||
| @ -919,7 +919,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 		prep_blob(d, 0); | ||||
| 		var o = opts || {}; | ||||
| 		if(DENSE != null && o.dense == null) o.dense = DENSE; | ||||
| 		var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/); | ||||
| 		var s/*:Worksheet*/ = ({}/*:any*/); if(o.dense) s["!data"] = []; | ||||
| 		var SST = [], sname = "", formulae = []; | ||||
| 		var range = {s:{r:-1,c:-1}, e:{r:-1,c:-1}}; | ||||
| 		var cnt = 0, type = 0, C = 0, R = 0; | ||||
| @ -956,7 +956,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 
 | ||||
| 				case 0x0601: { /* BOS */ | ||||
| 					var sidx = p.read_shift(2); | ||||
| 					s = ((o.dense ? [] : {})/*:any*/); | ||||
| 					s = ({}/*:any*/); if(o.dense) s["!data"] = []; | ||||
| 					range.s.c = p.read_shift(2); | ||||
| 					range.e.c = p.read_shift(2); | ||||
| 					range.s.r = p.read_shift(4); | ||||
| @ -993,6 +993,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 					R = p.read_shift(4), cnt = p.read_shift(4); | ||||
| 					if(range.s.r > R) range.s.r = R; | ||||
| 					if(range.e.r < R + cnt - 1) range.e.r = R + cnt - 1; | ||||
| 					var CC = encode_col(C); | ||||
| 					while(p.l < p.length) { | ||||
| 						var cell = { t: "z" }; | ||||
| 						var flags = p.read_shift(1); | ||||
| @ -1015,10 +1016,10 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 							default: throw "Unsupported delta for QPW cell type " + (flags & 0x1F); | ||||
| 						} | ||||
| 						if(!(!o.sheetStubs && cell.t == "z")) { | ||||
| 							if(Array.isArray(s)) { | ||||
| 								if(!s[R]) s[R] = []; | ||||
| 								s[R][C] = cell; | ||||
| 							} else s[encode_cell({r:R, c:C})] = cell; | ||||
| 							if(s["!data"] != null) { | ||||
| 								if(!s["!data"][R]) s["!data"][R] = []; | ||||
| 								s["!data"][R][C] = cell; | ||||
| 							} else s[CC + encode_row(R)] = cell; | ||||
| 						} | ||||
| 						++R; --cnt; | ||||
| 						while(mul-- > 0 && cnt >= 0) { | ||||
| @ -1034,10 +1035,10 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 								default: throw "Cannot apply repeat for QPW cell type " + (flags & 0x1F); | ||||
| 							} | ||||
| 							if(!(!o.sheetStubs && cell.t == "z")) { | ||||
| 								if(Array.isArray(s)) { | ||||
| 									if(!s[R]) s[R] = []; | ||||
| 									s[R][C] = cell; | ||||
| 								} else s[encode_cell({r:R, c:C})] = cell; | ||||
| 								if(s["!data"] != null) { | ||||
| 									if(!s["!data"][R]) s["!data"][R] = []; | ||||
| 									s["!data"][R][C] = cell; | ||||
| 								} else s[CC + encode_row(R)] = cell; | ||||
| 							} | ||||
| 							++R; --cnt; | ||||
| 						} | ||||
|  | ||||
| @ -13,14 +13,18 @@ function rtf_to_sheet(d, opts) { | ||||
| } | ||||
| function rtf_to_sheet_str(str, opts) { | ||||
|   var o = opts || {}; | ||||
|   var ws = o.dense ? [] : {}; | ||||
|   var ws = {}; | ||||
|   var dense = o.dense; | ||||
|   if (dense) | ||||
|     ws["!data"] = []; | ||||
|   var rows = str.match(/\\trowd[\s\S]*?\\row\b/g); | ||||
|   if (!rows) | ||||
|     throw new Error("RTF missing table"); | ||||
|   var range = { s: { c: 0, r: 0 }, e: { c: 0, r: rows.length - 1 } }; | ||||
|   var row = []; | ||||
|   rows.forEach(function(rowtf, R) { | ||||
|     if (Array.isArray(ws)) | ||||
|       ws[R] = []; | ||||
|     if (dense) | ||||
|       row = ws["!data"][R] = []; | ||||
|     var rtfre = /\\[\w\-]+\b/g; | ||||
|     var last_index = 0; | ||||
|     var res; | ||||
| @ -46,8 +50,8 @@ function rtf_to_sheet_str(str, opts) { | ||||
|                 cell.w = cell.v; | ||||
|               cell.v = fuzzynum(cell.v); | ||||
|             } | ||||
|             if (Array.isArray(ws)) | ||||
|               ws[R][C] = cell; | ||||
|             if (dense) | ||||
|               row[C] = cell; | ||||
|             else | ||||
|               ws[encode_cell({ r: R, c: C })] = cell; | ||||
|           } | ||||
| @ -75,15 +79,17 @@ function sheet_to_rtf(ws, opts) { | ||||
|   if (!ws["!ref"]) | ||||
|     return o[0] + "}"; | ||||
|   var r = safe_decode_range(ws["!ref"]), cell; | ||||
|   var dense = Array.isArray(ws); | ||||
|   var dense = ws["!data"] != null, row = []; | ||||
|   for (var R = r.s.r; R <= r.e.r; ++R) { | ||||
|     o.push("\\trowd\\trautofit1"); | ||||
|     for (var C = r.s.c; C <= r.e.c; ++C) | ||||
|       o.push("\\cellx" + (C + 1)); | ||||
|     o.push("\\pard\\intbl"); | ||||
|     if (dense) | ||||
|       row = ws["!data"][R] || []; | ||||
|     for (C = r.s.c; C <= r.e.c; ++C) { | ||||
|       var coord = encode_cell({ r: R, c: C }); | ||||
|       cell = dense ? (ws[R] || [])[C] : ws[coord]; | ||||
|       cell = dense ? row[C] : ws[coord]; | ||||
|       if (!cell || cell.v == null && (!cell.f || cell.F)) { | ||||
|         o.push(" \\cell"); | ||||
|         continue; | ||||
|  | ||||
| @ -1,15 +1,15 @@ | ||||
| function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) { | ||||
| 	var dense = Array.isArray(sheet); | ||||
| function sheet_insert_comments(sheet/*:WorkSheet*/, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) { | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var cell/*:Cell*/; | ||||
| 	comments.forEach(function(comment) { | ||||
| 		var r = decode_cell(comment.ref); | ||||
| 		if(dense) { | ||||
| 			if(!sheet[r.r]) sheet[r.r] = []; | ||||
| 			cell = sheet[r.r][r.c]; | ||||
| 			if(!sheet["!data"][r.r]) sheet["!data"][r.r] = []; | ||||
| 			cell = sheet["!data"][r.r][r.c]; | ||||
| 		} else cell = sheet[comment.ref]; | ||||
| 		if (!cell) { | ||||
| 			cell = ({t:"z"}/*:any*/); | ||||
| 			if(dense) sheet[r.r][r.c] = cell; | ||||
| 			if(dense) sheet["!data"][r.r][r.c] = cell; | ||||
| 			else sheet[comment.ref] = cell; | ||||
| 			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1"); | ||||
| 			if(range.s.r > r.r) range.s.r = r.r; | ||||
| @ -17,7 +17,7 @@ function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/* | ||||
| 			if(range.s.c > r.c) range.s.c = r.c; | ||||
| 			if(range.e.c < r.c) range.e.c = r.c; | ||||
| 			var encoded = encode_range(range); | ||||
| 			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded; | ||||
| 			sheet["!ref"] = encoded; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!cell.c) cell.c = []; | ||||
| @ -35,4 +35,3 @@ function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/* | ||||
| 		cell.c.push(o); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -20,7 +20,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 
 | ||||
| 	/* 18.3.1.99 worksheet CT_Worksheet */ | ||||
| 	var s = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 	var s = ({}/*:any*/); if(opts.dense) s["!data"] = []; | ||||
| 	var refguess/*:Range*/ = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} }/*:any*/); | ||||
| 
 | ||||
| 	var data1 = "", data2 = ""; | ||||
| @ -149,7 +149,7 @@ function write_ws_xml_protection(sp)/*:string*/ { | ||||
| } | ||||
| 
 | ||||
| function parse_ws_xml_hlinks(s, data/*:Array<string>*/, rels) { | ||||
| 	var dense = Array.isArray(s); | ||||
| 	var dense = s["!data"] != null; | ||||
| 	for(var i = 0; i != data.length; ++i) { | ||||
| 		var val = parsexmltag(utf8read(data[i]), true); | ||||
| 		if(!val.ref) return; | ||||
| @ -165,11 +165,11 @@ function parse_ws_xml_hlinks(s, data/*:Array<string>*/, rels) { | ||||
| 		if(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; } | ||||
| 		var rng = safe_decode_range(val.ref); | ||||
| 		for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) { | ||||
| 			var addr = encode_cell({c:C,r:R}); | ||||
| 			var addr = encode_col(C) + encode_row(R); | ||||
| 			if(dense) { | ||||
| 				if(!s[R]) s[R] = []; | ||||
| 				if(!s[R][C]) s[R][C] = {t:"z",v:undefined}; | ||||
| 				s[R][C].l = val; | ||||
| 				if(!s["!data"][R]) s["!data"][R] = []; | ||||
| 				if(!s["!data"][R][C]) s["!data"][R][C] = {t:"z",v:undefined}; | ||||
| 				s["!data"][R][C].l = val; | ||||
| 			} else { | ||||
| 				if(!s[addr]) s[addr] = {t:"z",v:undefined}; | ||||
| 				s[addr].l = val; | ||||
| @ -321,7 +321,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 	var do_format = Array.isArray(styles.CellXf), cf; | ||||
| 	var arrayf/*:Array<[Range, string]>*/ = []; | ||||
| 	var sharedf = []; | ||||
| 	var dense = Array.isArray(s); | ||||
| 	var dense = s["!data"] != null; | ||||
| 	var rows/*:Array<RowInfo>*/ = [], rowobj = {}, rowrite = false; | ||||
| 	var sheetStubs = !!opts.sheetStubs; | ||||
| 	for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) { | ||||
| @ -486,8 +486,8 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 			} | ||||
| 			if(dense) { | ||||
| 				var _r = decode_cell(tag.r); | ||||
| 				if(!s[_r.r]) s[_r.r] = []; | ||||
| 				s[_r.r][_r.c] = p; | ||||
| 				if(!s["!data"][_r.r]) s["!data"][_r.r] = []; | ||||
| 				s["!data"][_r.r][_r.c] = p; | ||||
| 			} else s[tag.r] = p; | ||||
| 		} | ||||
| 	} | ||||
| @ -496,7 +496,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 
 | ||||
| function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*//*::, rels*/)/*:string*/ { | ||||
| 	var o/*:Array<string>*/ = [], r/*:Array<string>*/ = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols/*:Array<string>*/ = [], R=0, C=0, rows = ws['!rows']; | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var params = ({r:rr}/*:any*/), row/*:RowInfo*/, height = -1; | ||||
| 	for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(R = range.s.r; R <= range.e.r; ++R) { | ||||
| @ -504,7 +504,7 @@ function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook | ||||
| 		rr = encode_row(R); | ||||
| 		for(C = range.s.c; C <= range.e.c; ++C) { | ||||
| 			ref = cols[C] + rr; | ||||
| 			var _cell = dense ? (ws[R]||[])[C]: ws[ref]; | ||||
| 			var _cell = dense ? (ws["!data"][R]||[])[C]: ws[ref]; | ||||
| 			if(_cell === undefined) continue; | ||||
| 			if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); | ||||
| 		} | ||||
|  | ||||
| @ -41,12 +41,13 @@ function write_BrtRowHdr(R/*:number*/, range, ws) { | ||||
| 	o.l += 4; | ||||
| 
 | ||||
| 	var caddr = {r:R, c:0}; | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	for(var i = 0; i < 16; ++i) { | ||||
| 		if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue; | ||||
| 		var first = -1, last = -1; | ||||
| 		for(var j = (i<<10); j < ((i+1)<<10); ++j) { | ||||
| 			caddr.c = j; | ||||
| 			var cell = Array.isArray(ws) ? (ws[caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)]; | ||||
| 			var cell = dense ? (ws["!data"][caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)]; | ||||
| 			if(cell) { if(first < 0) first = j; last = j; } | ||||
| 		} | ||||
| 		if(first < 0) continue; | ||||
| @ -510,7 +511,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/ | ||||
| 	var opts = _opts || {}; | ||||
| 	if(!rels) rels = {'!id':{}}; | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 	var s/*:Worksheet*/ = (opts.dense ? [] : {}); | ||||
| 	var s/*:Worksheet*/ = ({}); if(opts.dense) s["!data"] = []; | ||||
| 
 | ||||
| 	var ref; | ||||
| 	var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} }; | ||||
| @ -586,7 +587,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/ | ||||
| 				} | ||||
| 				if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles); | ||||
| 				C = val[0].c == -1 ? C + 1 : val[0].c; | ||||
| 				if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } | ||||
| 				if(opts.dense) { if(!s["!data"][R]) s["!data"][R] = []; s["!data"][R][C] = p; } | ||||
| 				else s[encode_col(C) + rr] = p; | ||||
| 				if(opts.cellFormula) { | ||||
| 					af = false; | ||||
| @ -619,7 +620,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/ | ||||
| 				if(!opts.sheetStubs || pass) break; | ||||
| 				p = ({t:'z',v:void 0}/*:any*/); | ||||
| 				C = val[0].c == -1 ? C + 1 : val[0].c; | ||||
| 				if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } | ||||
| 				if(opts.dense) { if(!s["!data"][R]) s["!data"][R] = []; s["!data"][R][C] = p; } | ||||
| 				else s[encode_col(C) + rr] = p; | ||||
| 				if(refguess.s.r > row.r) refguess.s.r = row.r; | ||||
| 				if(refguess.s.c > C) refguess.s.c = C; | ||||
| @ -650,11 +651,11 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/ | ||||
| 				} | ||||
| 				for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) { | ||||
| 					if(opts.dense) { | ||||
| 						if(!s[R]) s[R] = []; | ||||
| 						if(!s[R][C]) s[R][C] = {t:'z',v:undefined}; | ||||
| 						s[R][C].l = val; | ||||
| 						if(!s["!data"][R]) s["!data"][R] = []; | ||||
| 						if(!s["!data"][R][C]) s["!data"][R][C] = {t:'z',v:undefined}; | ||||
| 						s["!data"][R][C].l = val; | ||||
| 					} else { | ||||
| 						addr = encode_cell({c:C,r:R}); | ||||
| 						addr = encode_col(C) + encode_row(R); | ||||
| 						if(!s[addr]) s[addr] = {t:'z',v:undefined}; | ||||
| 						s[addr].l = val; | ||||
| 					} | ||||
| @ -664,14 +665,14 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/ | ||||
| 			case 0x01AA: /* 'BrtArrFmla' */ | ||||
| 				if(!opts.cellFormula) break; | ||||
| 				arrayf.push(val); | ||||
| 				cell = ((opts.dense ? s[R][C] : s[encode_col(C) + rr])/*:any*/); | ||||
| 				cell = ((opts.dense ? s["!data"][R][C] : s[encode_col(C) + rr])/*:any*/); | ||||
| 				cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts); | ||||
| 				cell.F = encode_range(val[0]); | ||||
| 				break; | ||||
| 			case 0x01AB: /* 'BrtShrFmla' */ | ||||
| 				if(!opts.cellFormula) break; | ||||
| 				sharedf[encode_cell(val[0].s)] = val[1]; | ||||
| 				cell = (opts.dense ? s[R][C] : s[encode_col(C) + rr]); | ||||
| 				cell = (opts.dense ? s["!data"][R][C] : s[encode_col(C) + rr]); | ||||
| 				cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts); | ||||
| 				break; | ||||
| 
 | ||||
| @ -864,7 +865,7 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num | ||||
| function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) { | ||||
| 	var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols/*:Array<string>*/ = []; | ||||
| 	write_record(ba, 0x0091 /* BrtBeginSheetData */); | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var cap = range.e.r; | ||||
| 	if(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1); | ||||
| 	for(var R = range.s.r; R <= cap; ++R) { | ||||
| @ -877,7 +878,7 @@ function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Work | ||||
| 			/* *16384CELL */ | ||||
| 			if(R === range.s.r) cols[C] = encode_col(C); | ||||
| 			ref = cols[C] + rr; | ||||
| 			var cell = dense ? (ws[R]||[])[C] : ws[ref]; | ||||
| 			var cell = dense ? (ws["!data"][R]||[])[C] : ws[ref]; | ||||
| 			if(!cell) { last_seen = false; continue; } | ||||
| 			/* write cell */ | ||||
| 			last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen); | ||||
|  | ||||
| @ -34,7 +34,10 @@ function parse_chart(data/*:?string*/, name/*:string*/, opts, rels, wb, csheet) | ||||
| 		refguess.e.c = C; | ||||
| 		col = encode_col(C); | ||||
| 		cache[0].forEach(function(n,i) { | ||||
| 			cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] }; | ||||
| 			if(cs["!data"]) { | ||||
| 				if(!cs["!data"][i]) cs["!data"][i] = []; | ||||
| 				cs["!data"][i][C] = {t:'n', v:n, z:cache[1] }; | ||||
| 			} else cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] }; | ||||
| 			R = i; | ||||
| 		}); | ||||
| 		if(refguess.e.r < R) refguess.e.r = R; | ||||
|  | ||||
| @ -207,7 +207,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 	var Rn; | ||||
| 	var state = [], tmp; | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 	var sheets = {}, sheetnames/*:Array<string>*/ = [], cursheet/*:Worksheet*/ = (opts.dense ? [] : {}), sheetname = ""; | ||||
| 	var sheets = {}, sheetnames/*:Array<string>*/ = [], cursheet/*:Worksheet*/ = ({}), sheetname = ""; if(opts.dense) cursheet["!data"] = []; | ||||
| 	var cell = ({}/*:any*/), row = {};// eslint-disable-line no-unused-vars
 | ||||
| 	var dtag = xlml_parsexmltag('<Data ss:Type="String">'), didx = 0; | ||||
| 	var c = 0, r = 0; | ||||
| @ -240,8 +240,8 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 				if(comments.length > 0) cell.c = comments; | ||||
| 				if((!opts.sheetRows || opts.sheetRows > r) && cell.v !== void 0) { | ||||
| 					if(opts.dense) { | ||||
| 						if(!cursheet[r]) cursheet[r] = []; | ||||
| 						cursheet[r][c] = cell; | ||||
| 						if(!cursheet["!data"][r]) cursheet["!data"][r] = []; | ||||
| 						cursheet["!data"][r][c] = cell; | ||||
| 					} else cursheet[encode_col(c) + encode_row(r)] = cell; | ||||
| 				} | ||||
| 				if(cell.HRef) { | ||||
| @ -261,8 +261,8 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 						for(var cmd = r; cmd <= rr; ++cmd) { | ||||
| 							if(cma > c || cmd > r) { | ||||
| 								if(opts.dense) { | ||||
| 									if(!cursheet[cmd]) cursheet[cmd] = []; | ||||
| 									cursheet[cmd][cma] = {t:'z'}; | ||||
| 									if(!cursheet["!data"][cmd]) cursheet["!data"][cmd] = []; | ||||
| 									cursheet["!data"][cmd][cma] = {t:'z'}; | ||||
| 								} else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'}; | ||||
| 							} | ||||
| 						} | ||||
| @ -321,7 +321,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ { | ||||
| 				state.push([Rn[3], false]); | ||||
| 				tmp = xlml_parsexmltag(Rn[0]); | ||||
| 				sheetname = unescapexml(tmp.Name); | ||||
| 				cursheet = (opts.dense ? [] : {}); | ||||
| 				cursheet = ({}); if(opts.dense) cursheet["!data"] = []; | ||||
| 				merges = []; | ||||
| 				arrayf = []; | ||||
| 				rowinfo = []; | ||||
| @ -1177,7 +1177,7 @@ function write_ws_xlml_table(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbo | ||||
| 		if(n.hidden) k['ss:Hidden']="1"; | ||||
| 		o.push(writextag("Column",null,k)); | ||||
| 	}); | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	for(var R = range.s.r; R <= range.e.r; ++R) { | ||||
| 		var row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])]; | ||||
| 		for(var C = range.s.c; C <= range.e.c; ++C) { | ||||
| @ -1192,7 +1192,7 @@ function write_ws_xlml_table(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbo | ||||
| 			} | ||||
| 			if(skip) continue; | ||||
| 			var addr = {r:R,c:C}; | ||||
| 			var ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref]; | ||||
| 			var ref = encode_col(C) + encode_row(R), cell = dense ? (ws["!data"][R]||[])[C] : ws[ref]; | ||||
| 			row.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr)); | ||||
| 		} | ||||
| 		row.push("</Row>"); | ||||
|  | ||||
| @ -104,7 +104,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 	var wb = ({opts:{}}/*:any*/); | ||||
| 	var Sheets = {}; | ||||
| 	if(DENSE != null && options.dense == null) options.dense = DENSE; | ||||
| 	var out/*:Worksheet*/ = ((options.dense ? [] : {})/*:any*/); | ||||
| 	var out/*:Worksheet*/ = ({}/*:any*/); if(options.dense) out["!data"] = []; | ||||
| 	var Directory = {}; | ||||
| 	var range/*:Range*/ = ({}/*:any*/); | ||||
| 	var last_formula = null; | ||||
| @ -157,8 +157,8 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 		} | ||||
| 		{ | ||||
| 			if(options.dense) { | ||||
| 				if(!out[cell.r]) out[cell.r] = []; | ||||
| 				out[cell.r][cell.c] = line; | ||||
| 				if(!out["!data"][cell.r]) out["!data"][cell.r] = []; | ||||
| 				out["!data"][cell.r][cell.c] = line; | ||||
| 			} else out[last_cell] = line; | ||||
| 		} | ||||
| 	}; | ||||
| @ -324,7 +324,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 						Workbook.Sheets.push(wsprops); | ||||
| 					} | ||||
| 					if(cur_sheet === "") Preamble = out; else Sheets[cur_sheet] = out; | ||||
| 					out = ((options.dense ? [] : {})/*:any*/); | ||||
| 					out = ({}/*:any*/); if(options.dense) out["!data"] = []; | ||||
| 				} break; | ||||
| 				case 0x0009: case 0x0209: case 0x0409: case 0x0809 /* BOF */: { | ||||
| 					if(opts.biff === 8) opts.biff = { | ||||
| @ -344,7 +344,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 					if(val.BIFFVer == 0 && val.dt == 0x1000) { opts.biff = 5; seen_codepage = true; set_cp(opts.codepage = 28591); } | ||||
| 					if(opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16) opts.biff = 2; | ||||
| 					if(file_depth++) break; | ||||
| 					out = ((options.dense ? [] : {})/*:any*/); | ||||
| 					out = ({}/*:any*/); if(options.dense) out["!data"] = []; | ||||
| 
 | ||||
| 					if(opts.biff < 8 && !seen_codepage) { seen_codepage = true; set_cp(opts.codepage = options.codepage || 1252); } | ||||
| 
 | ||||
| @ -367,7 +367,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 					wsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet }; | ||||
| 				} break; | ||||
| 				case 0x0203 /* Number */: case 0x0003 /* BIFF2NUM */: case 0x0002 /* BIFF2INT */: { | ||||
| 					if(out["!type"] == "chart") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c; | ||||
| 					if(out["!type"] == "chart") if(options.dense ? (out["!data"][val.r]||[])[val.c]: out[encode_col(val.c) + encode_row(val.r)]) ++val.c; | ||||
| 					temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'}/*:any*/); | ||||
| 					if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; | ||||
| 					safe_format_xf(temp_val, options, wb.opts.Date1904); | ||||
| @ -404,7 +404,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 							var _fr = _f[0][0][1][0], _fc = _f[0][0][1][1]; | ||||
| 							var _fe = encode_cell({r:_fr, c:_fc}); | ||||
| 							if(sharedf[_fe]) temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts); | ||||
| 							else temp_val.F = ((options.dense ? (out[_fr]||[])[_fc]: out[_fe]) || {}).F; | ||||
| 							else temp_val.F = ((options.dense ? (out["!data"][_fr]||[])[_fc]: out[_fe]) || {}).F; | ||||
| 						} else temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts); | ||||
| 					} | ||||
| 					if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; | ||||
| @ -429,7 +429,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 				case 0x0021: case 0x0221 /* Array */: { | ||||
| 					arrayf.push(val); | ||||
| 					var _arraystart = encode_cell(val[0].s); | ||||
| 					cc = options.dense ? (out[val[0].s.r]||[])[val[0].s.c] : out[_arraystart]; | ||||
| 					cc = options.dense ? (out["!data"][val[0].s.r]||[])[val[0].s.c] : out[_arraystart]; | ||||
| 					if(options.cellFormula && cc) { | ||||
| 						if(!last_formula) break; /* technically unreachable */ | ||||
| 						if(!_arraystart || !cc) break; | ||||
| @ -443,7 +443,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 						/* TODO: capture range */ | ||||
| 						if(!last_formula) break; /* technically unreachable */ | ||||
| 						sharedf[encode_cell(last_formula.cell)]= val[0]; | ||||
| 						cc = options.dense ? (out[last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)]; | ||||
| 						cc = options.dense ? (out["!data"][last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)]; | ||||
| 						(cc||{}).f = ""+stringify_formula(val[0], range, lastcell, supbooks, opts); | ||||
| 					} | ||||
| 				} break; | ||||
| @ -508,25 +508,25 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 				case 0x01b8 /* HLink */: { | ||||
| 					for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR) | ||||
| 						for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) { | ||||
| 							cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})]; | ||||
| 							cc = options.dense ? (out["!data"][rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})]; | ||||
| 							if(cc) cc.l = val[1]; | ||||
| 						} | ||||
| 				} break; | ||||
| 				case 0x0800 /* HLinkTooltip */: { | ||||
| 					for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR) | ||||
| 						for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) { | ||||
| 							cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})]; | ||||
| 							cc = options.dense ? (out["!data"][rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})]; | ||||
| 							if(cc && cc.l) cc.l.Tooltip = val[1]; | ||||
| 							} | ||||
| 				} break; | ||||
| 				case 0x001c /* Note */: { | ||||
| 					if(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */ | ||||
| 					cc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])]; | ||||
| 					cc = options.dense ? (out["!data"][val[0].r]||[])[val[0].c] : out[encode_cell(val[0])]; | ||||
| 					var noteobj = objects[val[2]]; | ||||
| 					if(!cc) { | ||||
| 						if(options.dense) { | ||||
| 							if(!out[val[0].r]) out[val[0].r] = []; | ||||
| 							cc = out[val[0].r][val[0].c] = ({t:"z"}/*:any*/); | ||||
| 							if(!out["!data"][val[0].r]) out["!data"][val[0].r] = []; | ||||
| 							cc = out["!data"][val[0].r][val[0].c] = ({t:"z"}/*:any*/); | ||||
| 						} else { | ||||
| 							cc = out[encode_cell(val[0])] = ({t:"z"}/*:any*/); | ||||
| 						} | ||||
|  | ||||
| @ -75,20 +75,20 @@ function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:n | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff2(ba/*:BufArray*/, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) { | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var range = safe_decode_range(ws['!ref'] || "A1"), ref/*:string*/, rr = "", cols/*:Array<string>*/ = []; | ||||
| 	if(range.e.c > 0xFF || range.e.r > 0x3FFF) { | ||||
| 		if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384"); | ||||
| 		range.e.c = Math.min(range.e.c, 0xFF); | ||||
| 		range.e.r = Math.min(range.e.c, 0x3FFF); | ||||
| 		ref = encode_range(range); | ||||
| 	} | ||||
| 	var row = []; | ||||
| 	for(var C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(var R = range.s.r; R <= range.e.r; ++R) { | ||||
| 		if(dense) row = ws["!data"][R] || []; | ||||
| 		rr = encode_row(R); | ||||
| 		for(var C = range.s.c; C <= range.e.c; ++C) { | ||||
| 			if(R === range.s.r) cols[C] = encode_col(C); | ||||
| 			ref = cols[C] + rr; | ||||
| 			var cell = dense ? (ws[R]||[])[C] : ws[ref]; | ||||
| 		for(C = range.s.c; C <= range.e.c; ++C) { | ||||
| 			var cell = dense ? row[C] : ws[cols[C] + rr]; | ||||
| 			if(!cell) continue; | ||||
| 			/* write cell */ | ||||
| 			write_ws_biff2_cell(ba, cell, R, C, opts); | ||||
| @ -99,7 +99,6 @@ function write_ws_biff2(ba/*:BufArray*/, ws/*:Worksheet*/, idx/*:number*/, opts/ | ||||
| /* Based on test files */ | ||||
| function write_biff2_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { | ||||
| 	var o = opts || {}; | ||||
| 	if(DENSE != null && o.dense == null) o.dense = DENSE; | ||||
| 	var ba = buf_array(); | ||||
| 	var idx = 0; | ||||
| 	for(var i=0;i<wb.SheetNames.length;++i) if(wb.SheetNames[i] == o.sheet) idx=i; | ||||
| @ -207,7 +206,7 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) { | ||||
| 	var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {}; | ||||
| 	var _WB/*:WBWBProps*/ = ((wb||{}).Workbook||{}/*:any*/); | ||||
| 	var _sheet/*:WBWSProp*/ = ((_WB.Sheets||[])[idx]||{}/*:any*/); | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var b8 = opts.biff == 8; | ||||
| 	var ref/*:string*/, rr = "", cols/*:Array<string>*/ = []; | ||||
| 	var range = safe_decode_range(ws['!ref'] || "A1"); | ||||
| @ -243,12 +242,14 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) { | ||||
| 
 | ||||
| 	if(b8) ws['!links'] = []; | ||||
| 	var comments = []; | ||||
| 	var row = []; | ||||
| 	for(var C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(var R = range.s.r; R <= range.e.r; ++R) { | ||||
| 		if(dense) row = ws["!data"][R] || []; | ||||
| 		rr = encode_row(R); | ||||
| 		for(var C = range.s.c; C <= range.e.c; ++C) { | ||||
| 			if(R === range.s.r) cols[C] = encode_col(C); | ||||
| 		for(C = range.s.c; C <= range.e.c; ++C) { | ||||
| 			ref = cols[C] + rr; | ||||
| 			var cell = dense ? (ws[R]||[])[C] : ws[ref]; | ||||
| 			var cell = dense ? row[C] : ws[ref]; | ||||
| 			if(!cell) continue; | ||||
| 			/* write cell */ | ||||
| 			write_ws_biff8_cell(ba, cell, R, C, opts); | ||||
|  | ||||
| @ -1,8 +1,8 @@ | ||||
| /* note: browser DOM element cannot see mso- style attrs, must parse */ | ||||
| function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ { | ||||
| 	var opts = _opts || {}; | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 	var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 	var dense = (opts.dense != null) ? opts.dense : DENSE; | ||||
| 	var ws/*:Worksheet*/ = ({}/*:any*/); if(dense) ws["!data"] = []; | ||||
| 	str = str.replace(/<!--.*?-->/g, ""); | ||||
| 	var mtch/*:any*/ = str.match(/<table/i); | ||||
| 	if(!mtch) throw new Error("Invalid HTML: could not find <table>"); | ||||
| @ -48,7 +48,7 @@ function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ { | ||||
| 				if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/); | ||||
| 				o.z = opts.dateNF || table_fmt[14]; | ||||
| 			} | ||||
| 			if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; } | ||||
| 			if(dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = o; } | ||||
| 			else ws[encode_cell({r:R, c:C})] = o; | ||||
| 			C += CS; | ||||
| 		} | ||||
| @ -61,6 +61,7 @@ function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HT | ||||
| 	var M/*:Array<Range>*/ = (ws['!merges'] ||[]); | ||||
| 	var oo/*:Array<string>*/ = []; | ||||
| 	var sp = ({}/*:any*/); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var RS = 0, CS = 0; | ||||
| 		for(var j = 0; j < M.length; ++j) { | ||||
| @ -70,8 +71,8 @@ function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HT | ||||
| 			RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break; | ||||
| 		} | ||||
| 		if(RS < 0) continue; | ||||
| 		var coord = encode_cell({r:R,c:C}); | ||||
| 		var cell = o.dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 		var coord = encode_col(C) + encode_row(R); | ||||
| 		var cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 		/* TODO: html entities */ | ||||
| 		var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || ""; | ||||
| 		sp = ({}/*:any*/); | ||||
| @ -119,7 +120,6 @@ function sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*//*, wb:?Workboo | ||||
| 	var footer = o.footer != null ? o.footer : HTML_END; | ||||
| 	var out/*:Array<string>*/ = [header]; | ||||
| 	var r = decode_range(ws['!ref']); | ||||
| 	o.dense = Array.isArray(ws); | ||||
| 	out.push(make_html_preamble(ws, r, o)); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o)); | ||||
| 	out.push("</table>" + footer); | ||||
| @ -134,7 +134,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/ | ||||
| 	} | ||||
| 
 | ||||
| 	var opts = _opts || {}; | ||||
| 	if(DENSE != null) opts.dense = DENSE; | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var or_R = 0, or_C = 0; | ||||
| 	if(opts.origin != null) { | ||||
| 		if(typeof opts.origin == 'number') or_R = opts.origin; | ||||
| @ -199,7 +199,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/ | ||||
| 				l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break; | ||||
| 			} | ||||
| 			if(l && l.charAt(0) != "#" &&	l.slice(0, 11).toLowerCase() != 'javascript:') o.l = ({ Target: l }); | ||||
| 			if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; } | ||||
| 			if(dense) { if(!ws["!data"][R + or_R]) ws["!data"][R + or_R] = []; ws["!data"][R + or_R][C + or_C] = o; } | ||||
| 			else ws[encode_cell({c:C + or_C, r:R + or_R})] = o; | ||||
| 			if(range.e.c < C + or_C) range.e.c = C + or_C; | ||||
| 			C += CS; | ||||
| @ -215,7 +215,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/ | ||||
| 
 | ||||
| function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ { | ||||
| 	var opts = _opts || {}; | ||||
| 	var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 	var ws/*:Worksheet*/ = ({}/*:any*/); if(opts.dense) ws["!data"] = []; | ||||
| 	return sheet_add_dom(ws, table, _opts); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -245,7 +245,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 		var sheetag/*:: = {name:"", '名称':""}*/; | ||||
| 		var rowtag/*:: = {'行号':""}*/; | ||||
| 		var Sheets = {}, SheetNames/*:Array<string>*/ = []; | ||||
| 		var ws = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var ws = ({}/*:any*/); if(opts.dense) ws["!data"] = []; | ||||
| 		var Rn, q/*:: :any = ({t:"", v:null, z:null, w:"",c:[],}:any)*/; | ||||
| 		var ctag = ({value:""}/*:any*/); | ||||
| 		var textp = "", textpidx = 0, textptag/*:: = {}*/; | ||||
| @ -289,7 +289,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 					sheetag = parsexmltag(Rn[0], false); | ||||
| 					R = C = -1; | ||||
| 					range.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0; | ||||
| 					ws = opts.dense ? ([]/*:any*/) : ({}/*:any*/); merges = []; | ||||
| 					ws = ({}/*:any*/); if(opts.dense) ws["!data"] = []; merges = []; | ||||
| 					rowinfo = []; | ||||
| 					intable = true; | ||||
| 				} | ||||
| @ -309,7 +309,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | ||||
| 				if(Rn[1] !== '/') ++C; | ||||
| 				if(opts.sheetStubs) { | ||||
| 					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; } | ||||
| 					if(opts.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = {t:'z'}; } | ||||
| 					else ws[encode_cell({r:R,c:C})] = {t:'z'}; | ||||
| 				} | ||||
| 				textp = ""; textR = []; | ||||
| @ -325,10 +325,10 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 					if((ctag['数据类型'] || ctag['value-type']) == "string") { | ||||
| 						q.t = "s"; q.v = unescapexml(ctag['string-value'] || ""); | ||||
| 						if(opts.dense) { | ||||
| 							if(!ws[R]) ws[R] = []; | ||||
| 							ws[R][C] = q; | ||||
| 							if(!ws["!data"][R]) ws["!data"][R] = []; | ||||
| 							ws["!data"][R][C] = q; | ||||
| 						} else { | ||||
| 							ws[encode_cell({r:R,c:C})] = q; | ||||
| 							ws[encode_col(C) + encode_row(R)] = q; | ||||
| 						} | ||||
| 					} | ||||
| 					C+= colpeat-1; | ||||
| @ -405,9 +405,9 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 							for(var rpt = 0; rpt < rowpeat; ++rpt) { | ||||
| 								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10); | ||||
| 								if(opts.dense) { | ||||
| 									if(!ws[R + rpt]) ws[R + rpt] = []; | ||||
| 									ws[R + rpt][C] = rpt == 0 ? q : dup(q); | ||||
| 									while(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q); | ||||
| 									if(!ws["!data"][R + rpt]) ws["!data"][R + rpt] = []; | ||||
| 									ws["!data"][R + rpt][C] = rpt == 0 ? q : dup(q); | ||||
| 									while(--colpeat > 0) ws["!data"][R + rpt][C + colpeat] = dup(q); | ||||
| 								} else { | ||||
| 									ws[encode_cell({r:R + rpt,c:C})] = q; | ||||
| 									while(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q); | ||||
|  | ||||
| @ -211,7 +211,7 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function | ||||
| 		o.push('      <table:table table:name="' + escapexml(wb.SheetNames[i]) + '" table:style-name="ta1">\n'); | ||||
| 		var R=0,C=0, range = decode_range(ws['!ref']||"A1"); | ||||
| 		var marr/*:Array<Range>*/ = ws['!merges'] || [], mi = 0; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		if(ws["!cols"]) { | ||||
| 			for(C = 0; C <= range.e.c; ++C) o.push('        <table:table-column' + (ws["!cols"][C] ? ' table:style-name="co' + ws["!cols"][C].ods + '"' : '') + '></table:table-column>\n'); | ||||
| 		} | ||||
| @ -237,7 +237,7 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function | ||||
| 					break; | ||||
| 				} | ||||
| 				if(skip) { o.push(covered_cell_xml); continue; } | ||||
| 				var ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref]; | ||||
| 				var ref = encode_cell({r:R, c:C}), cell = dense ? (ws["!data"][R]||[])[C]: ws[ref]; | ||||
| 				if(cell && cell.f) { | ||||
| 					ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f)); | ||||
| 					if(cell.F) { | ||||
| @ -347,9 +347,10 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function | ||||
| 		var nfi = 69; | ||||
| 		wb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) { | ||||
| 			if(!ws) return; | ||||
| 			var dense = (ws["!data"] != null); | ||||
| 			var range = decode_range(ws["!ref"]); | ||||
| 			for(var R = 0; R <= range.e.r; ++R) for(var C = 0; C <= range.e.c; ++C) { | ||||
| 				var c = Array.isArray(ws) ? (ws[R]||[])[C] : ws[encode_cell({r:R,c:C})]; | ||||
| 				var c = dense ? (ws["!data"][R]||[])[C] : ws[encode_cell({r:R,c:C})]; | ||||
| 				if(!c || !c.z || c.z.toLowerCase() == "general") continue; | ||||
| 				if(!nfs[c.z]) { | ||||
| 					var out = write_number_format_ods(c.z, "N" + nfi); | ||||
|  | ||||
| @ -26,29 +26,22 @@ function u8str(u8) { | ||||
| function stru8(str) { | ||||
|   return typeof TextEncoder != "undefined" ? new TextEncoder().encode(str) : s2a(utf8write(str)); | ||||
| } | ||||
| function u8contains(body, search) { | ||||
|   var L = body.indexOf(search[0]); | ||||
|   if (L == -1) | ||||
|     return false; | ||||
|   outer: | ||||
|     for (; L <= body.length - search.length; ++L) { | ||||
|       for (var j = 0; j < search.length; ++j) | ||||
|         if (body[L + j] != search[j]) | ||||
|           continue outer; | ||||
|       return true; | ||||
|     } | ||||
|   return false; | ||||
| } | ||||
| function u8concat(u8a) { | ||||
|   var len = u8a.reduce(function(acc, x) { | ||||
|     return acc + x.length; | ||||
|   }, 0); | ||||
|   var len = 0; | ||||
|   for (var i = 0; i < u8a.length; ++i) | ||||
|     len += u8a[i].length; | ||||
|   var out = new Uint8Array(len); | ||||
|   var off = 0; | ||||
|   u8a.forEach(function(u8) { | ||||
|     out.set(u8, off); | ||||
|     off += u8.length; | ||||
|   }); | ||||
|   for (i = 0; i < u8a.length; ++i) { | ||||
|     var u8 = u8a[i], L = u8.length; | ||||
|     if (L < 250) { | ||||
|       for (var j = 0; j < L; ++j) | ||||
|         out[off++] = u8[j]; | ||||
|     } else { | ||||
|       out.set(u8, off); | ||||
|       off += L; | ||||
|     } | ||||
|   } | ||||
|   return out; | ||||
| } | ||||
| function popcnt(x) { | ||||
| @ -73,7 +66,7 @@ function writeDecimal128LE(buf, offset, value) { | ||||
|   buf[offset + 15] |= value >= 0 ? 0 : 128; | ||||
| } | ||||
| function parse_varint49(buf, ptr) { | ||||
|   var l = ptr ? ptr[0] : 0; | ||||
|   var l = ptr.l; | ||||
|   var usz = buf[l] & 127; | ||||
|   varint: | ||||
|     if (buf[l++] >= 128) { | ||||
| @ -99,8 +92,7 @@ function parse_varint49(buf, ptr) { | ||||
|       if (buf[l++] < 128) | ||||
|         break varint; | ||||
|     } | ||||
|   if (ptr) | ||||
|     ptr[0] = l; | ||||
|   ptr.l = l; | ||||
|   return usz; | ||||
| } | ||||
| function write_varint49(v) { | ||||
| @ -141,9 +133,9 @@ function write_varint49(v) { | ||||
|   return usz[subarray](0, L); | ||||
| } | ||||
| function parse_packed_varints(buf) { | ||||
|   var ptr = [0]; | ||||
|   var ptr = { l: 0 }; | ||||
|   var out = []; | ||||
|   while (ptr[0] < buf.length) | ||||
|   while (ptr.l < buf.length) | ||||
|     out.push(parse_varint49(buf, ptr)); | ||||
|   return out; | ||||
| } | ||||
| @ -203,50 +195,49 @@ function varint_to_u64(buf) { | ||||
|   return [lo >>> 0, hi >>> 0]; | ||||
| } | ||||
| function parse_shallow(buf) { | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var off = ptr[0]; | ||||
|   var out = [], ptr = { l: 0 }; | ||||
|   while (ptr.l < buf.length) { | ||||
|     var off = ptr.l; | ||||
|     var num = parse_varint49(buf, ptr); | ||||
|     var type = num & 7; | ||||
|     num = Math.floor(num / 8); | ||||
|     var len = 0; | ||||
|     var res; | ||||
|     if (num == 0) | ||||
|       break; | ||||
|     num = num / 8 | 0; | ||||
|     var data; | ||||
|     var l = ptr.l; | ||||
|     switch (type) { | ||||
|       case 0: | ||||
|         { | ||||
|           var l = ptr[0]; | ||||
|           while (buf[ptr[0]++] >= 128) | ||||
|           while (buf[l++] >= 128) | ||||
|             ; | ||||
|           res = buf[subarray](l, ptr[0]); | ||||
|           data = buf[subarray](ptr.l, l); | ||||
|           ptr.l = l; | ||||
|         } | ||||
|         break; | ||||
|       case 1: | ||||
|         { | ||||
|           data = buf[subarray](l, l + 8); | ||||
|           ptr.l = l + 8; | ||||
|         } | ||||
|         break; | ||||
|       case 2: | ||||
|         { | ||||
|           var len = parse_varint49(buf, ptr); | ||||
|           data = buf[subarray](ptr.l, ptr.l + len); | ||||
|           ptr.l += len; | ||||
|         } | ||||
|         break; | ||||
|       case 5: | ||||
|         len = 4; | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         { | ||||
|           data = buf[subarray](l, l + 4); | ||||
|           ptr.l = l + 4; | ||||
|         } | ||||
|         break; | ||||
|       case 1: | ||||
|         len = 8; | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 2: | ||||
|         len = parse_varint49(buf, ptr); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 3: | ||||
|       case 4: | ||||
|       default: | ||||
|         throw new Error("PB Type ".concat(type, " for Field ").concat(num, " at offset ").concat(off)); | ||||
|     } | ||||
|     var v = { data: res, type: type }; | ||||
|     var v = { data: data, type: type }; | ||||
|     if (out[num] == null) | ||||
|       out[num] = [v]; | ||||
|     else | ||||
|       out[num].push(v); | ||||
|       out[num] = []; | ||||
|     out[num].push(v); | ||||
|   } | ||||
|   return out; | ||||
| } | ||||
| @ -273,11 +264,11 @@ function mappa(data, cb) { | ||||
| } | ||||
| function parse_iwa_file(buf) { | ||||
|   var _a; | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|   var out = [], ptr = { l: 0 }; | ||||
|   while (ptr.l < buf.length) { | ||||
|     var len = parse_varint49(buf, ptr); | ||||
|     var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|     ptr[0] += len; | ||||
|     var ai = parse_shallow(buf[subarray](ptr.l, ptr.l + len)); | ||||
|     ptr.l += len; | ||||
|     var res = { | ||||
|       id: varint_to_i32(ai[1][0].data), | ||||
|       messages: [] | ||||
| @ -287,9 +278,9 @@ function parse_iwa_file(buf) { | ||||
|       var fl = varint_to_i32(mi[3][0].data); | ||||
|       res.messages.push({ | ||||
|         meta: mi, | ||||
|         data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
|         data: buf[subarray](ptr.l, ptr.l + fl) | ||||
|       }); | ||||
|       ptr[0] += fl; | ||||
|       ptr.l += fl; | ||||
|     }); | ||||
|     if ((_a = ai[3]) == null ? void 0 : _a[0]) | ||||
|       res.merge = varint_to_i32(ai[3][0].data) >>> 0 > 0; | ||||
| @ -325,45 +316,46 @@ function write_iwa_file(ias) { | ||||
| function parse_snappy_chunk(type, buf) { | ||||
|   if (type != 0) | ||||
|     throw new Error("Unexpected Snappy chunk type ".concat(type)); | ||||
|   var ptr = [0]; | ||||
|   var ptr = { l: 0 }; | ||||
|   var usz = parse_varint49(buf, ptr); | ||||
|   var chunks = []; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var tag = buf[ptr[0]] & 3; | ||||
|   var l = ptr.l; | ||||
|   while (l < buf.length) { | ||||
|     var tag = buf[l] & 3; | ||||
|     if (tag == 0) { | ||||
|       var len = buf[ptr[0]++] >> 2; | ||||
|       var len = buf[l++] >> 2; | ||||
|       if (len < 60) | ||||
|         ++len; | ||||
|       else { | ||||
|         var c = len - 59; | ||||
|         len = buf[ptr[0]]; | ||||
|         len = buf[l]; | ||||
|         if (c > 1) | ||||
|           len |= buf[ptr[0] + 1] << 8; | ||||
|           len |= buf[l + 1] << 8; | ||||
|         if (c > 2) | ||||
|           len |= buf[ptr[0] + 2] << 16; | ||||
|           len |= buf[l + 2] << 16; | ||||
|         if (c > 3) | ||||
|           len |= buf[ptr[0] + 3] << 24; | ||||
|           len |= buf[l + 3] << 24; | ||||
|         len >>>= 0; | ||||
|         len++; | ||||
|         ptr[0] += c; | ||||
|         l += c; | ||||
|       } | ||||
|       chunks.push(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|       ptr[0] += len; | ||||
|       chunks.push(buf[subarray](l, l + len)); | ||||
|       l += len; | ||||
|       continue; | ||||
|     } else { | ||||
|       var offset = 0, length = 0; | ||||
|       if (tag == 1) { | ||||
|         length = (buf[ptr[0]] >> 2 & 7) + 4; | ||||
|         offset = (buf[ptr[0]++] & 224) << 3; | ||||
|         offset |= buf[ptr[0]++]; | ||||
|         length = (buf[l] >> 2 & 7) + 4; | ||||
|         offset = (buf[l++] & 224) << 3; | ||||
|         offset |= buf[l++]; | ||||
|       } else { | ||||
|         length = (buf[ptr[0]++] >> 2) + 1; | ||||
|         length = (buf[l++] >> 2) + 1; | ||||
|         if (tag == 2) { | ||||
|           offset = buf[ptr[0]] | buf[ptr[0] + 1] << 8; | ||||
|           ptr[0] += 2; | ||||
|           offset = buf[l] | buf[l + 1] << 8; | ||||
|           l += 2; | ||||
|         } else { | ||||
|           offset = (buf[ptr[0]] | buf[ptr[0] + 1] << 8 | buf[ptr[0] + 2] << 16 | buf[ptr[0] + 3] << 24) >>> 0; | ||||
|           ptr[0] += 4; | ||||
|           offset = (buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16 | buf[l + 3] << 24) >>> 0; | ||||
|           l += 4; | ||||
|         } | ||||
|       } | ||||
|       if (offset == 0) | ||||
| @ -395,16 +387,15 @@ function parse_snappy_chunk(type, buf) { | ||||
|         if (length) | ||||
|           chunks.push(chunks[j][subarray](0, length)); | ||||
|       } | ||||
|       if (chunks.length > 100) | ||||
|       if (chunks.length > 25) | ||||
|         chunks = [u8concat(chunks)]; | ||||
|     } | ||||
|   } | ||||
|   if (chunks.reduce(function(acc, u8) { | ||||
|     return acc + u8.length; | ||||
|   }, 0) != usz) | ||||
|     throw new Error("Unexpected length: ".concat(chunks.reduce(function(acc, u8) { | ||||
|       return acc + u8.length; | ||||
|     }, 0), " != ").concat(usz)); | ||||
|   var clen = 0; | ||||
|   for (var u8i = 0; u8i < chunks.length; ++u8i) | ||||
|     clen += chunks[u8i].length; | ||||
|   if (clen != usz) | ||||
|     throw new Error("Unexpected length: ".concat(clen, " != ").concat(usz)); | ||||
|   return chunks; | ||||
| } | ||||
| function decompress_iwa_file(buf) { | ||||
| @ -421,7 +412,7 @@ function decompress_iwa_file(buf) { | ||||
|   } | ||||
|   if (l !== buf.length) | ||||
|     throw new Error("data is not a valid framed stream!"); | ||||
|   return u8concat(out); | ||||
|   return out.length == 1 ? out[0] : u8concat(out); | ||||
| } | ||||
| function compress_iwa_file(buf) { | ||||
|   var out = []; | ||||
| @ -468,12 +459,12 @@ function numbers_format_cell(cell, t, flags, ofmt, nfmt) { | ||||
|   var fmt = ver >= 5 ? nfmt : ofmt; | ||||
|   dur: | ||||
|     if (flags & (ver > 4 ? 8 : 4) && cell.t == "n" && ctype == 7) { | ||||
|       var dstyle = ((_a = fmt[7]) == null ? void 0 : _a[0]) ? parse_varint49(fmt[7][0].data) : -1; | ||||
|       var dstyle = ((_a = fmt[7]) == null ? void 0 : _a[0]) ? varint_to_i32(fmt[7][0].data) : -1; | ||||
|       if (dstyle == -1) | ||||
|         break dur; | ||||
|       var dmin = ((_b = fmt[15]) == null ? void 0 : _b[0]) ? parse_varint49(fmt[15][0].data) : -1; | ||||
|       var dmax = ((_c = fmt[16]) == null ? void 0 : _c[0]) ? parse_varint49(fmt[16][0].data) : -1; | ||||
|       var auto = ((_d = fmt[40]) == null ? void 0 : _d[0]) ? parse_varint49(fmt[40][0].data) : -1; | ||||
|       var dmin = ((_b = fmt[15]) == null ? void 0 : _b[0]) ? varint_to_i32(fmt[15][0].data) : -1; | ||||
|       var dmax = ((_c = fmt[16]) == null ? void 0 : _c[0]) ? varint_to_i32(fmt[16][0].data) : -1; | ||||
|       var auto = ((_d = fmt[40]) == null ? void 0 : _d[0]) ? varint_to_i32(fmt[40][0].data) : -1; | ||||
|       var d = cell.v, dd = d; | ||||
|       autodur: | ||||
|         if (auto) { | ||||
| @ -801,7 +792,7 @@ function parse_cell_storage(buf, lut) { | ||||
| } | ||||
| function parse_TSP_Reference(buf) { | ||||
|   var pb = parse_shallow(buf); | ||||
|   return parse_varint49(pb[1][0].data); | ||||
|   return varint_to_i32(pb[1][0].data); | ||||
| } | ||||
| function write_TSP_Reference(idx) { | ||||
|   return write_shallow([ | ||||
| @ -932,7 +923,7 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|   if (range.e.c < 0) | ||||
|     throw new Error("Invalid col varint ".concat(pb[7][0].data)); | ||||
|   ws["!ref"] = encode_range(range); | ||||
|   var dense = Array.isArray(ws); | ||||
|   var dense = ws["!data"] != null, dws = ws; | ||||
|   var store = parse_shallow(pb[4][0].data); | ||||
|   var lut = numbers_lut_new(); | ||||
|   if ((_a = store[4]) == null ? void 0 : _a[0]) | ||||
| @ -957,12 +948,11 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|         var res = parse_cell_storage(buf, lut); | ||||
|         if (res) { | ||||
|           if (dense) { | ||||
|             if (!ws[_R + R]) | ||||
|               ws[_R + R] = []; | ||||
|             ws[_R + R][C] = res; | ||||
|             if (!dws["!data"][_R + R]) | ||||
|               dws["!data"][_R + R] = []; | ||||
|             dws["!data"][_R + R][C] = res; | ||||
|           } else { | ||||
|             var addr = encode_cell({ r: _R + R, c: C }); | ||||
|             ws[addr] = res; | ||||
|             ws[encode_col(C) + encode_row(_R + R)] = res; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
| @ -989,12 +979,9 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
| } | ||||
| function parse_TST_TableInfoArchive(M, root, opts) { | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out; | ||||
|   if (!(opts == null ? void 0 : opts.dense)) | ||||
|     out = { "!ref": "A1" }; | ||||
|   else | ||||
|     out = []; | ||||
|   out["!ref"] = "A1"; | ||||
|   var out = { "!ref": "A1" }; | ||||
|   if (opts == null ? void 0 : opts.dense) | ||||
|     out["!data"] = []; | ||||
|   var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
|   var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
|   if (mtype != 6001) | ||||
| @ -1211,26 +1198,20 @@ function build_numbers_deps(cfb) { | ||||
|       dependents[packet.id] = { deps: [], location: fp, type: varint_to_i32(packet.messages[0].meta[1][0].data) }; | ||||
|     }); | ||||
|   }); | ||||
|   indices.sort(function(x, y) { | ||||
|     return x - y; | ||||
|   }); | ||||
|   var indices_varint = indices.filter(function(x) { | ||||
|     return x > 1; | ||||
|   }).map(function(x) { | ||||
|     return [x, write_varint49(x)]; | ||||
|   }); | ||||
|   cfb.FileIndex.forEach(function(fi) { | ||||
|     if (!fi.name.match(/\.iwa/)) | ||||
|       return; | ||||
|     if (fi.name.match(/OperationStorage/)) | ||||
|       return; | ||||
|     parse_iwa_file(decompress_iwa_file(fi.content)).forEach(function(ia) { | ||||
|       indices_varint.forEach(function(ivi) { | ||||
|         if (ia.messages.some(function(mess) { | ||||
|           return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]); | ||||
|         })) { | ||||
|           dependents[ivi[0]].deps.push(ia.id); | ||||
|         } | ||||
|       ia.messages.forEach(function(mess) { | ||||
|         [5, 6].forEach(function(f) { | ||||
|           if (!mess.meta[f]) | ||||
|             return; | ||||
|           mess.meta[f].forEach(function(x) { | ||||
|             dependents[ia.id].deps.push(varint_to_i32(x.data)); | ||||
|           }); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| @ -1479,7 +1460,7 @@ function numbers_add_ws(cfb, deps, wsidx) { | ||||
|               [], | ||||
|               [{ type: 0, data: write_varint49(0) }] | ||||
|             ]) }); | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|             var parentidx = mlist[3].findIndex(function(m) { | ||||
|               var _a3, _b2; | ||||
|               var mm = parse_shallow(m.data); | ||||
| @ -1542,7 +1523,7 @@ function numbers_add_ws(cfb, deps, wsidx) { | ||||
|                 [], | ||||
|                 [{ type: 0, data: write_varint49(0) }] | ||||
|               ]) }); | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|               var parentidx = mlist[3].findIndex(function(m) { | ||||
|                 var _a2, _b2; | ||||
|                 var mm = parse_shallow(m.data); | ||||
| @ -1602,7 +1583,7 @@ function numbers_add_ws(cfb, deps, wsidx) { | ||||
|                 [], | ||||
|                 [{ type: 0, data: write_varint49(0) }] | ||||
|               ]) }); | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileref + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileref + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|               var parentidx = mlist[3].findIndex(function(m) { | ||||
|                 var _a2, _b2; | ||||
|                 var mm = parse_shallow(m.data); | ||||
| @ -1714,16 +1695,16 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) { | ||||
|           var metadata = numbers_iwa_find(cfb, deps, 2); | ||||
|           var mlist = parse_shallow(metadata.messages[0].data); | ||||
|           var mlst = mlist[3].filter(function(m) { | ||||
|             return parse_varint49(parse_shallow(m.data)[1][0].data) == tileref; | ||||
|             return varint_to_i32(parse_shallow(m.data)[1][0].data) == tileref; | ||||
|           }); | ||||
|           return (mlst == null ? void 0 : mlst.length) ? parse_varint49(parse_shallow(mlst[0].data)[12][0].data) : 0; | ||||
|           return (mlst == null ? void 0 : mlst.length) ? varint_to_i32(parse_shallow(mlst[0].data)[12][0].data) : 0; | ||||
|         }(); | ||||
|         { | ||||
|           CFB.utils.cfb_del(cfb, deps[tileref].location); | ||||
|           numbers_iwa_doit(cfb, deps, 2, function(ai) { | ||||
|             var mlist = parse_shallow(ai.messages[0].data); | ||||
|             mlist[3] = mlist[3].filter(function(m) { | ||||
|               return parse_varint49(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|               return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|             }); | ||||
|             var parentidx = mlist[3].findIndex(function(m) { | ||||
|               var _a, _b; | ||||
| @ -1738,7 +1719,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) { | ||||
|             if (!parent[6]) | ||||
|               parent[6] = []; | ||||
|             parent[6] = parent[6].filter(function(m) { | ||||
|               return parse_varint49(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|               return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|             }); | ||||
|             mlist[3][parentidx].data = write_shallow(parent); | ||||
|             ai.messages[0].data = write_shallow(mlist); | ||||
| @ -1798,7 +1779,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) { | ||||
|               [], | ||||
|               [{ type: 0, data: write_varint49(save_token) }] | ||||
|             ]) }); | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileid + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileid + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|             var parentidx = mlist[3].findIndex(function(m) { | ||||
|               var _a, _b; | ||||
|               var mm = parse_shallow(m.data); | ||||
|  | ||||
| @ -4,17 +4,17 @@ type MJRObject = { | ||||
| 	isempty: boolean; | ||||
| }; | ||||
| */ | ||||
| function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, header/*:number*/, hdr/*:Array<any>*/, dense/*:boolean*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ { | ||||
| function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, header/*:number*/, hdr/*:Array<any>*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ { | ||||
| 	var rr = encode_row(R); | ||||
| 	var defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw"); | ||||
| 	var isempty = true; | ||||
| 	var isempty = true, dense = (sheet["!data"] != null); | ||||
| 	var row/*:any*/ = (header === 1) ? [] : {}; | ||||
| 	if(header !== 1) { | ||||
| 		if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; } | ||||
| 		else row.__rowNum__ = R; | ||||
| 	} | ||||
| 	if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var val = dense ? sheet[R][C] : sheet[cols[C] + rr]; | ||||
| 	if(!dense || sheet["!data"][R]) for (var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var val = dense ? (sheet["!data"][R]||[])[C] : sheet[cols[C] + rr]; | ||||
| 		if(val === undefined || val.t === undefined) { | ||||
| 			if(defval === undefined) continue; | ||||
| 			if(hdr[C] != null) { row[hdr[C]] = defval; } | ||||
| @ -63,16 +63,16 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) { | ||||
| 	var cols/*:Array<string>*/ = []; | ||||
| 	var out/*:Array<any>*/ = []; | ||||
| 	var outi = 0, counter = 0; | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var R = r.s.r, C = 0; | ||||
| 	var header_cnt = {}; | ||||
| 	if(dense && !sheet[R]) sheet[R] = []; | ||||
| 	if(dense && !sheet["!data"][R]) sheet["!data"][R] = []; | ||||
| 	var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		if(((colinfo[C]||{}).hidden)) continue; | ||||
| 		cols[C] = encode_col(C); | ||||
| 		val = dense ? sheet[R][C] : sheet[cols[C] + rr]; | ||||
| 		val = dense ? sheet["!data"][R][C] : sheet[cols[C] + rr]; | ||||
| 		switch(header) { | ||||
| 			case 1: hdr[C] = C - r.s.c; break; | ||||
| 			case 2: hdr[C] = cols[C]; break; | ||||
| @ -91,7 +91,7 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) { | ||||
| 	} | ||||
| 	for (R = r.s.r + offset; R <= r.e.r; ++R) { | ||||
| 		if ((rowinfo[R]||{}).hidden) continue; | ||||
| 		var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o); | ||||
| 		var row = make_json_row(sheet, r, R, cols, header, hdr, o); | ||||
| 		if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row; | ||||
| 	} | ||||
| 	out.length = outi; | ||||
| @ -102,9 +102,11 @@ var qreg = /"/g; | ||||
| function make_csv_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, fs/*:number*/, rs/*:number*/, FS/*:string*/, o/*:Sheet2CSVOpts*/)/*:?string*/ { | ||||
| 	var isempty = true; | ||||
| 	var row/*:Array<string>*/ = [], txt = "", rr = encode_row(R); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var datarow = dense && sheet["!data"][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]; | ||||
| 		var val = dense ? datarow[C]: sheet[cols[C] + rr]; | ||||
| 		if(val == null) txt = ""; | ||||
| 		else if(val.v != null) { | ||||
| 			isempty = false; | ||||
| @ -131,7 +133,6 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ { | ||||
| 	var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row = "", cols/*:Array<string>*/ = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| @ -143,7 +144,6 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ { | ||||
| 		if(o.strip) row = row.replace(endregex,""); | ||||
| 		if(row || (o.blankrows !== false)) out.push((w++ ? RS : "") + row); | ||||
| 	} | ||||
| 	delete o.dense; | ||||
| 	return out.join(""); | ||||
| } | ||||
| 
 | ||||
| @ -160,13 +160,13 @@ function sheet_to_formulae(sheet/*:Worksheet*/)/*:Array<string>*/ { | ||||
| 	if(sheet == null || sheet["!ref"] == null) return []; | ||||
| 	var r = safe_decode_range(sheet['!ref']), rr = "", cols/*:Array<string>*/ = [], C; | ||||
| 	var cmds/*:Array<string>*/ = []; | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		rr = encode_row(R); | ||||
| 		for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 			y = cols[C] + rr; | ||||
| 			x = dense ? (sheet[R]||[])[C] : sheet[y]; | ||||
| 			x = dense ? (sheet["!data"][R]||[])[C] : sheet[y]; | ||||
| 			val = ""; | ||||
| 			if(x === undefined) continue; | ||||
| 			else if(x.F != null) { | ||||
| @ -191,10 +191,11 @@ function sheet_to_formulae(sheet/*:Worksheet*/)/*:Array<string>*/ { | ||||
| 
 | ||||
| function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet*/ { | ||||
| 	var o = opts || {}; | ||||
| 	var dense = _ws ? Array.isArray(_ws) : o.dense; | ||||
| 	var dense = _ws ? (_ws["!data"] != null) : o.dense; | ||||
| 	if(DENSE != null && dense == null) dense = DENSE; | ||||
| 	var offset = +!o.skipHeader; | ||||
| 	var ws/*:Worksheet*/ = _ws || (dense ? ([]/*:any*/) : ({}/*:any*/)); | ||||
| 	var ws/*:Worksheet*/ = _ws || ({}); | ||||
| 	if(!_ws && dense) ws["!data"] = []; | ||||
| 	var _R = 0, _C = 0; | ||||
| 	if(ws && o.origin != null) { | ||||
| 		if(typeof o.origin == 'number') _R = o.origin; | ||||
| @ -215,17 +216,18 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet | ||||
| 	var hdr/*:Array<string>*/ = o.header || [], C = 0; | ||||
| 	var ROW = []; | ||||
| 	js.forEach(function (JS, R/*:number*/) { | ||||
| 		if(dense && !ws[_R + R + offset]) ws[_R + R + offset] = []; | ||||
| 		if(dense) ROW = ws[_R + R + offset]; | ||||
| 		if(dense && !ws["!data"][_R + R + offset]) ws["!data"][_R + R + offset] = []; | ||||
| 		if(dense) ROW = ws["!data"][_R + R + offset]; | ||||
| 		keys(JS).forEach(function(k) { | ||||
| 			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k; | ||||
| 			var v = JS[k]; | ||||
| 			var t = 'z'; | ||||
| 			var z = ""; | ||||
| 			var ref = dense ? "" : encode_cell({c:_C + C,r:_R + R + offset}); | ||||
| 			var ref = dense ? "" : (encode_col(_C + C) + encode_row(_R + R + offset)); | ||||
| 			var cell/*:Cell*/ = dense ? ROW[_C + C] : ws[ref]; | ||||
| 			if(v && typeof v === 'object' && !(v instanceof Date)){ | ||||
| 				ws[ref] = v; | ||||
| 				if(dense) ROW[_C + C] = v; | ||||
| 				else ws[ref] = v; | ||||
| 			} else { | ||||
| 				if(typeof v == 'number') t = 'n'; | ||||
| 				else if(typeof v == 'boolean') t = 'b'; | ||||
| @ -250,9 +252,9 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet | ||||
| 	}); | ||||
| 	range.e.c = Math.max(range.e.c, _C + hdr.length - 1); | ||||
| 	var __R = encode_row(_R); | ||||
| 	if(dense && !ws[_R]) ws[_R] = []; | ||||
| 	if(dense && !ws["!data"][_R]) ws["!data"][_R] = []; | ||||
| 	if(offset) for(C = 0; C < hdr.length; ++C) { | ||||
| 		if(dense) ws[_R][C + _C] = {t:'s', v:hdr[C]}; | ||||
| 		if(dense) ws["!data"][_R][C + _C] = {t:'s', v:hdr[C]}; | ||||
| 		else ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]}; | ||||
| 	} | ||||
| 	ws['!ref'] = encode_range(range); | ||||
| @ -264,18 +266,17 @@ function json_to_sheet(js/*:Array<any>*/, opts)/*:Worksheet*/ { return sheet_add | ||||
| function ws_get_cell_stub(ws/*:Worksheet*/, R, C/*:?number*/)/*:Cell*/ { | ||||
| 	/* A1 cell address */ | ||||
| 	if(typeof R == "string") { | ||||
| 		/* dense */ | ||||
| 		if(Array.isArray(ws)) { | ||||
| 		if(ws["!data"] != null) { | ||||
| 			var RC = decode_cell(R); | ||||
| 			if(!ws[RC.r]) ws[RC.r] = []; | ||||
| 			return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'}); | ||||
| 			if(!ws["!data"][RC.r]) ws["!data"][RC.r] = []; | ||||
| 			return ws["!data"][RC.r][RC.c] || (ws["!data"][RC.r][RC.c] = {t:'z'}); | ||||
| 		} | ||||
| 		return ws[R] || (ws[R] = {t:'z'}); | ||||
| 	} | ||||
| 	/* cell address object */ | ||||
| 	if(typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R)); | ||||
| 	/* R and C are 0-based indices */ | ||||
| 	return ws_get_cell_stub(ws, encode_cell({r:R,c:C||0})); | ||||
| 	return ws_get_cell_stub(ws, encode_col(C||0) + encode_row(R)); | ||||
| } | ||||
| 
 | ||||
| /* find sheet index for given name / validate index */ | ||||
|  | ||||
| @ -10,7 +10,6 @@ function write_csv_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) { | ||||
| 	var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row/*:?string*/ = "", cols/*:Array<string>*/ = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo/*:Array<RowInfo>*/ = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| @ -40,7 +39,6 @@ function write_html_stream(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/) { | ||||
| 	var footer = o.footer != null ? o.footer : HTML_END; | ||||
| 	stream.push(header); | ||||
| 	var r = decode_range(ws['!ref']); | ||||
| 	o.dense = Array.isArray(ws); | ||||
| 	stream.push(make_html_preamble(ws, r, o)); | ||||
| 	var R = r.s.r; | ||||
| 	var end = false; | ||||
| @ -78,16 +76,16 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) { | ||||
| 	var rr = encode_row(r.s.r); | ||||
| 	var cols/*:Array<string>*/ = []; | ||||
| 	var counter = 0; | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var R = r.s.r, C = 0; | ||||
| 	var header_cnt = {}; | ||||
| 	if(dense && !sheet[R]) sheet[R] = []; | ||||
| 	if(dense && !sheet["!data"][R]) sheet["!data"][R] = []; | ||||
| 	var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo/*:Array<RowInfo>*/ = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		if(((colinfo[C]||{}).hidden)) continue; | ||||
| 		cols[C] = encode_col(C); | ||||
| 		val = dense ? sheet[R][C] : sheet[cols[C] + rr]; | ||||
| 		val = dense ? sheet["!data"][R][C] : sheet[cols[C] + rr]; | ||||
| 		switch(header) { | ||||
| 			case 1: hdr[C] = C - r.s.c; break; | ||||
| 			case 2: hdr[C] = cols[C]; break; | ||||
| @ -108,7 +106,7 @@ function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) { | ||||
| 	stream._read = function() { | ||||
| 		while(R <= r.e.r) { | ||||
| 			if ((rowinfo[R-1]||{}).hidden) continue; | ||||
| 			var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o); | ||||
| 			var row = make_json_row(sheet, r, R, cols, header, hdr, o); | ||||
| 			++R; | ||||
| 			if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) { | ||||
| 				stream.push(row.row); | ||||
|  | ||||
							
								
								
									
										31
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1202
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1202
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										34
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										34
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										18
									
								
								dist/xlsx.mini.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								dist/xlsx.mini.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.mini.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.mini.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								formats.png
									
									
									
									
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								formats.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 204 KiB | 
							
								
								
									
										
											BIN
										
									
								
								legend.png
									
									
									
									
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								legend.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 33 KiB | 
| @ -13,14 +13,18 @@ function rtf_to_sheet(d, opts) { | ||||
| } | ||||
| function rtf_to_sheet_str(str, opts) { | ||||
|   var o = opts || {}; | ||||
|   var ws = o.dense ? [] : {}; | ||||
|   var ws = {}; | ||||
|   var dense = o.dense; | ||||
|   if (dense) | ||||
|     ws["!data"] = []; | ||||
|   var rows = str.match(/\\trowd[\s\S]*?\\row\b/g); | ||||
|   if (!rows) | ||||
|     throw new Error("RTF missing table"); | ||||
|   var range = { s: { c: 0, r: 0 }, e: { c: 0, r: rows.length - 1 } }; | ||||
|   var row = []; | ||||
|   rows.forEach(function(rowtf, R) { | ||||
|     if (Array.isArray(ws)) | ||||
|       ws[R] = []; | ||||
|     if (dense) | ||||
|       row = ws["!data"][R] = []; | ||||
|     var rtfre = /\\[\w\-]+\b/g; | ||||
|     var last_index = 0; | ||||
|     var res; | ||||
| @ -46,8 +50,8 @@ function rtf_to_sheet_str(str, opts) { | ||||
|                 cell.w = cell.v; | ||||
|               cell.v = fuzzynum(cell.v); | ||||
|             } | ||||
|             if (Array.isArray(ws)) | ||||
|               ws[R][C] = cell; | ||||
|             if (dense) | ||||
|               row[C] = cell; | ||||
|             else | ||||
|               ws[encode_cell({ r: R, c: C })] = cell; | ||||
|           } | ||||
| @ -75,15 +79,17 @@ function sheet_to_rtf(ws, opts) { | ||||
|   if (!ws["!ref"]) | ||||
|     return o[0] + "}"; | ||||
|   var r = safe_decode_range(ws["!ref"]), cell; | ||||
|   var dense = Array.isArray(ws); | ||||
|   var dense = ws["!data"] != null, row = []; | ||||
|   for (var R = r.s.r; R <= r.e.r; ++R) { | ||||
|     o.push("\\trowd\\trautofit1"); | ||||
|     for (var C = r.s.c; C <= r.e.c; ++C) | ||||
|       o.push("\\cellx" + (C + 1)); | ||||
|     o.push("\\pard\\intbl"); | ||||
|     if (dense) | ||||
|       row = ws["!data"][R] || []; | ||||
|     for (C = r.s.c; C <= r.e.c; ++C) { | ||||
|       var coord = encode_cell({ r: R, c: C }); | ||||
|       cell = dense ? (ws[R] || [])[C] : ws[coord]; | ||||
|       cell = dense ? row[C] : ws[coord]; | ||||
|       if (!cell || cell.v == null && (!cell.f || cell.F)) { | ||||
|         o.push(" \\cell"); | ||||
|         continue; | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { WorkBook, WorkSheet, Range, CellObject } from '../'; | ||||
| import { WorkBook, WorkSheet, Range, CellObject, DenseSheet, SparseSheet } from '../'; | ||||
| import type { utils } from "../"; | ||||
| 
 | ||||
| declare var encode_cell: typeof utils.encode_cell; | ||||
| @ -26,13 +26,16 @@ function rtf_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { | ||||
| function rtf_to_sheet_str(str: string, opts)/*:Worksheet*/ { | ||||
| 	var o = opts || {}; | ||||
| 	// ESBuild issue 2375
 | ||||
| 	var ws: WorkSheet = o.dense ? [] : ({}/*:any*/); | ||||
| 	var ws: WorkSheet = {} as WorkSheet; | ||||
| 	var dense = o.dense; | ||||
| 	if(dense) ws["!data"] = []; | ||||
| 
 | ||||
| 	var rows = str.match(/\\trowd[\s\S]*?\\row\b/g); | ||||
| 	if(!rows) throw new Error("RTF missing table"); | ||||
| 	var range: Range = {s: {c:0, r:0}, e: {c:0, r:rows.length - 1}}; | ||||
| 	var row: CellObject[] = []; | ||||
| 	rows.forEach(function(rowtf, R) { | ||||
| 		if(Array.isArray(ws)) ws[R] = []; | ||||
| 		if(dense) row = (ws as DenseSheet)["!data"][R] = [] as CellObject[]; | ||||
| 		var rtfre = /\\[\w\-]+\b/g; | ||||
| 		var last_index = 0; | ||||
| 		var res; | ||||
| @ -51,8 +54,8 @@ function rtf_to_sheet_str(str: string, opts)/*:Worksheet*/ { | ||||
| 						if(cell.v == "TRUE" || cell.v == "FALSE") { cell.v = cell.v == "TRUE"; cell.t = "b"; } | ||||
| 						else if(!isNaN(fuzzynum(cell.v as string))) { cell.t = 'n'; if(o.cellText !== false) cell.w = cell.v as string; cell.v = fuzzynum(cell.v as string); } | ||||
| 
 | ||||
| 						if(Array.isArray(ws)) ws[R][C] = cell; | ||||
| 						else ws[encode_cell({r:R, c:C})] = cell; | ||||
| 						if(dense) row[C] = cell; | ||||
| 						else (ws as SparseSheet)[encode_cell({r:R, c:C})] = cell; | ||||
| 					} | ||||
| 					payload = []; | ||||
| 					break; | ||||
| @ -79,14 +82,15 @@ function sheet_to_rtf(ws: WorkSheet, opts): string { | ||||
| 	var o: string[] = ["{\\rtf1\\ansi"]; | ||||
| 	if(!ws["!ref"]) return o[0] + "}"; | ||||
| 	var r = safe_decode_range(ws['!ref']), cell: CellObject; | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null, row: CellObject[] = []; | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		o.push("\\trowd\\trautofit1"); | ||||
| 		for(var C = r.s.c; C <= r.e.c; ++C) o.push("\\cellx" + (C+1)); | ||||
| 		o.push("\\pard\\intbl"); | ||||
| 		if(dense) row = (ws as DenseSheet)["!data"][R] || ([] as CellObject[]) | ||||
| 		for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 			var coord = encode_cell({r:R,c:C}); | ||||
| 			cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 			cell = dense ? row[C] : (ws as SparseSheet)[coord]; | ||||
| 			if(!cell || cell.v == null && (!cell.f || cell.F)) { o.push(" \\cell"); continue; } | ||||
| 			o.push(" " + (cell.w || (format_cell(cell), cell.w) || "").replace(/[\r\n]/g, "\\par ")); | ||||
| 			o.push("\\cell"); | ||||
| @ -95,4 +99,3 @@ function sheet_to_rtf(ws: WorkSheet, opts): string { | ||||
| 	} | ||||
| 	return o.join("") + "}"; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -61,7 +61,7 @@ function write_BrtBeginEsmdb(cnt: number, cm: boolean): RawData { | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.1.7.34 Metadata */ | ||||
| function parse_xlmeta_bin(data, name: string, _opts?: ParseXLMetaOptions): XLMeta { | ||||
| function parse_xlmeta_bin(data: RawData, name: string, _opts?: ParseXLMetaOptions): XLMeta { | ||||
| 	var out: XLMeta = { Types: [], Cell: [], Value: [] }; | ||||
| 	var opts = _opts || {}; | ||||
| 	var state: number[] = []; | ||||
|  | ||||
| @ -26,29 +26,22 @@ function u8str(u8) { | ||||
| function stru8(str) { | ||||
|   return typeof TextEncoder != "undefined" ? new TextEncoder().encode(str) : s2a(utf8write(str)); | ||||
| } | ||||
| function u8contains(body, search) { | ||||
|   var L = body.indexOf(search[0]); | ||||
|   if (L == -1) | ||||
|     return false; | ||||
|   outer: | ||||
|     for (; L <= body.length - search.length; ++L) { | ||||
|       for (var j = 0; j < search.length; ++j) | ||||
|         if (body[L + j] != search[j]) | ||||
|           continue outer; | ||||
|       return true; | ||||
|     } | ||||
|   return false; | ||||
| } | ||||
| function u8concat(u8a) { | ||||
|   var len = u8a.reduce(function(acc, x) { | ||||
|     return acc + x.length; | ||||
|   }, 0); | ||||
|   var len = 0; | ||||
|   for (var i = 0; i < u8a.length; ++i) | ||||
|     len += u8a[i].length; | ||||
|   var out = new Uint8Array(len); | ||||
|   var off = 0; | ||||
|   u8a.forEach(function(u8) { | ||||
|     out.set(u8, off); | ||||
|     off += u8.length; | ||||
|   }); | ||||
|   for (i = 0; i < u8a.length; ++i) { | ||||
|     var u8 = u8a[i], L = u8.length; | ||||
|     if (L < 250) { | ||||
|       for (var j = 0; j < L; ++j) | ||||
|         out[off++] = u8[j]; | ||||
|     } else { | ||||
|       out.set(u8, off); | ||||
|       off += L; | ||||
|     } | ||||
|   } | ||||
|   return out; | ||||
| } | ||||
| function popcnt(x) { | ||||
| @ -73,7 +66,7 @@ function writeDecimal128LE(buf, offset, value) { | ||||
|   buf[offset + 15] |= value >= 0 ? 0 : 128; | ||||
| } | ||||
| function parse_varint49(buf, ptr) { | ||||
|   var l = ptr ? ptr[0] : 0; | ||||
|   var l = ptr.l; | ||||
|   var usz = buf[l] & 127; | ||||
|   varint: | ||||
|     if (buf[l++] >= 128) { | ||||
| @ -99,8 +92,7 @@ function parse_varint49(buf, ptr) { | ||||
|       if (buf[l++] < 128) | ||||
|         break varint; | ||||
|     } | ||||
|   if (ptr) | ||||
|     ptr[0] = l; | ||||
|   ptr.l = l; | ||||
|   return usz; | ||||
| } | ||||
| function write_varint49(v) { | ||||
| @ -141,9 +133,9 @@ function write_varint49(v) { | ||||
|   return usz[subarray](0, L); | ||||
| } | ||||
| function parse_packed_varints(buf) { | ||||
|   var ptr = [0]; | ||||
|   var ptr = { l: 0 }; | ||||
|   var out = []; | ||||
|   while (ptr[0] < buf.length) | ||||
|   while (ptr.l < buf.length) | ||||
|     out.push(parse_varint49(buf, ptr)); | ||||
|   return out; | ||||
| } | ||||
| @ -203,50 +195,49 @@ function varint_to_u64(buf) { | ||||
|   return [lo >>> 0, hi >>> 0]; | ||||
| } | ||||
| function parse_shallow(buf) { | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var off = ptr[0]; | ||||
|   var out = [], ptr = { l: 0 }; | ||||
|   while (ptr.l < buf.length) { | ||||
|     var off = ptr.l; | ||||
|     var num = parse_varint49(buf, ptr); | ||||
|     var type = num & 7; | ||||
|     num = Math.floor(num / 8); | ||||
|     var len = 0; | ||||
|     var res; | ||||
|     if (num == 0) | ||||
|       break; | ||||
|     num = num / 8 | 0; | ||||
|     var data; | ||||
|     var l = ptr.l; | ||||
|     switch (type) { | ||||
|       case 0: | ||||
|         { | ||||
|           var l = ptr[0]; | ||||
|           while (buf[ptr[0]++] >= 128) | ||||
|           while (buf[l++] >= 128) | ||||
|             ; | ||||
|           res = buf[subarray](l, ptr[0]); | ||||
|           data = buf[subarray](ptr.l, l); | ||||
|           ptr.l = l; | ||||
|         } | ||||
|         break; | ||||
|       case 1: | ||||
|         { | ||||
|           data = buf[subarray](l, l + 8); | ||||
|           ptr.l = l + 8; | ||||
|         } | ||||
|         break; | ||||
|       case 2: | ||||
|         { | ||||
|           var len = parse_varint49(buf, ptr); | ||||
|           data = buf[subarray](ptr.l, ptr.l + len); | ||||
|           ptr.l += len; | ||||
|         } | ||||
|         break; | ||||
|       case 5: | ||||
|         len = 4; | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         { | ||||
|           data = buf[subarray](l, l + 4); | ||||
|           ptr.l = l + 4; | ||||
|         } | ||||
|         break; | ||||
|       case 1: | ||||
|         len = 8; | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 2: | ||||
|         len = parse_varint49(buf, ptr); | ||||
|         res = buf[subarray](ptr[0], ptr[0] + len); | ||||
|         ptr[0] += len; | ||||
|         break; | ||||
|       case 3: | ||||
|       case 4: | ||||
|       default: | ||||
|         throw new Error("PB Type ".concat(type, " for Field ").concat(num, " at offset ").concat(off)); | ||||
|     } | ||||
|     var v = { data: res, type: type }; | ||||
|     var v = { data: data, type: type }; | ||||
|     if (out[num] == null) | ||||
|       out[num] = [v]; | ||||
|     else | ||||
|       out[num].push(v); | ||||
|       out[num] = []; | ||||
|     out[num].push(v); | ||||
|   } | ||||
|   return out; | ||||
| } | ||||
| @ -273,11 +264,11 @@ function mappa(data, cb) { | ||||
| } | ||||
| function parse_iwa_file(buf) { | ||||
|   var _a; | ||||
|   var out = [], ptr = [0]; | ||||
|   while (ptr[0] < buf.length) { | ||||
|   var out = [], ptr = { l: 0 }; | ||||
|   while (ptr.l < buf.length) { | ||||
|     var len = parse_varint49(buf, ptr); | ||||
|     var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|     ptr[0] += len; | ||||
|     var ai = parse_shallow(buf[subarray](ptr.l, ptr.l + len)); | ||||
|     ptr.l += len; | ||||
|     var res = { | ||||
|       id: varint_to_i32(ai[1][0].data), | ||||
|       messages: [] | ||||
| @ -287,9 +278,9 @@ function parse_iwa_file(buf) { | ||||
|       var fl = varint_to_i32(mi[3][0].data); | ||||
|       res.messages.push({ | ||||
|         meta: mi, | ||||
|         data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
|         data: buf[subarray](ptr.l, ptr.l + fl) | ||||
|       }); | ||||
|       ptr[0] += fl; | ||||
|       ptr.l += fl; | ||||
|     }); | ||||
|     if ((_a = ai[3]) == null ? void 0 : _a[0]) | ||||
|       res.merge = varint_to_i32(ai[3][0].data) >>> 0 > 0; | ||||
| @ -325,45 +316,46 @@ function write_iwa_file(ias) { | ||||
| function parse_snappy_chunk(type, buf) { | ||||
|   if (type != 0) | ||||
|     throw new Error("Unexpected Snappy chunk type ".concat(type)); | ||||
|   var ptr = [0]; | ||||
|   var ptr = { l: 0 }; | ||||
|   var usz = parse_varint49(buf, ptr); | ||||
|   var chunks = []; | ||||
|   while (ptr[0] < buf.length) { | ||||
|     var tag = buf[ptr[0]] & 3; | ||||
|   var l = ptr.l; | ||||
|   while (l < buf.length) { | ||||
|     var tag = buf[l] & 3; | ||||
|     if (tag == 0) { | ||||
|       var len = buf[ptr[0]++] >> 2; | ||||
|       var len = buf[l++] >> 2; | ||||
|       if (len < 60) | ||||
|         ++len; | ||||
|       else { | ||||
|         var c = len - 59; | ||||
|         len = buf[ptr[0]]; | ||||
|         len = buf[l]; | ||||
|         if (c > 1) | ||||
|           len |= buf[ptr[0] + 1] << 8; | ||||
|           len |= buf[l + 1] << 8; | ||||
|         if (c > 2) | ||||
|           len |= buf[ptr[0] + 2] << 16; | ||||
|           len |= buf[l + 2] << 16; | ||||
|         if (c > 3) | ||||
|           len |= buf[ptr[0] + 3] << 24; | ||||
|           len |= buf[l + 3] << 24; | ||||
|         len >>>= 0; | ||||
|         len++; | ||||
|         ptr[0] += c; | ||||
|         l += c; | ||||
|       } | ||||
|       chunks.push(buf[subarray](ptr[0], ptr[0] + len)); | ||||
|       ptr[0] += len; | ||||
|       chunks.push(buf[subarray](l, l + len)); | ||||
|       l += len; | ||||
|       continue; | ||||
|     } else { | ||||
|       var offset = 0, length = 0; | ||||
|       if (tag == 1) { | ||||
|         length = (buf[ptr[0]] >> 2 & 7) + 4; | ||||
|         offset = (buf[ptr[0]++] & 224) << 3; | ||||
|         offset |= buf[ptr[0]++]; | ||||
|         length = (buf[l] >> 2 & 7) + 4; | ||||
|         offset = (buf[l++] & 224) << 3; | ||||
|         offset |= buf[l++]; | ||||
|       } else { | ||||
|         length = (buf[ptr[0]++] >> 2) + 1; | ||||
|         length = (buf[l++] >> 2) + 1; | ||||
|         if (tag == 2) { | ||||
|           offset = buf[ptr[0]] | buf[ptr[0] + 1] << 8; | ||||
|           ptr[0] += 2; | ||||
|           offset = buf[l] | buf[l + 1] << 8; | ||||
|           l += 2; | ||||
|         } else { | ||||
|           offset = (buf[ptr[0]] | buf[ptr[0] + 1] << 8 | buf[ptr[0] + 2] << 16 | buf[ptr[0] + 3] << 24) >>> 0; | ||||
|           ptr[0] += 4; | ||||
|           offset = (buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16 | buf[l + 3] << 24) >>> 0; | ||||
|           l += 4; | ||||
|         } | ||||
|       } | ||||
|       if (offset == 0) | ||||
| @ -395,16 +387,15 @@ function parse_snappy_chunk(type, buf) { | ||||
|         if (length) | ||||
|           chunks.push(chunks[j][subarray](0, length)); | ||||
|       } | ||||
|       if (chunks.length > 100) | ||||
|       if (chunks.length > 25) | ||||
|         chunks = [u8concat(chunks)]; | ||||
|     } | ||||
|   } | ||||
|   if (chunks.reduce(function(acc, u8) { | ||||
|     return acc + u8.length; | ||||
|   }, 0) != usz) | ||||
|     throw new Error("Unexpected length: ".concat(chunks.reduce(function(acc, u8) { | ||||
|       return acc + u8.length; | ||||
|     }, 0), " != ").concat(usz)); | ||||
|   var clen = 0; | ||||
|   for (var u8i = 0; u8i < chunks.length; ++u8i) | ||||
|     clen += chunks[u8i].length; | ||||
|   if (clen != usz) | ||||
|     throw new Error("Unexpected length: ".concat(clen, " != ").concat(usz)); | ||||
|   return chunks; | ||||
| } | ||||
| function decompress_iwa_file(buf) { | ||||
| @ -421,7 +412,7 @@ function decompress_iwa_file(buf) { | ||||
|   } | ||||
|   if (l !== buf.length) | ||||
|     throw new Error("data is not a valid framed stream!"); | ||||
|   return u8concat(out); | ||||
|   return out.length == 1 ? out[0] : u8concat(out); | ||||
| } | ||||
| function compress_iwa_file(buf) { | ||||
|   var out = []; | ||||
| @ -468,12 +459,12 @@ function numbers_format_cell(cell, t, flags, ofmt, nfmt) { | ||||
|   var fmt = ver >= 5 ? nfmt : ofmt; | ||||
|   dur: | ||||
|     if (flags & (ver > 4 ? 8 : 4) && cell.t == "n" && ctype == 7) { | ||||
|       var dstyle = ((_a = fmt[7]) == null ? void 0 : _a[0]) ? parse_varint49(fmt[7][0].data) : -1; | ||||
|       var dstyle = ((_a = fmt[7]) == null ? void 0 : _a[0]) ? varint_to_i32(fmt[7][0].data) : -1; | ||||
|       if (dstyle == -1) | ||||
|         break dur; | ||||
|       var dmin = ((_b = fmt[15]) == null ? void 0 : _b[0]) ? parse_varint49(fmt[15][0].data) : -1; | ||||
|       var dmax = ((_c = fmt[16]) == null ? void 0 : _c[0]) ? parse_varint49(fmt[16][0].data) : -1; | ||||
|       var auto = ((_d = fmt[40]) == null ? void 0 : _d[0]) ? parse_varint49(fmt[40][0].data) : -1; | ||||
|       var dmin = ((_b = fmt[15]) == null ? void 0 : _b[0]) ? varint_to_i32(fmt[15][0].data) : -1; | ||||
|       var dmax = ((_c = fmt[16]) == null ? void 0 : _c[0]) ? varint_to_i32(fmt[16][0].data) : -1; | ||||
|       var auto = ((_d = fmt[40]) == null ? void 0 : _d[0]) ? varint_to_i32(fmt[40][0].data) : -1; | ||||
|       var d = cell.v, dd = d; | ||||
|       autodur: | ||||
|         if (auto) { | ||||
| @ -801,7 +792,7 @@ function parse_cell_storage(buf, lut) { | ||||
| } | ||||
| function parse_TSP_Reference(buf) { | ||||
|   var pb = parse_shallow(buf); | ||||
|   return parse_varint49(pb[1][0].data); | ||||
|   return varint_to_i32(pb[1][0].data); | ||||
| } | ||||
| function write_TSP_Reference(idx) { | ||||
|   return write_shallow([ | ||||
| @ -932,7 +923,7 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|   if (range.e.c < 0) | ||||
|     throw new Error("Invalid col varint ".concat(pb[7][0].data)); | ||||
|   ws["!ref"] = encode_range(range); | ||||
|   var dense = Array.isArray(ws); | ||||
|   var dense = ws["!data"] != null, dws = ws; | ||||
|   var store = parse_shallow(pb[4][0].data); | ||||
|   var lut = numbers_lut_new(); | ||||
|   if ((_a = store[4]) == null ? void 0 : _a[0]) | ||||
| @ -957,12 +948,11 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
|         var res = parse_cell_storage(buf, lut); | ||||
|         if (res) { | ||||
|           if (dense) { | ||||
|             if (!ws[_R + R]) | ||||
|               ws[_R + R] = []; | ||||
|             ws[_R + R][C] = res; | ||||
|             if (!dws["!data"][_R + R]) | ||||
|               dws["!data"][_R + R] = []; | ||||
|             dws["!data"][_R + R][C] = res; | ||||
|           } else { | ||||
|             var addr = encode_cell({ r: _R + R, c: C }); | ||||
|             ws[addr] = res; | ||||
|             ws[encode_col(C) + encode_row(_R + R)] = res; | ||||
|           } | ||||
|         } | ||||
|       }); | ||||
| @ -989,12 +979,9 @@ function parse_TST_TableModelArchive(M, root, ws) { | ||||
| } | ||||
| function parse_TST_TableInfoArchive(M, root, opts) { | ||||
|   var pb = parse_shallow(root.data); | ||||
|   var out; | ||||
|   if (!(opts == null ? void 0 : opts.dense)) | ||||
|     out = { "!ref": "A1" }; | ||||
|   else | ||||
|     out = []; | ||||
|   out["!ref"] = "A1"; | ||||
|   var out = { "!ref": "A1" }; | ||||
|   if (opts == null ? void 0 : opts.dense) | ||||
|     out["!data"] = []; | ||||
|   var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
|   var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
|   if (mtype != 6001) | ||||
| @ -1211,26 +1198,20 @@ function build_numbers_deps(cfb) { | ||||
|       dependents[packet.id] = { deps: [], location: fp, type: varint_to_i32(packet.messages[0].meta[1][0].data) }; | ||||
|     }); | ||||
|   }); | ||||
|   indices.sort(function(x, y) { | ||||
|     return x - y; | ||||
|   }); | ||||
|   var indices_varint = indices.filter(function(x) { | ||||
|     return x > 1; | ||||
|   }).map(function(x) { | ||||
|     return [x, write_varint49(x)]; | ||||
|   }); | ||||
|   cfb.FileIndex.forEach(function(fi) { | ||||
|     if (!fi.name.match(/\.iwa/)) | ||||
|       return; | ||||
|     if (fi.name.match(/OperationStorage/)) | ||||
|       return; | ||||
|     parse_iwa_file(decompress_iwa_file(fi.content)).forEach(function(ia) { | ||||
|       indices_varint.forEach(function(ivi) { | ||||
|         if (ia.messages.some(function(mess) { | ||||
|           return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]); | ||||
|         })) { | ||||
|           dependents[ivi[0]].deps.push(ia.id); | ||||
|         } | ||||
|       ia.messages.forEach(function(mess) { | ||||
|         [5, 6].forEach(function(f) { | ||||
|           if (!mess.meta[f]) | ||||
|             return; | ||||
|           mess.meta[f].forEach(function(x) { | ||||
|             dependents[ia.id].deps.push(varint_to_i32(x.data)); | ||||
|           }); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| @ -1479,7 +1460,7 @@ function numbers_add_ws(cfb, deps, wsidx) { | ||||
|               [], | ||||
|               [{ type: 0, data: write_varint49(0) }] | ||||
|             ]) }); | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|             var parentidx = mlist[3].findIndex(function(m) { | ||||
|               var _a3, _b2; | ||||
|               var mm = parse_shallow(m.data); | ||||
| @ -1542,7 +1523,7 @@ function numbers_add_ws(cfb, deps, wsidx) { | ||||
|                 [], | ||||
|                 [{ type: 0, data: write_varint49(0) }] | ||||
|               ]) }); | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|               var parentidx = mlist[3].findIndex(function(m) { | ||||
|                 var _a2, _b2; | ||||
|                 var mm = parse_shallow(m.data); | ||||
| @ -1602,7 +1583,7 @@ function numbers_add_ws(cfb, deps, wsidx) { | ||||
|                 [], | ||||
|                 [{ type: 0, data: write_varint49(0) }] | ||||
|               ]) }); | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileref + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|               mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileref + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|               var parentidx = mlist[3].findIndex(function(m) { | ||||
|                 var _a2, _b2; | ||||
|                 var mm = parse_shallow(m.data); | ||||
| @ -1714,16 +1695,16 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) { | ||||
|           var metadata = numbers_iwa_find(cfb, deps, 2); | ||||
|           var mlist = parse_shallow(metadata.messages[0].data); | ||||
|           var mlst = mlist[3].filter(function(m) { | ||||
|             return parse_varint49(parse_shallow(m.data)[1][0].data) == tileref; | ||||
|             return varint_to_i32(parse_shallow(m.data)[1][0].data) == tileref; | ||||
|           }); | ||||
|           return (mlst == null ? void 0 : mlst.length) ? parse_varint49(parse_shallow(mlst[0].data)[12][0].data) : 0; | ||||
|           return (mlst == null ? void 0 : mlst.length) ? varint_to_i32(parse_shallow(mlst[0].data)[12][0].data) : 0; | ||||
|         }(); | ||||
|         { | ||||
|           CFB.utils.cfb_del(cfb, deps[tileref].location); | ||||
|           numbers_iwa_doit(cfb, deps, 2, function(ai) { | ||||
|             var mlist = parse_shallow(ai.messages[0].data); | ||||
|             mlist[3] = mlist[3].filter(function(m) { | ||||
|               return parse_varint49(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|               return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|             }); | ||||
|             var parentidx = mlist[3].findIndex(function(m) { | ||||
|               var _a, _b; | ||||
| @ -1738,7 +1719,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) { | ||||
|             if (!parent[6]) | ||||
|               parent[6] = []; | ||||
|             parent[6] = parent[6].filter(function(m) { | ||||
|               return parse_varint49(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|               return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref; | ||||
|             }); | ||||
|             mlist[3][parentidx].data = write_shallow(parent); | ||||
|             ai.messages[0].data = write_shallow(mlist); | ||||
| @ -1798,7 +1779,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) { | ||||
|               [], | ||||
|               [{ type: 0, data: write_varint49(save_token) }] | ||||
|             ]) }); | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileid + 1, parse_varint49(mlist[1][0].data))) }]; | ||||
|             mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileid + 1, varint_to_i32(mlist[1][0].data))) }]; | ||||
|             var parentidx = mlist[3].findIndex(function(m) { | ||||
|               var _a, _b; | ||||
|               var mm = parse_shallow(m.data); | ||||
|  | ||||
| @ -3,10 +3,11 @@ | ||||
| 
 | ||||
| /* these are type imports and do not show up in the generated JS */ | ||||
| import { CFB$Container, CFB$Entry } from 'cfb'; | ||||
| import { WorkBook, WorkSheet, Range, CellObject, ParsingOptions, WritingOptions } from '../'; | ||||
| import { WorkBook, WorkSheet, Range, CellObject, ParsingOptions, WritingOptions, DenseWorkSheet } from '../'; | ||||
| import type { utils } from "../"; | ||||
| 
 | ||||
| declare var encode_cell: typeof utils.encode_cell; | ||||
| declare var encode_col: typeof utils.encode_col; | ||||
| declare var encode_row: typeof utils.encode_row; | ||||
| declare var encode_range: typeof utils.encode_range; | ||||
| declare var book_new: typeof utils.book_new; | ||||
| declare var book_append_sheet: typeof utils.book_append_sheet; | ||||
| @ -15,21 +16,21 @@ declare var decode_range: typeof utils.decode_range; | ||||
| import * as _CFB from 'cfb'; | ||||
| declare var CFB: typeof _CFB; | ||||
| //<<import { utils } from "../../";
 | ||||
| //<<const { encode_cell, encode_range, book_new, book_append_sheet } = utils;
 | ||||
| //<<const { encode_col, encode_row, encode_range, book_new, book_append_sheet } = utils;
 | ||||
| 
 | ||||
| /* see https://bugs.webkit.org/show_bug.cgi?id=243148 -- affects iOS Safari */ | ||||
| declare var Buffer: any; // Buffer is typeof-guarded but TS still needs this :(
 | ||||
| var subarray: "subarray" | "slice" = (() => { | ||||
| 	try { | ||||
| 	if(typeof Uint8Array == "undefined") return "slice"; | ||||
| 	if(typeof Uint8Array.prototype.subarray == "undefined") return "slice"; | ||||
| 	// NOTE: feature tests are for node < 6.x
 | ||||
| 	if(typeof Buffer !== "undefined") { | ||||
| 		if(typeof Buffer.prototype.subarray == "undefined") return "slice"; | ||||
| 		if((typeof Buffer.from == "function" ? Buffer.from([72,62]) : new Buffer([72,62])) instanceof Uint8Array) return "subarray"; | ||||
| 		return "slice"; | ||||
| 	} | ||||
| 	return "subarray"; | ||||
| 		if(typeof Uint8Array == "undefined") return "slice"; | ||||
| 		if(typeof Uint8Array.prototype.subarray == "undefined") return "slice"; | ||||
| 		// NOTE: feature tests are for node < 6.x
 | ||||
| 		if(typeof Buffer !== "undefined") { | ||||
| 			if(typeof Buffer.prototype.subarray == "undefined") return "slice"; | ||||
| 			if((typeof Buffer.from == "function" ? Buffer.from([72,62]) : new Buffer([72,62])) instanceof Uint8Array) return "subarray"; | ||||
| 			return "slice"; | ||||
| 		} | ||||
| 		return "subarray"; | ||||
| 	} catch(e) { return "slice"; } | ||||
| })(); | ||||
| 
 | ||||
| @ -40,23 +41,17 @@ function u8str(u8: Uint8Array): string { return /* Buffer.isBuffer(u8) ? u8.toSt | ||||
| function stru8(str: string): Uint8Array { return typeof TextEncoder != "undefined" ? new TextEncoder().encode(str) : s2a(utf8write(str)) as Uint8Array; } | ||||
| //<<export { u8str, stru8 };
 | ||||
| 
 | ||||
| function u8contains(body: Uint8Array, search: Uint8Array): boolean { | ||||
| 	var L = body.indexOf(search[0]); | ||||
| 	if(L == -1) return false; | ||||
| 	outer: for(; L <= body.length - search.length; ++L) { | ||||
| 		for(var j = 0; j < search.length; ++j) if(body[L+j] != search[j]) continue outer; | ||||
| 		return true; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| //<<export { u8contains }
 | ||||
| 
 | ||||
| /** Concatenate Uint8Arrays */ | ||||
| function u8concat(u8a: Uint8Array[]): Uint8Array { | ||||
| 	var len = u8a.reduce((acc: number, x: Uint8Array) => acc + x.length, 0); | ||||
| 	var len = 0; | ||||
| 	for(var i = 0; i < u8a.length; ++i) len += u8a[i].length; | ||||
| 	var out = new Uint8Array(len); | ||||
| 	var off = 0; | ||||
| 	u8a.forEach(u8 => { out.set(u8, off); off += u8.length; }); | ||||
| 	for(i = 0; i < u8a.length; ++i) { | ||||
| 		var u8 = u8a[i], L = u8.length; | ||||
| 		if(L < 250) { for(var j = 0; j < L; ++j) out[off++] = u8[j]; } | ||||
| 		else { out.set(u8, off); off += L; } | ||||
| 	} | ||||
| 	return out; | ||||
| } | ||||
| //<<export { u8concat };
 | ||||
| @ -87,11 +82,11 @@ function writeDecimal128LE(buf: Uint8Array, offset: number, value: number): void | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| type Ptr = [number]; | ||||
| interface Ptr { l: number; } | ||||
| 
 | ||||
| /** Parse an integer from the varint that can be exactly stored in a double */ | ||||
| function parse_varint49(buf: Uint8Array, ptr?: Ptr): number { | ||||
| 	var l = ptr ? ptr[0] : 0; | ||||
| function parse_varint49(buf: Uint8Array, ptr: Ptr): number { | ||||
| 	var l = ptr.l; | ||||
| 	var usz = buf[l] & 0x7F; | ||||
| 	varint: if(buf[l++] >= 0x80) { | ||||
| 		usz |= (buf[l] & 0x7F) <<  7; if(buf[l++] < 0x80) break varint; | ||||
| @ -101,7 +96,7 @@ function parse_varint49(buf: Uint8Array, ptr?: Ptr): number { | ||||
| 		usz += (buf[l] & 0x7F) * Math.pow(2, 35); ++l; if(buf[l++] < 0x80) break varint; | ||||
| 		usz += (buf[l] & 0x7F) * Math.pow(2, 42); ++l; if(buf[l++] < 0x80) break varint; | ||||
| 	} | ||||
| 	if(ptr) ptr[0] = l; | ||||
| 	ptr.l = l; | ||||
| 	return usz; | ||||
| } | ||||
| /** Write a varint up to 7 bytes / 49 bits */ | ||||
| @ -126,9 +121,9 @@ function write_varint49(v: number): Uint8Array { | ||||
| } | ||||
| /** Parse a repeated varint [packed = true] field */ | ||||
| function parse_packed_varints(buf: Uint8Array): number[] { | ||||
| 	var ptr: Ptr = [0]; | ||||
| 	var ptr: Ptr = {l: 0}; | ||||
| 	var out: number[] = []; | ||||
| 	while(ptr[0] < buf.length) out.push(parse_varint49(buf, ptr)); | ||||
| 	while(ptr.l < buf.length) out.push(parse_varint49(buf, ptr)); | ||||
| 	return out; | ||||
| } | ||||
| /** Write a repeated varint [packed = true] field */ | ||||
| @ -174,30 +169,31 @@ type ProtoField = Array<ProtoItem> | ||||
| type ProtoMessage = Array<ProtoField>; | ||||
| /** Shallow parse of a Protobuf message */ | ||||
| function parse_shallow(buf: Uint8Array): ProtoMessage { | ||||
| 	var out: ProtoMessage = [], ptr: Ptr = [0]; | ||||
| 	while(ptr[0] < buf.length) { | ||||
| 		var off = ptr[0]; | ||||
| 	var out: ProtoMessage = [], ptr: Ptr = {l: 0}; | ||||
| 	while(ptr.l < buf.length) { | ||||
| 		var off = ptr.l; | ||||
| 		var num = parse_varint49(buf, ptr); | ||||
| 		var type = num & 0x07; num = Math.floor(num / 8); | ||||
| 		var len = 0; | ||||
| 		var res: Uint8Array; | ||||
| 		if(num == 0) break; | ||||
| 		var type = num & 0x07; num = (num / 8)|0; | ||||
| 		var data: Uint8Array; | ||||
| 		var l = ptr.l; | ||||
| 		switch(type) { | ||||
| 			case 0: { | ||||
| 				var l = ptr[0]; | ||||
| 				while(buf[ptr[0]++] >= 0x80); | ||||
| 				res = buf[subarray](l, ptr[0]); | ||||
| 				while(buf[l++] >= 0x80); | ||||
| 				data = buf[subarray](ptr.l, l); | ||||
| 				ptr.l = l; | ||||
| 			} break; | ||||
| 			case 5: len = 4; res = buf[subarray](ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 1: len = 8; res = buf[subarray](ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 2: len = parse_varint49(buf, ptr); res = buf[subarray](ptr[0], ptr[0] + len); ptr[0] += len; break; | ||||
| 			case 3: // Start group
 | ||||
| 			case 4: // End group
 | ||||
| 			case 1: { data = buf[subarray](l, l + 8); ptr.l = l + 8; } break; | ||||
| 			case 2: { | ||||
| 				var len = parse_varint49(buf, ptr); | ||||
| 				data = buf[subarray](ptr.l, ptr.l + len); | ||||
| 				ptr.l += len; | ||||
| 			} break; | ||||
| 			case 5: { data = buf[subarray](l, l + 4); ptr.l = l + 4; } break; | ||||
| 			default: throw new Error(`PB Type ${type} for Field ${num} at offset ${off}`); | ||||
| 		} | ||||
| 		var v: ProtoItem = { data: res, type }; | ||||
| 		if(out[num] == null) out[num] = [v]; | ||||
| 		else out[num].push(v); | ||||
| 		var v: ProtoItem = { data, type }; | ||||
| 		if(out[num] == null) out[num] = []; | ||||
| 		out[num].push(v); | ||||
| 	} | ||||
| 	return out; | ||||
| } | ||||
| @ -235,12 +231,12 @@ interface IWAArchiveInfo { | ||||
| } | ||||
| /** Extract all messages from a IWA file */ | ||||
| function parse_iwa_file(buf: Uint8Array): IWAArchiveInfo[] { | ||||
| 	var out: IWAArchiveInfo[] = [], ptr: Ptr = [0]; | ||||
| 	while(ptr[0] < buf.length) { | ||||
| 	var out: IWAArchiveInfo[] = [], ptr: Ptr = {l: 0}; | ||||
| 	while(ptr.l < buf.length) { | ||||
| 		/* .TSP.ArchiveInfo */ | ||||
| 		var len = parse_varint49(buf, ptr); | ||||
| 		var ai = parse_shallow(buf[subarray](ptr[0], ptr[0] + len)); | ||||
| 		ptr[0] += len; | ||||
| 		var ai = parse_shallow(buf[subarray](ptr.l, ptr.l + len)); | ||||
| 		ptr.l += len; | ||||
| 
 | ||||
| 		var res: IWAArchiveInfo = { | ||||
| 			/* TODO: technically ID is optional */ | ||||
| @ -252,9 +248,9 @@ function parse_iwa_file(buf: Uint8Array): IWAArchiveInfo[] { | ||||
| 			var fl = varint_to_i32(mi[3][0].data); | ||||
| 			res.messages.push({ | ||||
| 				meta: mi, | ||||
| 				data: buf[subarray](ptr[0], ptr[0] + fl) | ||||
| 				data: buf[subarray](ptr.l, ptr.l + fl) | ||||
| 			}); | ||||
| 			ptr[0] += fl; | ||||
| 			ptr.l += fl; | ||||
| 		}); | ||||
| 		if(ai[3]?.[0]) res.merge = (varint_to_i32(ai[3][0].data) >>> 0) > 0; | ||||
| 		out.push(res); | ||||
| @ -290,35 +286,36 @@ function write_iwa_file(ias: IWAArchiveInfo[]): Uint8Array { | ||||
| /** Decompress a snappy chunk */ | ||||
| function parse_snappy_chunk(type: number, buf: Uint8Array): Uint8Array[] { | ||||
| 	if(type != 0) throw new Error(`Unexpected Snappy chunk type ${type}`); | ||||
| 	var ptr: Ptr = [0]; | ||||
| 	var ptr: Ptr = {l: 0}; | ||||
| 
 | ||||
| 	var usz = parse_varint49(buf, ptr); | ||||
| 	var chunks: Uint8Array[] = []; | ||||
| 	while(ptr[0] < buf.length) { | ||||
| 		var tag = buf[ptr[0]] & 0x3; | ||||
| 	var l = ptr.l; | ||||
| 	while(l < buf.length) { | ||||
| 		var tag = buf[l] & 0x3; | ||||
| 		if(tag == 0) { | ||||
| 			var len = buf[ptr[0]++] >> 2; | ||||
| 			var len = buf[l++] >> 2; | ||||
| 			if(len < 60) ++len; | ||||
| 			else { | ||||
| 				var c = len - 59; | ||||
| 				len = buf[ptr[0]]; | ||||
| 				if(c > 1) len |= (buf[ptr[0]+1]<<8); | ||||
| 				if(c > 2) len |= (buf[ptr[0]+2]<<16); | ||||
| 				if(c > 3) len |= (buf[ptr[0]+3]<<24); | ||||
| 				len = buf[l]; | ||||
| 				if(c > 1) len |= (buf[l+1]<<8); | ||||
| 				if(c > 2) len |= (buf[l+2]<<16); | ||||
| 				if(c > 3) len |= (buf[l+3]<<24); | ||||
| 				len >>>=0; len++; | ||||
| 				ptr[0] += c; | ||||
| 				l += c; | ||||
| 			} | ||||
| 			chunks.push(buf[subarray](ptr[0], ptr[0] + len)); ptr[0] += len; continue; | ||||
| 			chunks.push(buf[subarray](l, l + len)); l += len; continue; | ||||
| 		} else { | ||||
| 			var offset = 0, length = 0; | ||||
| 			if(tag == 1) { | ||||
| 				length = ((buf[ptr[0]] >> 2) & 0x7) + 4; | ||||
| 				offset = (buf[ptr[0]++] & 0xE0) << 3; | ||||
| 				offset |= buf[ptr[0]++]; | ||||
| 				length = ((buf[l] >> 2) & 0x7) + 4; | ||||
| 				offset = (buf[l++] & 0xE0) << 3; | ||||
| 				offset |= buf[l++]; | ||||
| 			} else { | ||||
| 				length = (buf[ptr[0]++] >> 2) + 1; | ||||
| 				if(tag == 2) { offset = buf[ptr[0]] | (buf[ptr[0]+1]<<8); ptr[0] += 2; } | ||||
| 				else { offset = (buf[ptr[0]] | (buf[ptr[0]+1]<<8) | (buf[ptr[0]+2]<<16) | (buf[ptr[0]+3]<<24))>>>0; ptr[0] += 4; } | ||||
| 				length = (buf[l++] >> 2) + 1; | ||||
| 				if(tag == 2) { offset = buf[l] | (buf[l+1]<<8); l += 2; } | ||||
| 				else { offset = (buf[l] | (buf[l+1]<<8) | (buf[l+2]<<16) | (buf[l+3]<<24))>>>0; l += 4; } | ||||
| 			} | ||||
| 			if(offset == 0) throw new Error("Invalid offset 0"); | ||||
| 			var j = chunks.length - 1, off = offset; | ||||
| @ -334,14 +331,12 @@ function parse_snappy_chunk(type: number, buf: Uint8Array): Uint8Array[] { | ||||
| 				while(length >= chunks[j].length) { chunks.push(chunks[j]); length -= chunks[j].length; ++j; } | ||||
| 				if(length) chunks.push(chunks[j][subarray](0, length)); | ||||
| 			} | ||||
| 			if(chunks.length > 100) chunks = [u8concat(chunks)]; | ||||
| 			if(chunks.length > 25) chunks = [u8concat(chunks)]; | ||||
| 		} | ||||
| 	} | ||||
| 	if(chunks.reduce((acc, u8) => acc + u8.length, 0) != usz) throw new Error(`Unexpected length: ${chunks.reduce((acc, u8) => acc + u8.length, 0)} != ${usz}`); | ||||
| 	var clen = 0; for(var u8i = 0; u8i < chunks.length; ++u8i) clen += chunks[u8i].length; | ||||
| 	if(clen != usz) throw new Error(`Unexpected length: ${clen} != ${usz}`); | ||||
| 	return chunks; | ||||
| 	//var o = u8concat(chunks);
 | ||||
| 	//if(o.length != usz) throw new Error(`Unexpected length: ${o.length} != ${usz}`);
 | ||||
| 	//return o;
 | ||||
| } | ||||
| 
 | ||||
| /** Decompress IWA file */ | ||||
| @ -356,7 +351,7 @@ function decompress_iwa_file(buf: Uint8Array): Uint8Array { | ||||
| 		l += len; | ||||
| 	} | ||||
| 	if(l !== buf.length) throw new Error("data is not a valid framed stream!"); | ||||
| 	return u8concat(out); | ||||
| 	return out.length == 1 ? out[0] : u8concat(out); | ||||
| } | ||||
| 
 | ||||
| /** Compress IWA file */ | ||||
| @ -404,11 +399,11 @@ function numbers_format_cell(cell: CellObject, t: number, flags: number, ofmt: P | ||||
| 	var ctype = t & 0xFF, ver = t >> 8; | ||||
| 	var fmt = ver >= 5 ? nfmt : ofmt; | ||||
| 	dur: if((flags & (ver > 4 ? 8: 4)) && cell.t == "n" && ctype == 7) { | ||||
| 		var dstyle =   (fmt[7]?.[0])  ? parse_varint49(fmt[7][0].data)  : -1; | ||||
| 		var dstyle =   (fmt[7]?.[0])  ? varint_to_i32(fmt[7][0].data)  : -1; | ||||
| 		if(dstyle == -1) break dur; | ||||
| 		var dmin =     (fmt[15]?.[0]) ? parse_varint49(fmt[15][0].data) : -1; | ||||
| 		var dmax =     (fmt[16]?.[0]) ? parse_varint49(fmt[16][0].data) : -1; | ||||
| 		var auto =     (fmt[40]?.[0]) ? parse_varint49(fmt[40][0].data) : -1; | ||||
| 		var dmin =     (fmt[15]?.[0]) ? varint_to_i32(fmt[15][0].data) : -1; | ||||
| 		var dmax =     (fmt[16]?.[0]) ? varint_to_i32(fmt[16][0].data) : -1; | ||||
| 		var auto =     (fmt[40]?.[0]) ? varint_to_i32(fmt[40][0].data) : -1; | ||||
| 		var d: number = cell.v as number, dd = d; | ||||
| 		autodur: if(auto) { // TODO: check if numbers reformats on load
 | ||||
| 			if(d == 0) { dmin = dmax = 2; break autodur; } | ||||
| @ -617,7 +612,7 @@ function parse_cell_storage(buf: Uint8Array, lut: DataLUT): CellObject | void { | ||||
| /** Parse .TSP.Reference */ | ||||
| function parse_TSP_Reference(buf: Uint8Array): number { | ||||
| 	var pb = parse_shallow(buf); | ||||
| 	return parse_varint49(pb[1][0].data); | ||||
| 	return varint_to_i32(pb[1][0].data); | ||||
| } | ||||
| /** Write .TSP.Reference */ | ||||
| function write_TSP_Reference(idx: number): Uint8Array { | ||||
| @ -751,7 +746,7 @@ function parse_TST_TableModelArchive(M: MessageSpace, root: IWAMessage, ws: Work | ||||
| 	range.e.c = (varint_to_i32(pb[7][0].data) >>> 0) - 1; | ||||
| 	if(range.e.c < 0) throw new Error(`Invalid col varint ${pb[7][0].data}`); | ||||
| 	ws["!ref"] = encode_range(range); | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null, dws = (ws as DenseWorkSheet); | ||||
| 	// .TST.DataStore
 | ||||
| 	var store = parse_shallow(pb[4][0].data); | ||||
| 	var lut: DataLUT = numbers_lut_new(); | ||||
| @ -776,11 +771,10 @@ function parse_TST_TableModelArchive(M: MessageSpace, root: IWAMessage, ws: Work | ||||
| 				var res = parse_cell_storage(buf, lut); | ||||
| 				if(res) { | ||||
| 					if(dense) { | ||||
| 						if(!ws[_R + R]) ws[_R + R] = []; | ||||
| 						ws[_R + R][C] = res; | ||||
| 						if(!dws["!data"][_R + R]) dws["!data"][_R + R] = []; | ||||
| 						dws["!data"][_R + R][C] = res; | ||||
| 					} else { | ||||
| 						var addr = encode_cell({r:_R + R,c:C}); | ||||
| 						ws[addr] = res; | ||||
| 						ws[encode_col(C) + encode_row(_R + R)] = res; | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
| @ -810,10 +804,8 @@ function parse_TST_TableModelArchive(M: MessageSpace, root: IWAMessage, ws: Work | ||||
| function parse_TST_TableInfoArchive(M: MessageSpace, root: IWAMessage, opts?: ParsingOptions): WorkSheet { | ||||
| 	var pb = parse_shallow(root.data); | ||||
| 	// ESBuild #2375
 | ||||
| 	var out: WorkSheet; | ||||
| 	if(!opts?.dense) out =  ({ "!ref": "A1" }); | ||||
| 	else out = ([] as any); | ||||
| 	out["!ref"] = "A1"; | ||||
| 	var out: WorkSheet = { "!ref": "A1" }; | ||||
| 	if(opts?.dense) (out as DenseWorkSheet)["!data"] = []; | ||||
| 	var tableref = M[parse_TSP_Reference(pb[2][0].data)]; | ||||
| 	var mtype = varint_to_i32(tableref[0].meta[1][0].data); | ||||
| 	if(mtype != 6001) throw new Error(`6000 unexpected reference to ${mtype}`); | ||||
| @ -1026,21 +1018,18 @@ function build_numbers_deps(cfb: CFB$Container): Dependents { | ||||
| 		}); | ||||
| 	}); | ||||
| 
 | ||||
| 	/* precompute a varint for each id */ | ||||
| 	indices.sort((x,y) => x-y); | ||||
| 	var indices_varint: Array<[number, Uint8Array]> = indices.filter(x => x > 1).map(x => [x, write_varint49(x)] ); | ||||
| 
 | ||||
| 	/* build dependent tree */ | ||||
| 	cfb.FileIndex.forEach(fi => { | ||||
| 		if(!fi.name.match(/\.iwa/)) return; | ||||
| 		if(fi.name.match(/OperationStorage/)) return; | ||||
| 		parse_iwa_file(decompress_iwa_file(fi.content as Uint8Array)).forEach(ia => { | ||||
| 			// this is a huge hack based on the observation that most messages of interest have id > 900000
 | ||||
| 			// TODO: use the actual references
 | ||||
| 			indices_varint.forEach(ivi => { | ||||
| 				if(ia.messages.some(mess => varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]))) { | ||||
| 					dependents[ivi[0]].deps.push(ia.id); | ||||
| 				} | ||||
| 			ia.messages.forEach(mess => { | ||||
| 				[5,6].forEach(f => { | ||||
| 					if(!mess.meta[f]) return; | ||||
| 					mess.meta[f].forEach(x => { | ||||
| 						dependents[ia.id].deps.push(varint_to_i32(x.data)); | ||||
| 					}) | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
| 	}); | ||||
| @ -1298,7 +1287,7 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) { | ||||
| 							[], | ||||
| 							[{type: 0, data: write_varint49(0 /* TODO: save_token */)}], | ||||
| 						])}); | ||||
| 						mlist[1] = [{type: 0, data: write_varint49(Math.max(newref + 1, parse_varint49(mlist[1][0].data) ))}]; | ||||
| 						mlist[1] = [{type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data) ))}]; | ||||
| 
 | ||||
| 						/* add reference from TableModelArchive file to Tile */ | ||||
| 						var parentidx = mlist[3].findIndex(m => { | ||||
| @ -1363,7 +1352,7 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) { | ||||
| 								[], | ||||
| 								[{type: 0, data: write_varint49(0 /* TODO: save_token */)}], | ||||
| 							])}); | ||||
| 							mlist[1] = [{type: 0, data: write_varint49(Math.max(newref + 1, parse_varint49(mlist[1][0].data) ))}]; | ||||
| 							mlist[1] = [{type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data) ))}]; | ||||
| 
 | ||||
| 							/* add reference from TableModelArchive file to Tile */ | ||||
| 							var parentidx = mlist[3].findIndex(m => { | ||||
| @ -1427,7 +1416,7 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) { | ||||
| 								[], | ||||
| 								[{type: 0, data: write_varint49(0 /* TODO: save_token */)}], | ||||
| 							])}); | ||||
| 							mlist[1] = [{type: 0, data: write_varint49(Math.max(newtileref + 1, parse_varint49(mlist[1][0].data) ))}]; | ||||
| 							mlist[1] = [{type: 0, data: write_varint49(Math.max(newtileref + 1, varint_to_i32(mlist[1][0].data) ))}]; | ||||
| 
 | ||||
| 							/* add reference from TableModelArchive file to Tile */ | ||||
| 							var parentidx = mlist[3].findIndex(m => { | ||||
| @ -1565,8 +1554,8 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet, | ||||
| 					var metadata = numbers_iwa_find(cfb, deps, 2); | ||||
| 					var mlist = parse_shallow(metadata.messages[0].data); | ||||
| 					/* .TSP.ComponentInfo field 1 is the id, field 12 is the save token */ | ||||
| 					var mlst = mlist[3].filter(m => parse_varint49(parse_shallow(m.data)[1][0].data) == tileref); | ||||
| 					return (mlst?.length) ? parse_varint49(parse_shallow(mlst[0].data)[12][0].data) : 0; | ||||
| 					var mlst = mlist[3].filter(m => varint_to_i32(parse_shallow(m.data)[1][0].data) == tileref); | ||||
| 					return (mlst?.length) ? varint_to_i32(parse_shallow(mlst[0].data)[12][0].data) : 0; | ||||
| 				})(); | ||||
| 
 | ||||
| 				/* remove existing tile */ | ||||
| @ -1577,7 +1566,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet, | ||||
| 					numbers_iwa_doit(cfb, deps, 2, (ai => { | ||||
| 						var mlist = parse_shallow(ai.messages[0].data); | ||||
| 
 | ||||
| 						mlist[3] = mlist[3].filter(m => parse_varint49(parse_shallow(m.data)[1][0].data) != tileref); | ||||
| 						mlist[3] = mlist[3].filter(m => varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref); | ||||
| 
 | ||||
| 						/* remove reference from TableModelArchive file to Tile */ | ||||
| 						var parentidx = mlist[3].findIndex(m => { | ||||
| @ -1588,7 +1577,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet, | ||||
| 						}); | ||||
| 						var parent = parse_shallow(mlist[3][parentidx].data); | ||||
| 						if(!parent[6]) parent[6] = []; | ||||
| 						parent[6] = parent[6].filter(m => parse_varint49(parse_shallow(m.data)[1][0].data) != tileref); | ||||
| 						parent[6] = parent[6].filter(m => varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref); | ||||
| 						mlist[3][parentidx].data = write_shallow(parent); | ||||
| 
 | ||||
| 						ai.messages[0].data = write_shallow(mlist); | ||||
| @ -1660,7 +1649,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet, | ||||
| 							[], | ||||
| 							[{type: 0, data: write_varint49(save_token)}], | ||||
| 						])}); | ||||
| 						mlist[1] = [{type: 0, data: write_varint49(Math.max(newtileid + 1, parse_varint49(mlist[1][0].data) ))}]; | ||||
| 						mlist[1] = [{type: 0, data: write_varint49(Math.max(newtileid + 1, varint_to_i32(mlist[1][0].data) ))}]; | ||||
| 
 | ||||
| 						/* add reference from TableModelArchive file to Tile */ | ||||
| 						var parentidx = mlist[3].findIndex(m => { | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "xlsx", | ||||
| 	"version": "0.18.12", | ||||
| 	"version": "0.19.0", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "SheetJS Spreadsheet data parser and writer", | ||||
| 	"keywords": [ | ||||
| @ -109,7 +109,7 @@ | ||||
| 	}, | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
| 		"url": "git://github.com/SheetJS/sheetjs.git" | ||||
| 		"url": "https://git.sheetjs.com/SheetJS/sheetjs" | ||||
| 	}, | ||||
| 	"scripts": { | ||||
| 		"pretest": "npm run lint", | ||||
| @ -138,7 +138,7 @@ | ||||
| 	}, | ||||
| 	"homepage": "https://sheetjs.com/", | ||||
| 	"bugs": { | ||||
| 		"url": "https://github.com/SheetJS/sheetjs/issues" | ||||
| 		"url": "https://git.sheetjs.com/SheetJS/sheetjs/issues" | ||||
| 	}, | ||||
| 	"license": "Apache-2.0", | ||||
| 	"engines": { | ||||
|  | ||||
							
								
								
									
										3
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								test.js
									
									
									
									
									
								
							| @ -54,7 +54,7 @@ if(!browser) { | ||||
| 	for(var _fileAi = 0; _fileAi < _fileA.length; ++_fileAi) if(test_file(_fileA[_fileAi])) fileA.push(_fileA[_fileAi]); | ||||
| } | ||||
| 
 | ||||
| var can_write_numbers = typeof Set !== "undefined" && typeof Array.prototype.findIndex == "function" && typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.indexOf == "function"; | ||||
| var can_write_numbers = typeof Array.prototype.findIndex == "function" && typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.indexOf == "function"; | ||||
| 
 | ||||
| /* Excel enforces 31 character sheet limit, although technical file limit is 255 */ | ||||
| function fixsheetname(x/*:string*/)/*:string*/ { return x.substr(0,31); } | ||||
| @ -1549,6 +1549,7 @@ describe('write features', function() { | ||||
| 	it('should handle non-string values for "s" cells', function() {[ | ||||
| 		"xlsx", "xlsb", "xls", "biff5", "biff2", "xlml", "numbers", "ods", "fods", "wk3", "csv", "txt", "sylk", "html", "dif", "dbf", "wk1", "rtf", "prn" | ||||
| 	].forEach(function(fmt) { | ||||
| 		if(fmt == "numbers" && !can_write_numbers) return; | ||||
| 		var ws = X.utils.aoa_to_sheet([ | ||||
| 			["String", "123"], | ||||
| 			["Number", 123], | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| Subproject commit 787cc72932acf77ac58018d60d934b65847b16a3 | ||||
| Subproject commit 1ea05a3eee0a746c102dea42e729b31e4ebfca35 | ||||
							
								
								
									
										3
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							| @ -54,7 +54,7 @@ if(!browser) { | ||||
| 	for(var _fileAi = 0; _fileAi < _fileA.length; ++_fileAi) if(test_file(_fileA[_fileAi])) fileA.push(_fileA[_fileAi]); | ||||
| } | ||||
| 
 | ||||
| var can_write_numbers = typeof Set !== "undefined" && typeof Array.prototype.findIndex == "function" && typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.indexOf == "function"; | ||||
| var can_write_numbers = typeof Array.prototype.findIndex == "function" && typeof Uint8Array !== "undefined" && typeof Uint8Array.prototype.indexOf == "function"; | ||||
| 
 | ||||
| /* Excel enforces 31 character sheet limit, although technical file limit is 255 */ | ||||
| function fixsheetname(x/*:string*/)/*:string*/ { return x.substr(0,31); } | ||||
| @ -1549,6 +1549,7 @@ describe('write features', function() { | ||||
| 	it('should handle non-string values for "s" cells', function() {[ | ||||
| 		"xlsx", "xlsb", "xls", "biff5", "biff2", "xlml", "numbers", "ods", "fods", "wk3", "csv", "txt", "sylk", "html", "dif", "dbf", "wk1", "rtf", "prn" | ||||
| 	].forEach(function(fmt) { | ||||
| 		if(fmt == "numbers" && !can_write_numbers) return; | ||||
| 		var ws = X.utils.aoa_to_sheet([ | ||||
| 			["String", "123"], | ||||
| 			["Number", 123], | ||||
|  | ||||
							
								
								
									
										47
									
								
								types/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										47
									
								
								types/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -536,20 +536,52 @@ export type SheetKeys = string | MarginInfo | SheetType; | ||||
| /** General object representing a Sheet (worksheet or chartsheet) */ | ||||
| export interface Sheet { | ||||
|     /** | ||||
|      * Indexing with a cell address string maps to a cell object | ||||
|      * Sparse-mode store cells with keys corresponding to A1-style address | ||||
|      * Dense-mode  store cells in the '!data' key | ||||
|      * Special keys start with '!' | ||||
|      */ | ||||
|     [cell: string]: CellObject | SheetKeys | any; | ||||
|     [cell: string]: CellObject | CellObject[][] | SheetKeys | any; | ||||
| 
 | ||||
|     /** | ||||
|      * Dense-mode worksheets store data in an array of arrays | ||||
|      * | ||||
|      * Cells are accessed with sheet['!data'][R][C] (where R and C are 0-indexed) | ||||
|      */ | ||||
|     '!data'?: CellObject[][]; | ||||
| 
 | ||||
|     /** Sheet type */ | ||||
|     '!type'?: SheetType; | ||||
| 
 | ||||
|     /** Sheet Range */ | ||||
|     /** Sheet Range (A1-style) */ | ||||
|     '!ref'?: string; | ||||
| 
 | ||||
|     /** Page Margins */ | ||||
|     '!margins'?: MarginInfo; | ||||
| } | ||||
| /** General object representing a dense Sheet (worksheet or chartsheet) */ | ||||
| export interface DenseSheet extends Sheet { | ||||
|     /** | ||||
|      * Special keys start with '!' | ||||
|      * Dense-mode worksheets store data in the '!data' key | ||||
|      */ | ||||
|     [cell: string]: CellObject[][] | SheetKeys; | ||||
| 
 | ||||
|     /** | ||||
|      * Dense-mode worksheets store data in an array of arrays | ||||
|      * | ||||
|      * Cells are accessed with sheet['!data'][R][C] (where R and C are 0-indexed) | ||||
|      */ | ||||
|     '!data': CellObject[][]; | ||||
| } | ||||
| /** General object representing a sparse Sheet (worksheet or chartsheet) */ | ||||
| export interface SparseSheet extends Sheet { | ||||
|     /** | ||||
|      * Sparse-mode store cells with keys corresponding to A1-style address | ||||
|      * Cells are accessed with sheet[addr] | ||||
|      */ | ||||
|     '!data': never; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** AutoFilter properties */ | ||||
| export interface AutoFilterInfo { | ||||
| @ -582,6 +614,15 @@ export interface WorkSheet extends Sheet { | ||||
|     /** AutoFilter info */ | ||||
|     '!autofilter'?: AutoFilterInfo; | ||||
| } | ||||
| /** Dense Worksheet Object */ | ||||
| export interface DenseWorkSheet extends DenseSheet { | ||||
|     /** | ||||
|      * Dense-mode worksheets store data in an array of arrays | ||||
|      * | ||||
|      * Cells are accessed with sheet['!data'][R][C] (where R and C are 0-indexed) | ||||
|      */ | ||||
|     '!data': CellObject[][]; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Worksheet Object with CellObject type | ||||
|  | ||||
							
								
								
									
										599
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										599
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,10 +1,10 @@ | ||||
| /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| /*exported XLSX */ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false, Set:false */ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ | ||||
| var XLSX = {}; | ||||
| function make_xlsx_lib(XLSX){ | ||||
| XLSX.version = '0.18.12'; | ||||
| XLSX.version = '0.19.0'; | ||||
| var current_codepage = 1200, current_ansi = 1252; | ||||
| /*:: declare var cptable:any; */ | ||||
| /*global cptable:true, window */ | ||||
| @ -1669,7 +1669,7 @@ sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs); | ||||
| /** Chains */ | ||||
| var sector_list/*:SectorList*/ = make_sector_list(sectors, dir_start, fat_addrs, ssz); | ||||
| 
 | ||||
| sector_list[dir_start].name = "!Directory"; | ||||
| if(dir_start < sector_list.length) sector_list[dir_start].name = "!Directory"; | ||||
| if(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT"; | ||||
| sector_list[fat_addrs[0]].name = "!FAT"; | ||||
| sector_list.fat_addrs = fat_addrs; | ||||
| @ -4281,7 +4281,6 @@ function fix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^([A-Z])/,"$ | ||||
| function unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\$([A-Z])/,"$1"); } | ||||
| 
 | ||||
| function split_cell(cstr/*:string*/)/*:Array<string>*/ { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); } | ||||
| //function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
 | ||||
| function decode_cell(cstr/*:string*/)/*:CellAddress*/ { | ||||
| 	var R = 0, C = 0; | ||||
| 	for(var i = 0; i < cstr.length; ++i) { | ||||
| @ -4291,7 +4290,6 @@ function decode_cell(cstr/*:string*/)/*:CellAddress*/ { | ||||
| 	} | ||||
| 	return { c: C - 1, r:R - 1 }; | ||||
| } | ||||
| //function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
 | ||||
| function encode_cell(cell/*:CellAddress*/)/*:string*/ { | ||||
| 	var col = cell.c + 1; | ||||
| 	var s=""; | ||||
| @ -4384,9 +4382,10 @@ function sheet_to_workbook(sheet/*:Worksheet*/, opts)/*:Workbook*/ { | ||||
| 
 | ||||
| function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksheet*/ { | ||||
| 	var o = opts || {}; | ||||
| 	var dense = _ws ? Array.isArray(_ws) : o.dense; | ||||
| 	var dense = _ws ? (_ws["!data"] != null) : o.dense; | ||||
| 	if(DENSE != null && dense == null) dense = DENSE; | ||||
| 	var ws/*:Worksheet*/ = _ws || (dense ? ([]/*:any*/) : ({}/*:any*/)); | ||||
| 	var ws/*:Worksheet*/ = _ws || ({}/*:any*/); | ||||
| 	if(dense && !ws["!data"]) ws["!data"] = []; | ||||
| 	var _R = 0, _C = 0; | ||||
| 	if(ws && o.origin != null) { | ||||
| 		if(typeof o.origin == 'number') _R = o.origin; | ||||
| @ -4405,13 +4404,19 @@ function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksh | ||||
| 		range.e.r = Math.max(range.e.r, _range.e.r); | ||||
| 		if(_R == -1) range.e.r = _R = _range.e.r + 1; | ||||
| 	} | ||||
| 	var row = []; | ||||
| 	for(var R = 0; R != data.length; ++R) { | ||||
| 		if(!data[R]) continue; | ||||
| 		if(!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays"); | ||||
| 		var __R = _R + R, __Rstr = "" + (__R + 1); | ||||
| 		if(dense) { | ||||
| 			if(!ws["!data"][__R]) ws["!data"][__R] = []; | ||||
| 			row = ws["!data"][__R]; | ||||
| 		} | ||||
| 		for(var C = 0; C != data[R].length; ++C) { | ||||
| 			if(typeof data[R][C] === 'undefined') continue; | ||||
| 			var cell/*:Cell*/ = ({v: data[R][C] }/*:any*/); | ||||
| 			var __R = _R + R, __C = _C + C; | ||||
| 			var __C = _C + C; | ||||
| 			if(range.s.r > __R) range.s.r = __R; | ||||
| 			if(range.s.c > __C) range.s.c = __C; | ||||
| 			if(range.e.r < __R) range.e.r = __R; | ||||
| @ -4435,11 +4440,10 @@ function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksh | ||||
| 				else cell.t = 's'; | ||||
| 			} | ||||
| 			if(dense) { | ||||
| 				if(!ws[__R]) ws[__R] = []; | ||||
| 				if(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z; | ||||
| 				ws[__R][__C] = cell; | ||||
| 				if(row[__C] && row[__C].z) cell.z = row[__C].z; | ||||
| 				row[__C] = cell; | ||||
| 			} else { | ||||
| 				var cell_ref = encode_cell(({c:__C,r:__R}/*:any*/)); | ||||
| 				var cell_ref = encode_col(__C) + __Rstr/*:any*/; | ||||
| 				if(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z; | ||||
| 				ws[cell_ref] = cell; | ||||
| 			} | ||||
| @ -5865,6 +5869,7 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) { | ||||
| 				case 'N': | ||||
| 					var _n = "0"; | ||||
| 					if(typeof data[i][j] == "number") _n = data[i][j].toFixed(coldecimals[j]||0); | ||||
| 					if(_n.length > colwidths[j]) _n = _n.slice(0, colwidths[j]); // addresses decimal > width
 | ||||
| 					for(hcnt=0; hcnt < colwidths[j]-_n.length; ++hcnt) rout.write_shift(1, 0x20); | ||||
| 					rout.write_shift(1, _n, "sbcs"); | ||||
| 					break; | ||||
| @ -6128,7 +6133,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		/* TODO: codepage */ | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PSheetJS;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		var RS = "\r\n"; | ||||
| 		var d1904 = (((wb||{}).Workbook||{}).WBProps||{}).date1904; | ||||
| 
 | ||||
| @ -6140,10 +6145,10 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		preamble.push("B;Y" + (r.e.r - r.s.r + 1) + ";X" + (r.e.c - r.s.c + 1) + ";D" + [r.s.c,r.s.r,r.e.c,r.e.r].join(" ")); | ||||
| 		preamble.push("O;L;D;B" + (d1904 ? ";V4" : "") + ";K47;G100 0.001"); | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			if(dense && !ws["!data"][R]) continue; | ||||
| 			var p = []; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 				cell = dense ? ws["!data"][R][C] : ws[encode_col(C) + encode_row(R)]; | ||||
| 				if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; | ||||
| 				p.push(write_ws_cell_sylk(cell, ws, R, C, opts)); // TODO: pass date1904 info
 | ||||
| 			} | ||||
| @ -6216,7 +6221,7 @@ var DIF = /*#__PURE__*/(function() { | ||||
| 	function sheet_to_dif(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ { | ||||
| 		var _DIF_XL = DIF_XL; | ||||
| 		var r = safe_decode_range(ws['!ref']); | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		var o/*:Array<string>*/ = [ | ||||
| 			"TABLE\r\n0,1\r\n\"sheetjs\"\r\n", | ||||
| 			"VECTORS\r\n0," + (r.e.r - r.s.r + 1) + "\r\n\"\"\r\n", | ||||
| @ -6224,9 +6229,10 @@ var DIF = /*#__PURE__*/(function() { | ||||
| 			"DATA\r\n0,0\r\n\"\"\r\n" | ||||
| 		]; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			var row = dense ? ws["!data"][R] : []; | ||||
| 			var p = "-1,0\r\nBOT\r\n"; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var cell/*:Cell*/ = dense ? (ws[R] && ws[R][C]) : ws[encode_cell({r:R,c:C})]; | ||||
| 				var cell/*:Cell*/ = dense ? (row && row[C]) : ws[encode_cell({r:R,c:C})]; | ||||
| 				if(cell == null) { p +=("1,0\r\n\"\"\r\n"); continue;} | ||||
| 				switch(cell.t) { | ||||
| 					case 'n': | ||||
| @ -6321,11 +6327,11 @@ var ETH = /*#__PURE__*/(function() { | ||||
| 		if(!ws || !ws['!ref']) return ""; | ||||
| 		var o/*:Array<string>*/ = [], oo/*:Array<string>*/ = [], cell, coord = ""; | ||||
| 		var r = decode_range(ws['!ref']); | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null || cell.t === 'z') continue; | ||||
| 				oo = ["cell", coord, 't']; | ||||
| 				switch(cell.t) { | ||||
| @ -6447,7 +6453,8 @@ var PRN = /*#__PURE__*/(function() { | ||||
| 		var o = opts || {}; | ||||
| 		var sep = ""; | ||||
| 		if(DENSE != null && o.dense == null) o.dense = DENSE; | ||||
| 		var ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var ws/*:Worksheet*/ = ({}/*:any*/); | ||||
| 		if(o.dense) ws["!data"] = []; | ||||
| 		var range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:0}}/*:any*/); | ||||
| 
 | ||||
| 		if(str.slice(0,4) == "sep=") { | ||||
| @ -6493,7 +6500,7 @@ var PRN = /*#__PURE__*/(function() { | ||||
| 				cell.v = s; | ||||
| 			} | ||||
| 			if(cell.t == 'z'){} | ||||
| 			else if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; } | ||||
| 			else if(o.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = cell; } | ||||
| 			else ws[encode_cell({c:C,r:R})] = cell; | ||||
| 			start = end+1; startcc = str.charCodeAt(start); | ||||
| 			if(range.e.c < C) range.e.c = C; | ||||
| @ -6549,12 +6556,12 @@ var PRN = /*#__PURE__*/(function() { | ||||
| 	function sheet_to_prn(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ { | ||||
| 		var o/*:Array<string>*/ = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			var oo/*:Array<string>*/ = []; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null) { oo.push("          "); continue; } | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10); | ||||
| 				while(w.length < 10) w += " "; | ||||
| @ -7866,18 +7873,18 @@ function write_vml_comment(x, _shapeid)/*:string*/ { | ||||
| 	'</v:shape>' | ||||
| 	].join(""); | ||||
| } | ||||
| function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) { | ||||
| 	var dense = Array.isArray(sheet); | ||||
| function sheet_insert_comments(sheet/*:WorkSheet*/, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) { | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var cell/*:Cell*/; | ||||
| 	comments.forEach(function(comment) { | ||||
| 		var r = decode_cell(comment.ref); | ||||
| 		if(dense) { | ||||
| 			if(!sheet[r.r]) sheet[r.r] = []; | ||||
| 			cell = sheet[r.r][r.c]; | ||||
| 			if(!sheet["!data"][r.r]) sheet["!data"][r.r] = []; | ||||
| 			cell = sheet["!data"][r.r][r.c]; | ||||
| 		} else cell = sheet[comment.ref]; | ||||
| 		if (!cell) { | ||||
| 			cell = ({t:"z"}/*:any*/); | ||||
| 			if(dense) sheet[r.r][r.c] = cell; | ||||
| 			if(dense) sheet["!data"][r.r][r.c] = cell; | ||||
| 			else sheet[comment.ref] = cell; | ||||
| 			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1"); | ||||
| 			if(range.s.r > r.r) range.s.r = r.r; | ||||
| @ -7885,7 +7892,7 @@ function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/* | ||||
| 			if(range.s.c > r.c) range.s.c = r.c; | ||||
| 			if(range.e.c < r.c) range.e.c = r.c; | ||||
| 			var encoded = encode_range(range); | ||||
| 			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded; | ||||
| 			sheet["!ref"] = encoded; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!cell.c) cell.c = []; | ||||
| @ -7903,7 +7910,6 @@ function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/* | ||||
| 		cell.c.push(o); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| /* 18.7 Comments */ | ||||
| function parse_comments_xml(data/*:string*/, opts)/*:Array<RawComment>*/ { | ||||
| 	/* 18.7.6 CT_Comments */ | ||||
| @ -8361,7 +8367,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 
 | ||||
| 	/* 18.3.1.99 worksheet CT_Worksheet */ | ||||
| 	var s = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 	var s = ({}/*:any*/); if(opts.dense) s["!data"] = []; | ||||
| 	var refguess/*:Range*/ = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} }/*:any*/); | ||||
| 
 | ||||
| 	var data1 = "", data2 = ""; | ||||
| @ -8490,7 +8496,7 @@ function write_ws_xml_protection(sp)/*:string*/ { | ||||
| } | ||||
| 
 | ||||
| function parse_ws_xml_hlinks(s, data/*:Array<string>*/, rels) { | ||||
| 	var dense = Array.isArray(s); | ||||
| 	var dense = s["!data"] != null; | ||||
| 	for(var i = 0; i != data.length; ++i) { | ||||
| 		var val = parsexmltag(utf8read(data[i]), true); | ||||
| 		if(!val.ref) return; | ||||
| @ -8506,11 +8512,11 @@ function parse_ws_xml_hlinks(s, data/*:Array<string>*/, rels) { | ||||
| 		if(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; } | ||||
| 		var rng = safe_decode_range(val.ref); | ||||
| 		for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) { | ||||
| 			var addr = encode_cell({c:C,r:R}); | ||||
| 			var addr = encode_col(C) + encode_row(R); | ||||
| 			if(dense) { | ||||
| 				if(!s[R]) s[R] = []; | ||||
| 				if(!s[R][C]) s[R][C] = {t:"z",v:undefined}; | ||||
| 				s[R][C].l = val; | ||||
| 				if(!s["!data"][R]) s["!data"][R] = []; | ||||
| 				if(!s["!data"][R][C]) s["!data"][R][C] = {t:"z",v:undefined}; | ||||
| 				s["!data"][R][C].l = val; | ||||
| 			} else { | ||||
| 				if(!s[addr]) s[addr] = {t:"z",v:undefined}; | ||||
| 				s[addr].l = val; | ||||
| @ -8662,7 +8668,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 	var do_format = Array.isArray(styles.CellXf), cf; | ||||
| 	var arrayf/*:Array<[Range, string]>*/ = []; | ||||
| 	var sharedf = []; | ||||
| 	var dense = Array.isArray(s); | ||||
| 	var dense = s["!data"] != null; | ||||
| 	var rows/*:Array<RowInfo>*/ = [], rowobj = {}, rowrite = false; | ||||
| 	var sheetStubs = !!opts.sheetStubs; | ||||
| 	for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) { | ||||
| @ -8827,8 +8833,8 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 			} | ||||
| 			if(dense) { | ||||
| 				var _r = decode_cell(tag.r); | ||||
| 				if(!s[_r.r]) s[_r.r] = []; | ||||
| 				s[_r.r][_r.c] = p; | ||||
| 				if(!s["!data"][_r.r]) s["!data"][_r.r] = []; | ||||
| 				s["!data"][_r.r][_r.c] = p; | ||||
| 			} else s[tag.r] = p; | ||||
| 		} | ||||
| 	} | ||||
| @ -8837,7 +8843,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th | ||||
| 
 | ||||
| function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*//*::, rels*/)/*:string*/ { | ||||
| 	var o/*:Array<string>*/ = [], r/*:Array<string>*/ = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols/*:Array<string>*/ = [], R=0, C=0, rows = ws['!rows']; | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var params = ({r:rr}/*:any*/), row/*:RowInfo*/, height = -1; | ||||
| 	for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(R = range.s.r; R <= range.e.r; ++R) { | ||||
| @ -8845,7 +8851,7 @@ function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook | ||||
| 		rr = encode_row(R); | ||||
| 		for(C = range.s.c; C <= range.e.c; ++C) { | ||||
| 			ref = cols[C] + rr; | ||||
| 			var _cell = dense ? (ws[R]||[])[C]: ws[ref]; | ||||
| 			var _cell = dense ? (ws["!data"][R]||[])[C]: ws[ref]; | ||||
| 			if(_cell === undefined) continue; | ||||
| 			if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); | ||||
| 		} | ||||
| @ -9034,7 +9040,10 @@ function parse_chart(data/*:?string*/, name/*:string*/, opts, rels, wb, csheet) | ||||
| 		refguess.e.c = C; | ||||
| 		col = encode_col(C); | ||||
| 		cache[0].forEach(function(n,i) { | ||||
| 			cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] }; | ||||
| 			if(cs["!data"]) { | ||||
| 				if(!cs["!data"][i]) cs["!data"][i] = []; | ||||
| 				cs["!data"][i][C] = {t:'n', v:n, z:cache[1] }; | ||||
| 			} else cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] }; | ||||
| 			R = i; | ||||
| 		}); | ||||
| 		if(refguess.e.r < R) refguess.e.r = R; | ||||
| @ -9530,8 +9539,8 @@ function parse_xlmeta(data, name/*:string*/, opts) { | ||||
| /* note: browser DOM element cannot see mso- style attrs, must parse */ | ||||
| function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ { | ||||
| 	var opts = _opts || {}; | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 	var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 	var dense = (opts.dense != null) ? opts.dense : DENSE; | ||||
| 	var ws/*:Worksheet*/ = ({}/*:any*/); if(dense) ws["!data"] = []; | ||||
| 	str = str.replace(/<!--.*?-->/g, ""); | ||||
| 	var mtch/*:any*/ = str.match(/<table/i); | ||||
| 	if(!mtch) throw new Error("Invalid HTML: could not find <table>"); | ||||
| @ -9577,7 +9586,7 @@ function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ { | ||||
| 				if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/); | ||||
| 				o.z = opts.dateNF || table_fmt[14]; | ||||
| 			} | ||||
| 			if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; } | ||||
| 			if(dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = o; } | ||||
| 			else ws[encode_cell({r:R, c:C})] = o; | ||||
| 			C += CS; | ||||
| 		} | ||||
| @ -9590,6 +9599,7 @@ function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HT | ||||
| 	var M/*:Array<Range>*/ = (ws['!merges'] ||[]); | ||||
| 	var oo/*:Array<string>*/ = []; | ||||
| 	var sp = ({}/*:any*/); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var RS = 0, CS = 0; | ||||
| 		for(var j = 0; j < M.length; ++j) { | ||||
| @ -9599,8 +9609,8 @@ function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HT | ||||
| 			RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break; | ||||
| 		} | ||||
| 		if(RS < 0) continue; | ||||
| 		var coord = encode_cell({r:R,c:C}); | ||||
| 		var cell = o.dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 		var coord = encode_col(C) + encode_row(R); | ||||
| 		var cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 		/* TODO: html entities */ | ||||
| 		var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || ""; | ||||
| 		sp = ({}/*:any*/); | ||||
| @ -9648,7 +9658,6 @@ function sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*//*, wb:?Workboo | ||||
| 	var footer = o.footer != null ? o.footer : HTML_END; | ||||
| 	var out/*:Array<string>*/ = [header]; | ||||
| 	var r = decode_range(ws['!ref']); | ||||
| 	o.dense = Array.isArray(ws); | ||||
| 	out.push(make_html_preamble(ws, r, o)); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o)); | ||||
| 	out.push("</table>" + footer); | ||||
| @ -9663,7 +9672,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/ | ||||
| 	} | ||||
| 
 | ||||
| 	var opts = _opts || {}; | ||||
| 	if(DENSE != null) opts.dense = DENSE; | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var or_R = 0, or_C = 0; | ||||
| 	if(opts.origin != null) { | ||||
| 		if(typeof opts.origin == 'number') or_R = opts.origin; | ||||
| @ -9728,7 +9737,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/ | ||||
| 				l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break; | ||||
| 			} | ||||
| 			if(l && l.charAt(0) != "#" &&	l.slice(0, 11).toLowerCase() != 'javascript:') o.l = ({ Target: l }); | ||||
| 			if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; } | ||||
| 			if(dense) { if(!ws["!data"][R + or_R]) ws["!data"][R + or_R] = []; ws["!data"][R + or_R][C + or_C] = o; } | ||||
| 			else ws[encode_cell({c:C + or_C, r:R + or_R})] = o; | ||||
| 			if(range.e.c < C + or_C) range.e.c = C + or_C; | ||||
| 			C += CS; | ||||
| @ -9744,7 +9753,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/ | ||||
| 
 | ||||
| function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ { | ||||
| 	var opts = _opts || {}; | ||||
| 	var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 	var ws/*:Worksheet*/ = ({}/*:any*/); if(opts.dense) ws["!data"] = []; | ||||
| 	return sheet_add_dom(ws, table, _opts); | ||||
| } | ||||
| 
 | ||||
| @ -10017,7 +10026,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 		var sheetag/*:: = {name:"", '名称':""}*/; | ||||
| 		var rowtag/*:: = {'行号':""}*/; | ||||
| 		var Sheets = {}, SheetNames/*:Array<string>*/ = []; | ||||
| 		var ws = opts.dense ? ([]/*:any*/) : ({}/*:any*/); | ||||
| 		var ws = ({}/*:any*/); if(opts.dense) ws["!data"] = []; | ||||
| 		var Rn, q/*:: :any = ({t:"", v:null, z:null, w:"",c:[],}:any)*/; | ||||
| 		var ctag = ({value:""}/*:any*/); | ||||
| 		var textp = "", textpidx = 0, textptag/*:: = {}*/; | ||||
| @ -10061,7 +10070,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 					sheetag = parsexmltag(Rn[0], false); | ||||
| 					R = C = -1; | ||||
| 					range.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0; | ||||
| 					ws = opts.dense ? ([]/*:any*/) : ({}/*:any*/); merges = []; | ||||
| 					ws = ({}/*:any*/); if(opts.dense) ws["!data"] = []; merges = []; | ||||
| 					rowinfo = []; | ||||
| 					intable = true; | ||||
| 				} | ||||
| @ -10081,7 +10090,7 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | ||||
| 				if(Rn[1] !== '/') ++C; | ||||
| 				if(opts.sheetStubs) { | ||||
| 					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; } | ||||
| 					if(opts.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = {t:'z'}; } | ||||
| 					else ws[encode_cell({r:R,c:C})] = {t:'z'}; | ||||
| 				} | ||||
| 				textp = ""; textR = []; | ||||
| @ -10097,10 +10106,10 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 					if((ctag['数据类型'] || ctag['value-type']) == "string") { | ||||
| 						q.t = "s"; q.v = unescapexml(ctag['string-value'] || ""); | ||||
| 						if(opts.dense) { | ||||
| 							if(!ws[R]) ws[R] = []; | ||||
| 							ws[R][C] = q; | ||||
| 							if(!ws["!data"][R]) ws["!data"][R] = []; | ||||
| 							ws["!data"][R][C] = q; | ||||
| 						} else { | ||||
| 							ws[encode_cell({r:R,c:C})] = q; | ||||
| 							ws[encode_col(C) + encode_row(R)] = q; | ||||
| 						} | ||||
| 					} | ||||
| 					C+= colpeat-1; | ||||
| @ -10177,9 +10186,9 @@ function parse_content_xml(d/*:string*/, _opts, _nfm)/*:Workbook*/ { | ||||
| 							for(var rpt = 0; rpt < rowpeat; ++rpt) { | ||||
| 								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10); | ||||
| 								if(opts.dense) { | ||||
| 									if(!ws[R + rpt]) ws[R + rpt] = []; | ||||
| 									ws[R + rpt][C] = rpt == 0 ? q : dup(q); | ||||
| 									while(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q); | ||||
| 									if(!ws["!data"][R + rpt]) ws["!data"][R + rpt] = []; | ||||
| 									ws["!data"][R + rpt][C] = rpt == 0 ? q : dup(q); | ||||
| 									while(--colpeat > 0) ws["!data"][R + rpt][C + colpeat] = dup(q); | ||||
| 								} else { | ||||
| 									ws[encode_cell({r:R + rpt,c:C})] = q; | ||||
| 									while(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q); | ||||
| @ -10764,7 +10773,7 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function | ||||
| 		o.push('      <table:table table:name="' + escapexml(wb.SheetNames[i]) + '" table:style-name="ta1">\n'); | ||||
| 		var R=0,C=0, range = decode_range(ws['!ref']||"A1"); | ||||
| 		var marr/*:Array<Range>*/ = ws['!merges'] || [], mi = 0; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		if(ws["!cols"]) { | ||||
| 			for(C = 0; C <= range.e.c; ++C) o.push('        <table:table-column' + (ws["!cols"][C] ? ' table:style-name="co' + ws["!cols"][C].ods + '"' : '') + '></table:table-column>\n'); | ||||
| 		} | ||||
| @ -10790,7 +10799,7 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function | ||||
| 					break; | ||||
| 				} | ||||
| 				if(skip) { o.push(covered_cell_xml); continue; } | ||||
| 				var ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref]; | ||||
| 				var ref = encode_cell({r:R, c:C}), cell = dense ? (ws["!data"][R]||[])[C]: ws[ref]; | ||||
| 				if(cell && cell.f) { | ||||
| 					ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f)); | ||||
| 					if(cell.F) { | ||||
| @ -10900,9 +10909,10 @@ var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function | ||||
| 		var nfi = 69; | ||||
| 		wb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) { | ||||
| 			if(!ws) return; | ||||
| 			var dense = (ws["!data"] != null); | ||||
| 			var range = decode_range(ws["!ref"]); | ||||
| 			for(var R = 0; R <= range.e.r; ++R) for(var C = 0; C <= range.e.c; ++C) { | ||||
| 				var c = Array.isArray(ws) ? (ws[R]||[])[C] : ws[encode_cell({r:R,c:C})]; | ||||
| 				var c = dense ? (ws["!data"][R]||[])[C] : ws[encode_cell({r:R,c:C})]; | ||||
| 				if(!c || !c.z || c.z.toLowerCase() == "general") continue; | ||||
| 				if(!nfs[c.z]) { | ||||
| 					var out = write_number_format_ods(c.z, "N" + nfi); | ||||
| @ -12003,17 +12013,17 @@ type MJRObject = { | ||||
| 	isempty: boolean; | ||||
| }; | ||||
| */ | ||||
| function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, header/*:number*/, hdr/*:Array<any>*/, dense/*:boolean*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ { | ||||
| function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, header/*:number*/, hdr/*:Array<any>*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ { | ||||
| 	var rr = encode_row(R); | ||||
| 	var defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw"); | ||||
| 	var isempty = true; | ||||
| 	var isempty = true, dense = (sheet["!data"] != null); | ||||
| 	var row/*:any*/ = (header === 1) ? [] : {}; | ||||
| 	if(header !== 1) { | ||||
| 		if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; } | ||||
| 		else row.__rowNum__ = R; | ||||
| 	} | ||||
| 	if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var val = dense ? sheet[R][C] : sheet[cols[C] + rr]; | ||||
| 	if(!dense || sheet["!data"][R]) for (var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var val = dense ? (sheet["!data"][R]||[])[C] : sheet[cols[C] + rr]; | ||||
| 		if(val === undefined || val.t === undefined) { | ||||
| 			if(defval === undefined) continue; | ||||
| 			if(hdr[C] != null) { row[hdr[C]] = defval; } | ||||
| @ -12062,16 +12072,16 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) { | ||||
| 	var cols/*:Array<string>*/ = []; | ||||
| 	var out/*:Array<any>*/ = []; | ||||
| 	var outi = 0, counter = 0; | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var R = r.s.r, C = 0; | ||||
| 	var header_cnt = {}; | ||||
| 	if(dense && !sheet[R]) sheet[R] = []; | ||||
| 	if(dense && !sheet["!data"][R]) sheet["!data"][R] = []; | ||||
| 	var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		if(((colinfo[C]||{}).hidden)) continue; | ||||
| 		cols[C] = encode_col(C); | ||||
| 		val = dense ? sheet[R][C] : sheet[cols[C] + rr]; | ||||
| 		val = dense ? sheet["!data"][R][C] : sheet[cols[C] + rr]; | ||||
| 		switch(header) { | ||||
| 			case 1: hdr[C] = C - r.s.c; break; | ||||
| 			case 2: hdr[C] = cols[C]; break; | ||||
| @ -12090,7 +12100,7 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) { | ||||
| 	} | ||||
| 	for (R = r.s.r + offset; R <= r.e.r; ++R) { | ||||
| 		if ((rowinfo[R]||{}).hidden) continue; | ||||
| 		var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o); | ||||
| 		var row = make_json_row(sheet, r, R, cols, header, hdr, o); | ||||
| 		if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row; | ||||
| 	} | ||||
| 	out.length = outi; | ||||
| @ -12101,9 +12111,11 @@ var qreg = /"/g; | ||||
| function make_csv_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, fs/*:number*/, rs/*:number*/, FS/*:string*/, o/*:Sheet2CSVOpts*/)/*:?string*/ { | ||||
| 	var isempty = true; | ||||
| 	var row/*:Array<string>*/ = [], txt = "", rr = encode_row(R); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var datarow = dense && sheet["!data"][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]; | ||||
| 		var val = dense ? datarow[C]: sheet[cols[C] + rr]; | ||||
| 		if(val == null) txt = ""; | ||||
| 		else if(val.v != null) { | ||||
| 			isempty = false; | ||||
| @ -12130,7 +12142,6 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ { | ||||
| 	var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row = "", cols/*:Array<string>*/ = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| @ -12142,7 +12153,6 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ { | ||||
| 		if(o.strip) row = row.replace(endregex,""); | ||||
| 		if(row || (o.blankrows !== false)) out.push((w++ ? RS : "") + row); | ||||
| 	} | ||||
| 	delete o.dense; | ||||
| 	return out.join(""); | ||||
| } | ||||
| 
 | ||||
| @ -12159,13 +12169,13 @@ function sheet_to_formulae(sheet/*:Worksheet*/)/*:Array<string>*/ { | ||||
| 	if(sheet == null || sheet["!ref"] == null) return []; | ||||
| 	var r = safe_decode_range(sheet['!ref']), rr = "", cols/*:Array<string>*/ = [], C; | ||||
| 	var cmds/*:Array<string>*/ = []; | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		rr = encode_row(R); | ||||
| 		for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 			y = cols[C] + rr; | ||||
| 			x = dense ? (sheet[R]||[])[C] : sheet[y]; | ||||
| 			x = dense ? (sheet["!data"][R]||[])[C] : sheet[y]; | ||||
| 			val = ""; | ||||
| 			if(x === undefined) continue; | ||||
| 			else if(x.F != null) { | ||||
| @ -12190,10 +12200,11 @@ function sheet_to_formulae(sheet/*:Worksheet*/)/*:Array<string>*/ { | ||||
| 
 | ||||
| function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet*/ { | ||||
| 	var o = opts || {}; | ||||
| 	var dense = _ws ? Array.isArray(_ws) : o.dense; | ||||
| 	var dense = _ws ? (_ws["!data"] != null) : o.dense; | ||||
| 	if(DENSE != null && dense == null) dense = DENSE; | ||||
| 	var offset = +!o.skipHeader; | ||||
| 	var ws/*:Worksheet*/ = _ws || (dense ? ([]/*:any*/) : ({}/*:any*/)); | ||||
| 	var ws/*:Worksheet*/ = _ws || ({}); | ||||
| 	if(!_ws && dense) ws["!data"] = []; | ||||
| 	var _R = 0, _C = 0; | ||||
| 	if(ws && o.origin != null) { | ||||
| 		if(typeof o.origin == 'number') _R = o.origin; | ||||
| @ -12214,17 +12225,18 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet | ||||
| 	var hdr/*:Array<string>*/ = o.header || [], C = 0; | ||||
| 	var ROW = []; | ||||
| 	js.forEach(function (JS, R/*:number*/) { | ||||
| 		if(dense && !ws[_R + R + offset]) ws[_R + R + offset] = []; | ||||
| 		if(dense) ROW = ws[_R + R + offset]; | ||||
| 		if(dense && !ws["!data"][_R + R + offset]) ws["!data"][_R + R + offset] = []; | ||||
| 		if(dense) ROW = ws["!data"][_R + R + offset]; | ||||
| 		keys(JS).forEach(function(k) { | ||||
| 			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k; | ||||
| 			var v = JS[k]; | ||||
| 			var t = 'z'; | ||||
| 			var z = ""; | ||||
| 			var ref = dense ? "" : encode_cell({c:_C + C,r:_R + R + offset}); | ||||
| 			var ref = dense ? "" : (encode_col(_C + C) + encode_row(_R + R + offset)); | ||||
| 			var cell/*:Cell*/ = dense ? ROW[_C + C] : ws[ref]; | ||||
| 			if(v && typeof v === 'object' && !(v instanceof Date)){ | ||||
| 				ws[ref] = v; | ||||
| 				if(dense) ROW[_C + C] = v; | ||||
| 				else ws[ref] = v; | ||||
| 			} else { | ||||
| 				if(typeof v == 'number') t = 'n'; | ||||
| 				else if(typeof v == 'boolean') t = 'b'; | ||||
| @ -12249,9 +12261,9 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet | ||||
| 	}); | ||||
| 	range.e.c = Math.max(range.e.c, _C + hdr.length - 1); | ||||
| 	var __R = encode_row(_R); | ||||
| 	if(dense && !ws[_R]) ws[_R] = []; | ||||
| 	if(dense && !ws["!data"][_R]) ws["!data"][_R] = []; | ||||
| 	if(offset) for(C = 0; C < hdr.length; ++C) { | ||||
| 		if(dense) ws[_R][C + _C] = {t:'s', v:hdr[C]}; | ||||
| 		if(dense) ws["!data"][_R][C + _C] = {t:'s', v:hdr[C]}; | ||||
| 		else ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]}; | ||||
| 	} | ||||
| 	ws['!ref'] = encode_range(range); | ||||
| @ -12263,18 +12275,17 @@ function json_to_sheet(js/*:Array<any>*/, opts)/*:Worksheet*/ { return sheet_add | ||||
| function ws_get_cell_stub(ws/*:Worksheet*/, R, C/*:?number*/)/*:Cell*/ { | ||||
| 	/* A1 cell address */ | ||||
| 	if(typeof R == "string") { | ||||
| 		/* dense */ | ||||
| 		if(Array.isArray(ws)) { | ||||
| 		if(ws["!data"] != null) { | ||||
| 			var RC = decode_cell(R); | ||||
| 			if(!ws[RC.r]) ws[RC.r] = []; | ||||
| 			return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'}); | ||||
| 			if(!ws["!data"][RC.r]) ws["!data"][RC.r] = []; | ||||
| 			return ws["!data"][RC.r][RC.c] || (ws["!data"][RC.r][RC.c] = {t:'z'}); | ||||
| 		} | ||||
| 		return ws[R] || (ws[R] = {t:'z'}); | ||||
| 	} | ||||
| 	/* cell address object */ | ||||
| 	if(typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R)); | ||||
| 	/* R and C are 0-based indices */ | ||||
| 	return ws_get_cell_stub(ws, encode_cell({r:R,c:C||0})); | ||||
| 	return ws_get_cell_stub(ws, encode_col(C||0) + encode_row(R)); | ||||
| } | ||||
| 
 | ||||
| /* find sheet index for given name / validate index */ | ||||
|  | ||||
							
								
								
									
										187
									
								
								xlsx.mini.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										187
									
								
								xlsx.mini.js
									
									
									
									
									
								
							| @ -1,10 +1,10 @@ | ||||
| /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| /*exported XLSX */ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false, Set:false */ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ | ||||
| var XLSX = {}; | ||||
| function make_xlsx_lib(XLSX){ | ||||
| XLSX.version = '0.18.12'; | ||||
| XLSX.version = '0.19.0'; | ||||
| var current_codepage = 1200, current_ansi = 1252; | ||||
| /*global cptable:true, window */ | ||||
| var $cptable; | ||||
| @ -1607,7 +1607,7 @@ sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs); | ||||
| /** Chains */ | ||||
| var sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz); | ||||
| 
 | ||||
| sector_list[dir_start].name = "!Directory"; | ||||
| if(dir_start < sector_list.length) sector_list[dir_start].name = "!Directory"; | ||||
| if(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT"; | ||||
| sector_list[fat_addrs[0]].name = "!FAT"; | ||||
| sector_list.fat_addrs = fat_addrs; | ||||
| @ -4201,7 +4201,6 @@ function fix_col(cstr) { return cstr.replace(/^([A-Z])/,"$$$1"); } | ||||
| function unfix_col(cstr) { return cstr.replace(/^\$([A-Z])/,"$1"); } | ||||
| 
 | ||||
| function split_cell(cstr) { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); } | ||||
| //function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
 | ||||
| function decode_cell(cstr) { | ||||
| 	var R = 0, C = 0; | ||||
| 	for(var i = 0; i < cstr.length; ++i) { | ||||
| @ -4211,7 +4210,6 @@ function decode_cell(cstr) { | ||||
| 	} | ||||
| 	return { c: C - 1, r:R - 1 }; | ||||
| } | ||||
| //function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }
 | ||||
| function encode_cell(cell) { | ||||
| 	var col = cell.c + 1; | ||||
| 	var s=""; | ||||
| @ -4299,9 +4297,10 @@ function sheet_to_workbook(sheet, opts) { | ||||
| 
 | ||||
| function sheet_add_aoa(_ws, data, opts) { | ||||
| 	var o = opts || {}; | ||||
| 	var dense = _ws ? Array.isArray(_ws) : o.dense; | ||||
| 	var dense = _ws ? (_ws["!data"] != null) : o.dense; | ||||
| 	if(DENSE != null && dense == null) dense = DENSE; | ||||
| 	var ws = _ws || (dense ? ([]) : ({})); | ||||
| 	var ws = _ws || ({}); | ||||
| 	if(dense && !ws["!data"]) ws["!data"] = []; | ||||
| 	var _R = 0, _C = 0; | ||||
| 	if(ws && o.origin != null) { | ||||
| 		if(typeof o.origin == 'number') _R = o.origin; | ||||
| @ -4320,13 +4319,19 @@ function sheet_add_aoa(_ws, data, opts) { | ||||
| 		range.e.r = Math.max(range.e.r, _range.e.r); | ||||
| 		if(_R == -1) range.e.r = _R = _range.e.r + 1; | ||||
| 	} | ||||
| 	var row = []; | ||||
| 	for(var R = 0; R != data.length; ++R) { | ||||
| 		if(!data[R]) continue; | ||||
| 		if(!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays"); | ||||
| 		var __R = _R + R, __Rstr = "" + (__R + 1); | ||||
| 		if(dense) { | ||||
| 			if(!ws["!data"][__R]) ws["!data"][__R] = []; | ||||
| 			row = ws["!data"][__R]; | ||||
| 		} | ||||
| 		for(var C = 0; C != data[R].length; ++C) { | ||||
| 			if(typeof data[R][C] === 'undefined') continue; | ||||
| 			var cell = ({v: data[R][C] }); | ||||
| 			var __R = _R + R, __C = _C + C; | ||||
| 			var __C = _C + C; | ||||
| 			if(range.s.r > __R) range.s.r = __R; | ||||
| 			if(range.s.c > __C) range.s.c = __C; | ||||
| 			if(range.e.r < __R) range.e.r = __R; | ||||
| @ -4350,11 +4355,10 @@ function sheet_add_aoa(_ws, data, opts) { | ||||
| 				else cell.t = 's'; | ||||
| 			} | ||||
| 			if(dense) { | ||||
| 				if(!ws[__R]) ws[__R] = []; | ||||
| 				if(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z; | ||||
| 				ws[__R][__C] = cell; | ||||
| 				if(row[__C] && row[__C].z) cell.z = row[__C].z; | ||||
| 				row[__C] = cell; | ||||
| 			} else { | ||||
| 				var cell_ref = encode_cell(({c:__C,r:__R})); | ||||
| 				var cell_ref = encode_col(__C) + __Rstr; | ||||
| 				if(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z; | ||||
| 				ws[cell_ref] = cell; | ||||
| 			} | ||||
| @ -5779,6 +5783,7 @@ function sheet_to_dbf(ws, opts) { | ||||
| 				case 'N': | ||||
| 					var _n = "0"; | ||||
| 					if(typeof data[i][j] == "number") _n = data[i][j].toFixed(coldecimals[j]||0); | ||||
| 					if(_n.length > colwidths[j]) _n = _n.slice(0, colwidths[j]); // addresses decimal > width
 | ||||
| 					for(hcnt=0; hcnt < colwidths[j]-_n.length; ++hcnt) rout.write_shift(1, 0x20); | ||||
| 					rout.write_shift(1, _n, "sbcs"); | ||||
| 					break; | ||||
| @ -6042,7 +6047,7 @@ var SYLK = (function() { | ||||
| 		/* TODO: codepage */ | ||||
| 		var preamble = ["ID;PSheetJS;N;E"], o = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		var RS = "\r\n"; | ||||
| 		var d1904 = (((wb||{}).Workbook||{}).WBProps||{}).date1904; | ||||
| 
 | ||||
| @ -6054,10 +6059,10 @@ var SYLK = (function() { | ||||
| 		preamble.push("B;Y" + (r.e.r - r.s.r + 1) + ";X" + (r.e.c - r.s.c + 1) + ";D" + [r.s.c,r.s.r,r.e.c,r.e.r].join(" ")); | ||||
| 		preamble.push("O;L;D;B" + (d1904 ? ";V4" : "") + ";K47;G100 0.001"); | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			if(dense && !ws["!data"][R]) continue; | ||||
| 			var p = []; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 				cell = dense ? ws["!data"][R][C] : ws[encode_col(C) + encode_row(R)]; | ||||
| 				if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; | ||||
| 				p.push(write_ws_cell_sylk(cell, ws, R, C, opts)); // TODO: pass date1904 info
 | ||||
| 			} | ||||
| @ -6130,7 +6135,7 @@ var DIF = (function() { | ||||
| 	function sheet_to_dif(ws) { | ||||
| 		var _DIF_XL = DIF_XL; | ||||
| 		var r = safe_decode_range(ws['!ref']); | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		var o = [ | ||||
| 			"TABLE\r\n0,1\r\n\"sheetjs\"\r\n", | ||||
| 			"VECTORS\r\n0," + (r.e.r - r.s.r + 1) + "\r\n\"\"\r\n", | ||||
| @ -6138,9 +6143,10 @@ var DIF = (function() { | ||||
| 			"DATA\r\n0,0\r\n\"\"\r\n" | ||||
| 		]; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			var row = dense ? ws["!data"][R] : []; | ||||
| 			var p = "-1,0\r\nBOT\r\n"; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var cell = dense ? (ws[R] && ws[R][C]) : ws[encode_cell({r:R,c:C})]; | ||||
| 				var cell = dense ? (row && row[C]) : ws[encode_cell({r:R,c:C})]; | ||||
| 				if(cell == null) { p +=("1,0\r\n\"\"\r\n"); continue;} | ||||
| 				switch(cell.t) { | ||||
| 					case 'n': | ||||
| @ -6235,11 +6241,11 @@ var ETH = (function() { | ||||
| 		if(!ws || !ws['!ref']) return ""; | ||||
| 		var o = [], oo = [], cell, coord = ""; | ||||
| 		var r = decode_range(ws['!ref']); | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null || cell.t === 'z') continue; | ||||
| 				oo = ["cell", coord, 't']; | ||||
| 				switch(cell.t) { | ||||
| @ -6361,7 +6367,8 @@ var PRN = (function() { | ||||
| 		var o = opts || {}; | ||||
| 		var sep = ""; | ||||
| 		if(DENSE != null && o.dense == null) o.dense = DENSE; | ||||
| 		var ws = o.dense ? ([]) : ({}); | ||||
| 		var ws = ({}); | ||||
| 		if(o.dense) ws["!data"] = []; | ||||
| 		var range = ({s: {c:0, r:0}, e: {c:0, r:0}}); | ||||
| 
 | ||||
| 		if(str.slice(0,4) == "sep=") { | ||||
| @ -6407,7 +6414,7 @@ var PRN = (function() { | ||||
| 				cell.v = s; | ||||
| 			} | ||||
| 			if(cell.t == 'z'){} | ||||
| 			else if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; } | ||||
| 			else if(o.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = cell; } | ||||
| 			else ws[encode_cell({c:C,r:R})] = cell; | ||||
| 			start = end+1; startcc = str.charCodeAt(start); | ||||
| 			if(range.e.c < C) range.e.c = C; | ||||
| @ -6463,12 +6470,12 @@ var PRN = (function() { | ||||
| 	function sheet_to_prn(ws) { | ||||
| 		var o = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 			var oo = []; | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 				cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 				if(!cell || cell.v == null) { oo.push("          "); continue; } | ||||
| 				var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10); | ||||
| 				while(w.length < 10) w += " "; | ||||
| @ -7781,17 +7788,17 @@ function write_vml_comment(x, _shapeid) { | ||||
| 	].join(""); | ||||
| } | ||||
| function sheet_insert_comments(sheet, comments, threaded, people) { | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var cell; | ||||
| 	comments.forEach(function(comment) { | ||||
| 		var r = decode_cell(comment.ref); | ||||
| 		if(dense) { | ||||
| 			if(!sheet[r.r]) sheet[r.r] = []; | ||||
| 			cell = sheet[r.r][r.c]; | ||||
| 			if(!sheet["!data"][r.r]) sheet["!data"][r.r] = []; | ||||
| 			cell = sheet["!data"][r.r][r.c]; | ||||
| 		} else cell = sheet[comment.ref]; | ||||
| 		if (!cell) { | ||||
| 			cell = ({t:"z"}); | ||||
| 			if(dense) sheet[r.r][r.c] = cell; | ||||
| 			if(dense) sheet["!data"][r.r][r.c] = cell; | ||||
| 			else sheet[comment.ref] = cell; | ||||
| 			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1"); | ||||
| 			if(range.s.r > r.r) range.s.r = r.r; | ||||
| @ -7799,7 +7806,7 @@ function sheet_insert_comments(sheet, comments, threaded, people) { | ||||
| 			if(range.s.c > r.c) range.s.c = r.c; | ||||
| 			if(range.e.c < r.c) range.e.c = r.c; | ||||
| 			var encoded = encode_range(range); | ||||
| 			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded; | ||||
| 			sheet["!ref"] = encoded; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!cell.c) cell.c = []; | ||||
| @ -7817,7 +7824,6 @@ function sheet_insert_comments(sheet, comments, threaded, people) { | ||||
| 		cell.c.push(o); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| /* 18.7 Comments */ | ||||
| function parse_comments_xml(data, opts) { | ||||
| 	/* 18.7.6 CT_Comments */ | ||||
| @ -8275,7 +8281,7 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) { | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 
 | ||||
| 	/* 18.3.1.99 worksheet CT_Worksheet */ | ||||
| 	var s = opts.dense ? ([]) : ({}); | ||||
| 	var s = ({}); if(opts.dense) s["!data"] = []; | ||||
| 	var refguess = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} }); | ||||
| 
 | ||||
| 	var data1 = "", data2 = ""; | ||||
| @ -8404,7 +8410,7 @@ function write_ws_xml_protection(sp) { | ||||
| } | ||||
| 
 | ||||
| function parse_ws_xml_hlinks(s, data, rels) { | ||||
| 	var dense = Array.isArray(s); | ||||
| 	var dense = s["!data"] != null; | ||||
| 	for(var i = 0; i != data.length; ++i) { | ||||
| 		var val = parsexmltag(utf8read(data[i]), true); | ||||
| 		if(!val.ref) return; | ||||
| @ -8420,11 +8426,11 @@ function parse_ws_xml_hlinks(s, data, rels) { | ||||
| 		if(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; } | ||||
| 		var rng = safe_decode_range(val.ref); | ||||
| 		for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) { | ||||
| 			var addr = encode_cell({c:C,r:R}); | ||||
| 			var addr = encode_col(C) + encode_row(R); | ||||
| 			if(dense) { | ||||
| 				if(!s[R]) s[R] = []; | ||||
| 				if(!s[R][C]) s[R][C] = {t:"z",v:undefined}; | ||||
| 				s[R][C].l = val; | ||||
| 				if(!s["!data"][R]) s["!data"][R] = []; | ||||
| 				if(!s["!data"][R][C]) s["!data"][R][C] = {t:"z",v:undefined}; | ||||
| 				s["!data"][R][C].l = val; | ||||
| 			} else { | ||||
| 				if(!s[addr]) s[addr] = {t:"z",v:undefined}; | ||||
| 				s[addr].l = val; | ||||
| @ -8576,7 +8582,7 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) { | ||||
| 	var do_format = Array.isArray(styles.CellXf), cf; | ||||
| 	var arrayf = []; | ||||
| 	var sharedf = []; | ||||
| 	var dense = Array.isArray(s); | ||||
| 	var dense = s["!data"] != null; | ||||
| 	var rows = [], rowobj = {}, rowrite = false; | ||||
| 	var sheetStubs = !!opts.sheetStubs; | ||||
| 	for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) { | ||||
| @ -8741,8 +8747,8 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) { | ||||
| 			} | ||||
| 			if(dense) { | ||||
| 				var _r = decode_cell(tag.r); | ||||
| 				if(!s[_r.r]) s[_r.r] = []; | ||||
| 				s[_r.r][_r.c] = p; | ||||
| 				if(!s["!data"][_r.r]) s["!data"][_r.r] = []; | ||||
| 				s["!data"][_r.r][_r.c] = p; | ||||
| 			} else s[tag.r] = p; | ||||
| 		} | ||||
| 	} | ||||
| @ -8751,7 +8757,7 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) { | ||||
| 
 | ||||
| function write_ws_xml_data(ws, opts, idx, wb) { | ||||
| 	var o = [], r = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols = [], R=0, C=0, rows = ws['!rows']; | ||||
| 	var dense = Array.isArray(ws); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var params = ({r:rr}), row, height = -1; | ||||
| 	for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(R = range.s.r; R <= range.e.r; ++R) { | ||||
| @ -8759,7 +8765,7 @@ function write_ws_xml_data(ws, opts, idx, wb) { | ||||
| 		rr = encode_row(R); | ||||
| 		for(C = range.s.c; C <= range.e.c; ++C) { | ||||
| 			ref = cols[C] + rr; | ||||
| 			var _cell = dense ? (ws[R]||[])[C]: ws[ref]; | ||||
| 			var _cell = dense ? (ws["!data"][R]||[])[C]: ws[ref]; | ||||
| 			if(_cell === undefined) continue; | ||||
| 			if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); | ||||
| 		} | ||||
| @ -8948,7 +8954,10 @@ function parse_chart(data, name, opts, rels, wb, csheet) { | ||||
| 		refguess.e.c = C; | ||||
| 		col = encode_col(C); | ||||
| 		cache[0].forEach(function(n,i) { | ||||
| 			cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] }; | ||||
| 			if(cs["!data"]) { | ||||
| 				if(!cs["!data"][i]) cs["!data"][i] = []; | ||||
| 				cs["!data"][i][C] = {t:'n', v:n, z:cache[1] }; | ||||
| 			} else cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] }; | ||||
| 			R = i; | ||||
| 		}); | ||||
| 		if(refguess.e.r < R) refguess.e.r = R; | ||||
| @ -9442,8 +9451,8 @@ function parse_xlmeta(data, name, opts) { | ||||
| /* note: browser DOM element cannot see mso- style attrs, must parse */ | ||||
| function html_to_sheet(str, _opts) { | ||||
| 	var opts = _opts || {}; | ||||
| 	if(DENSE != null && opts.dense == null) opts.dense = DENSE; | ||||
| 	var ws = opts.dense ? ([]) : ({}); | ||||
| 	var dense = (opts.dense != null) ? opts.dense : DENSE; | ||||
| 	var ws = ({}); if(dense) ws["!data"] = []; | ||||
| 	str = str.replace(/<!--.*?-->/g, ""); | ||||
| 	var mtch = str.match(/<table/i); | ||||
| 	if(!mtch) throw new Error("Invalid HTML: could not find <table>"); | ||||
| @ -9489,7 +9498,7 @@ function html_to_sheet(str, _opts) { | ||||
| 				if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}); | ||||
| 				o.z = opts.dateNF || table_fmt[14]; | ||||
| 			} | ||||
| 			if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; } | ||||
| 			if(dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = o; } | ||||
| 			else ws[encode_cell({r:R, c:C})] = o; | ||||
| 			C += CS; | ||||
| 		} | ||||
| @ -9502,6 +9511,7 @@ function make_html_row(ws, r, R, o) { | ||||
| 	var M = (ws['!merges'] ||[]); | ||||
| 	var oo = []; | ||||
| 	var sp = ({}); | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var RS = 0, CS = 0; | ||||
| 		for(var j = 0; j < M.length; ++j) { | ||||
| @ -9511,8 +9521,8 @@ function make_html_row(ws, r, R, o) { | ||||
| 			RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break; | ||||
| 		} | ||||
| 		if(RS < 0) continue; | ||||
| 		var coord = encode_cell({r:R,c:C}); | ||||
| 		var cell = o.dense ? (ws[R]||[])[C] : ws[coord]; | ||||
| 		var coord = encode_col(C) + encode_row(R); | ||||
| 		var cell = dense ? (ws["!data"][R]||[])[C] : ws[coord]; | ||||
| 		/* TODO: html entities */ | ||||
| 		var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || ""; | ||||
| 		sp = ({}); | ||||
| @ -9560,7 +9570,6 @@ function sheet_to_html(ws, opts/*, wb:?Workbook*/) { | ||||
| 	var footer = o.footer != null ? o.footer : HTML_END; | ||||
| 	var out = [header]; | ||||
| 	var r = decode_range(ws['!ref']); | ||||
| 	o.dense = Array.isArray(ws); | ||||
| 	out.push(make_html_preamble(ws, r, o)); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o)); | ||||
| 	out.push("</table>" + footer); | ||||
| @ -9575,7 +9584,7 @@ function sheet_add_dom(ws, table, _opts) { | ||||
| 	} | ||||
| 
 | ||||
| 	var opts = _opts || {}; | ||||
| 	if(DENSE != null) opts.dense = DENSE; | ||||
| 	var dense = ws["!data"] != null; | ||||
| 	var or_R = 0, or_C = 0; | ||||
| 	if(opts.origin != null) { | ||||
| 		if(typeof opts.origin == 'number') or_R = opts.origin; | ||||
| @ -9640,7 +9649,7 @@ function sheet_add_dom(ws, table, _opts) { | ||||
| 				l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break; | ||||
| 			} | ||||
| 			if(l && l.charAt(0) != "#" &&	l.slice(0, 11).toLowerCase() != 'javascript:') o.l = ({ Target: l }); | ||||
| 			if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; } | ||||
| 			if(dense) { if(!ws["!data"][R + or_R]) ws["!data"][R + or_R] = []; ws["!data"][R + or_R][C + or_C] = o; } | ||||
| 			else ws[encode_cell({c:C + or_C, r:R + or_R})] = o; | ||||
| 			if(range.e.c < C + or_C) range.e.c = C + or_C; | ||||
| 			C += CS; | ||||
| @ -9656,7 +9665,7 @@ function sheet_add_dom(ws, table, _opts) { | ||||
| 
 | ||||
| function parse_dom_table(table, _opts) { | ||||
| 	var opts = _opts || {}; | ||||
| 	var ws = opts.dense ? ([]) : ({}); | ||||
| 	var ws = ({}); if(opts.dense) ws["!data"] = []; | ||||
| 	return sheet_add_dom(ws, table, _opts); | ||||
| } | ||||
| 
 | ||||
| @ -9929,7 +9938,7 @@ function parse_content_xml(d, _opts, _nfm) { | ||||
| 		var sheetag; | ||||
| 		var rowtag; | ||||
| 		var Sheets = {}, SheetNames = []; | ||||
| 		var ws = opts.dense ? ([]) : ({}); | ||||
| 		var ws = ({}); if(opts.dense) ws["!data"] = []; | ||||
| 		var Rn, q; | ||||
| 		var ctag = ({value:""}); | ||||
| 		var textp = "", textpidx = 0, textptag; | ||||
| @ -9973,7 +9982,7 @@ function parse_content_xml(d, _opts, _nfm) { | ||||
| 					sheetag = parsexmltag(Rn[0], false); | ||||
| 					R = C = -1; | ||||
| 					range.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0; | ||||
| 					ws = opts.dense ? ([]) : ({}); merges = []; | ||||
| 					ws = ({}); if(opts.dense) ws["!data"] = []; merges = []; | ||||
| 					rowinfo = []; | ||||
| 					intable = true; | ||||
| 				} | ||||
| @ -9993,7 +10002,7 @@ function parse_content_xml(d, _opts, _nfm) { | ||||
| 			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | ||||
| 				if(Rn[1] !== '/') ++C; | ||||
| 				if(opts.sheetStubs) { | ||||
| 					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; } | ||||
| 					if(opts.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = {t:'z'}; } | ||||
| 					else ws[encode_cell({r:R,c:C})] = {t:'z'}; | ||||
| 				} | ||||
| 				textp = ""; textR = []; | ||||
| @ -10009,10 +10018,10 @@ function parse_content_xml(d, _opts, _nfm) { | ||||
| 					if((ctag['数据类型'] || ctag['value-type']) == "string") { | ||||
| 						q.t = "s"; q.v = unescapexml(ctag['string-value'] || ""); | ||||
| 						if(opts.dense) { | ||||
| 							if(!ws[R]) ws[R] = []; | ||||
| 							ws[R][C] = q; | ||||
| 							if(!ws["!data"][R]) ws["!data"][R] = []; | ||||
| 							ws["!data"][R][C] = q; | ||||
| 						} else { | ||||
| 							ws[encode_cell({r:R,c:C})] = q; | ||||
| 							ws[encode_col(C) + encode_row(R)] = q; | ||||
| 						} | ||||
| 					} | ||||
| 					C+= colpeat-1; | ||||
| @ -10089,9 +10098,9 @@ function parse_content_xml(d, _opts, _nfm) { | ||||
| 							for(var rpt = 0; rpt < rowpeat; ++rpt) { | ||||
| 								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10); | ||||
| 								if(opts.dense) { | ||||
| 									if(!ws[R + rpt]) ws[R + rpt] = []; | ||||
| 									ws[R + rpt][C] = rpt == 0 ? q : dup(q); | ||||
| 									while(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q); | ||||
| 									if(!ws["!data"][R + rpt]) ws["!data"][R + rpt] = []; | ||||
| 									ws["!data"][R + rpt][C] = rpt == 0 ? q : dup(q); | ||||
| 									while(--colpeat > 0) ws["!data"][R + rpt][C + colpeat] = dup(q); | ||||
| 								} else { | ||||
| 									ws[encode_cell({r:R + rpt,c:C})] = q; | ||||
| 									while(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q); | ||||
| @ -10676,7 +10685,7 @@ var write_content_ods = /* @__PURE__ */(function() { | ||||
| 		o.push('      <table:table table:name="' + escapexml(wb.SheetNames[i]) + '" table:style-name="ta1">\n'); | ||||
| 		var R=0,C=0, range = decode_range(ws['!ref']||"A1"); | ||||
| 		var marr = ws['!merges'] || [], mi = 0; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var dense = ws["!data"] != null; | ||||
| 		if(ws["!cols"]) { | ||||
| 			for(C = 0; C <= range.e.c; ++C) o.push('        <table:table-column' + (ws["!cols"][C] ? ' table:style-name="co' + ws["!cols"][C].ods + '"' : '') + '></table:table-column>\n'); | ||||
| 		} | ||||
| @ -10702,7 +10711,7 @@ var write_content_ods = /* @__PURE__ */(function() { | ||||
| 					break; | ||||
| 				} | ||||
| 				if(skip) { o.push(covered_cell_xml); continue; } | ||||
| 				var ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref]; | ||||
| 				var ref = encode_cell({r:R, c:C}), cell = dense ? (ws["!data"][R]||[])[C]: ws[ref]; | ||||
| 				if(cell && cell.f) { | ||||
| 					ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f)); | ||||
| 					if(cell.F) { | ||||
| @ -10812,9 +10821,10 @@ var write_content_ods = /* @__PURE__ */(function() { | ||||
| 		var nfi = 69; | ||||
| 		wb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) { | ||||
| 			if(!ws) return; | ||||
| 			var dense = (ws["!data"] != null); | ||||
| 			var range = decode_range(ws["!ref"]); | ||||
| 			for(var R = 0; R <= range.e.r; ++R) for(var C = 0; C <= range.e.c; ++C) { | ||||
| 				var c = Array.isArray(ws) ? (ws[R]||[])[C] : ws[encode_cell({r:R,c:C})]; | ||||
| 				var c = dense ? (ws["!data"][R]||[])[C] : ws[encode_cell({r:R,c:C})]; | ||||
| 				if(!c || !c.z || c.z.toLowerCase() == "general") continue; | ||||
| 				if(!nfs[c.z]) { | ||||
| 					var out = write_number_format_ods(c.z, "N" + nfi); | ||||
| @ -11904,17 +11914,17 @@ function writeFileAsync(filename, wb, opts, cb) { | ||||
| 	var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts); | ||||
| 	return _fs.writeFile(filename, writeSync(wb, o), _cb); | ||||
| } | ||||
| function make_json_row(sheet, r, R, cols, header, hdr, dense, o) { | ||||
| function make_json_row(sheet, r, R, cols, header, hdr, o) { | ||||
| 	var rr = encode_row(R); | ||||
| 	var defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw"); | ||||
| 	var isempty = true; | ||||
| 	var isempty = true, dense = (sheet["!data"] != null); | ||||
| 	var row = (header === 1) ? [] : {}; | ||||
| 	if(header !== 1) { | ||||
| 		if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; } | ||||
| 		else row.__rowNum__ = R; | ||||
| 	} | ||||
| 	if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var val = dense ? sheet[R][C] : sheet[cols[C] + rr]; | ||||
| 	if(!dense || sheet["!data"][R]) for (var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		var val = dense ? (sheet["!data"][R]||[])[C] : sheet[cols[C] + rr]; | ||||
| 		if(val === undefined || val.t === undefined) { | ||||
| 			if(defval === undefined) continue; | ||||
| 			if(hdr[C] != null) { row[hdr[C]] = defval; } | ||||
| @ -11963,16 +11973,16 @@ function sheet_to_json(sheet, opts) { | ||||
| 	var cols = []; | ||||
| 	var out = []; | ||||
| 	var outi = 0, counter = 0; | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	var R = r.s.r, C = 0; | ||||
| 	var header_cnt = {}; | ||||
| 	if(dense && !sheet[R]) sheet[R] = []; | ||||
| 	if(dense && !sheet["!data"][R]) sheet["!data"][R] = []; | ||||
| 	var colinfo = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 		if(((colinfo[C]||{}).hidden)) continue; | ||||
| 		cols[C] = encode_col(C); | ||||
| 		val = dense ? sheet[R][C] : sheet[cols[C] + rr]; | ||||
| 		val = dense ? sheet["!data"][R][C] : sheet[cols[C] + rr]; | ||||
| 		switch(header) { | ||||
| 			case 1: hdr[C] = C - r.s.c; break; | ||||
| 			case 2: hdr[C] = cols[C]; break; | ||||
| @ -11991,7 +12001,7 @@ function sheet_to_json(sheet, opts) { | ||||
| 	} | ||||
| 	for (R = r.s.r + offset; R <= r.e.r; ++R) { | ||||
| 		if ((rowinfo[R]||{}).hidden) continue; | ||||
| 		var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o); | ||||
| 		var row = make_json_row(sheet, r, R, cols, header, hdr, o); | ||||
| 		if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row; | ||||
| 	} | ||||
| 	out.length = outi; | ||||
| @ -12002,9 +12012,11 @@ 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 dense = sheet["!data"] != null; | ||||
| 	var datarow = dense && sheet["!data"][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]; | ||||
| 		var val = dense ? datarow[C]: sheet[cols[C] + rr]; | ||||
| 		if(val == null) txt = ""; | ||||
| 		else if(val.v != null) { | ||||
| 			isempty = false; | ||||
| @ -12031,7 +12043,6 @@ function sheet_to_csv(sheet, opts) { | ||||
| 	var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); | ||||
| 	var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); | ||||
| 	var row = "", cols = []; | ||||
| 	o.dense = Array.isArray(sheet); | ||||
| 	var colinfo = o.skipHidden && sheet["!cols"] || []; | ||||
| 	var rowinfo = o.skipHidden && sheet["!rows"] || []; | ||||
| 	for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C); | ||||
| @ -12043,7 +12054,6 @@ function sheet_to_csv(sheet, opts) { | ||||
| 		if(o.strip) row = row.replace(endregex,""); | ||||
| 		if(row || (o.blankrows !== false)) out.push((w++ ? RS : "") + row); | ||||
| 	} | ||||
| 	delete o.dense; | ||||
| 	return out.join(""); | ||||
| } | ||||
| 
 | ||||
| @ -12060,13 +12070,13 @@ function sheet_to_formulae(sheet) { | ||||
| 	if(sheet == null || sheet["!ref"] == null) return []; | ||||
| 	var r = safe_decode_range(sheet['!ref']), rr = "", cols = [], C; | ||||
| 	var cmds = []; | ||||
| 	var dense = Array.isArray(sheet); | ||||
| 	var dense = sheet["!data"] != null; | ||||
| 	for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); | ||||
| 	for(var R = r.s.r; R <= r.e.r; ++R) { | ||||
| 		rr = encode_row(R); | ||||
| 		for(C = r.s.c; C <= r.e.c; ++C) { | ||||
| 			y = cols[C] + rr; | ||||
| 			x = dense ? (sheet[R]||[])[C] : sheet[y]; | ||||
| 			x = dense ? (sheet["!data"][R]||[])[C] : sheet[y]; | ||||
| 			val = ""; | ||||
| 			if(x === undefined) continue; | ||||
| 			else if(x.F != null) { | ||||
| @ -12091,10 +12101,11 @@ function sheet_to_formulae(sheet) { | ||||
| 
 | ||||
| function sheet_add_json(_ws, js, opts) { | ||||
| 	var o = opts || {}; | ||||
| 	var dense = _ws ? Array.isArray(_ws) : o.dense; | ||||
| 	var dense = _ws ? (_ws["!data"] != null) : o.dense; | ||||
| 	if(DENSE != null && dense == null) dense = DENSE; | ||||
| 	var offset = +!o.skipHeader; | ||||
| 	var ws = _ws || (dense ? ([]) : ({})); | ||||
| 	var ws = _ws || ({}); | ||||
| 	if(!_ws && dense) ws["!data"] = []; | ||||
| 	var _R = 0, _C = 0; | ||||
| 	if(ws && o.origin != null) { | ||||
| 		if(typeof o.origin == 'number') _R = o.origin; | ||||
| @ -12115,17 +12126,18 @@ function sheet_add_json(_ws, js, opts) { | ||||
| 	var hdr = o.header || [], C = 0; | ||||
| 	var ROW = []; | ||||
| 	js.forEach(function (JS, R) { | ||||
| 		if(dense && !ws[_R + R + offset]) ws[_R + R + offset] = []; | ||||
| 		if(dense) ROW = ws[_R + R + offset]; | ||||
| 		if(dense && !ws["!data"][_R + R + offset]) ws["!data"][_R + R + offset] = []; | ||||
| 		if(dense) ROW = ws["!data"][_R + R + offset]; | ||||
| 		keys(JS).forEach(function(k) { | ||||
| 			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k; | ||||
| 			var v = JS[k]; | ||||
| 			var t = 'z'; | ||||
| 			var z = ""; | ||||
| 			var ref = dense ? "" : encode_cell({c:_C + C,r:_R + R + offset}); | ||||
| 			var ref = dense ? "" : (encode_col(_C + C) + encode_row(_R + R + offset)); | ||||
| 			var cell = dense ? ROW[_C + C] : ws[ref]; | ||||
| 			if(v && typeof v === 'object' && !(v instanceof Date)){ | ||||
| 				ws[ref] = v; | ||||
| 				if(dense) ROW[_C + C] = v; | ||||
| 				else ws[ref] = v; | ||||
| 			} else { | ||||
| 				if(typeof v == 'number') t = 'n'; | ||||
| 				else if(typeof v == 'boolean') t = 'b'; | ||||
| @ -12150,9 +12162,9 @@ function sheet_add_json(_ws, js, opts) { | ||||
| 	}); | ||||
| 	range.e.c = Math.max(range.e.c, _C + hdr.length - 1); | ||||
| 	var __R = encode_row(_R); | ||||
| 	if(dense && !ws[_R]) ws[_R] = []; | ||||
| 	if(dense && !ws["!data"][_R]) ws["!data"][_R] = []; | ||||
| 	if(offset) for(C = 0; C < hdr.length; ++C) { | ||||
| 		if(dense) ws[_R][C + _C] = {t:'s', v:hdr[C]}; | ||||
| 		if(dense) ws["!data"][_R][C + _C] = {t:'s', v:hdr[C]}; | ||||
| 		else ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]}; | ||||
| 	} | ||||
| 	ws['!ref'] = encode_range(range); | ||||
| @ -12164,18 +12176,17 @@ function json_to_sheet(js, opts) { return sheet_add_json(null, js, opts); } | ||||
| function ws_get_cell_stub(ws, R, C) { | ||||
| 	/* A1 cell address */ | ||||
| 	if(typeof R == "string") { | ||||
| 		/* dense */ | ||||
| 		if(Array.isArray(ws)) { | ||||
| 		if(ws["!data"] != null) { | ||||
| 			var RC = decode_cell(R); | ||||
| 			if(!ws[RC.r]) ws[RC.r] = []; | ||||
| 			return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'}); | ||||
| 			if(!ws["!data"][RC.r]) ws["!data"][RC.r] = []; | ||||
| 			return ws["!data"][RC.r][RC.c] || (ws["!data"][RC.r][RC.c] = {t:'z'}); | ||||
| 		} | ||||
| 		return ws[R] || (ws[R] = {t:'z'}); | ||||
| 	} | ||||
| 	/* cell address object */ | ||||
| 	if(typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R)); | ||||
| 	/* R and C are 0-based indices */ | ||||
| 	return ws_get_cell_stub(ws, encode_cell({r:R,c:C||0})); | ||||
| 	return ws_get_cell_stub(ws, encode_col(C||0) + encode_row(R)); | ||||
| } | ||||
| 
 | ||||
| /* find sheet index for given name / validate index */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user