| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | (function(utils) { | 
					
						
							|  |  |  | utils.consts = utils.consts || {}; | 
					
						
							| 
									
										
										
										
											2017-05-13 18:21:22 +00:00
										 |  |  | function add_consts(R/*Array<any>*/) { R.forEach(function(a){ utils.consts[a[0]] = a[1]; }); } | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-13 18:21:22 +00:00
										 |  |  | function get_default(x/*:any*/, y/*:any*/, z/*:any*/)/*:any*/ { return x[y] != null ? x[y] : (x[y] = z); } | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* get cell, creating a stub if necessary */ | 
					
						
							|  |  |  | function ws_get_cell_stub(ws/*:Worksheet*/, R, C/*:?number*/)/*:Cell*/ { | 
					
						
							|  |  |  | 	/* A1 cell address */ | 
					
						
							| 
									
										
										
										
											2019-11-01 03:09:14 +00:00
										 |  |  | 	if(typeof R == "string") { | 
					
						
							|  |  |  | 		/* dense */ | 
					
						
							|  |  |  | 		if(Array.isArray(ws)) { | 
					
						
							|  |  |  | 			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'}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return ws[R] || (ws[R] = {t:'z'}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 	/* cell address object */ | 
					
						
							|  |  |  | 	if(typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R)); | 
					
						
							|  |  |  | 	/* R and C are 0-based indices */ | 
					
						
							| 
									
										
										
										
											2017-05-13 18:21:22 +00:00
										 |  |  | 	return ws_get_cell_stub(ws, encode_cell({r:R,c:C||0})); | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-11-01 03:09:14 +00:00
										 |  |  | utils.sheet_get_cell = ws_get_cell_stub; | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* find sheet index for given name / validate index */ | 
					
						
							|  |  |  | function wb_sheet_idx(wb/*:Workbook*/, sh/*:number|string*/) { | 
					
						
							|  |  |  | 	if(typeof sh == "number") { | 
					
						
							|  |  |  | 		if(sh >= 0 && wb.SheetNames.length > sh) return sh; | 
					
						
							|  |  |  | 		throw new Error("Cannot find sheet # " + sh); | 
					
						
							|  |  |  | 	} else if(typeof sh == "string") { | 
					
						
							|  |  |  | 		var idx = wb.SheetNames.indexOf(sh); | 
					
						
							|  |  |  | 		if(idx > -1) return idx; | 
					
						
							|  |  |  | 		throw new Error("Cannot find sheet name |" + sh + "|"); | 
					
						
							|  |  |  | 	} else throw new Error("Cannot find sheet |" + sh + "|"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* simple blank workbook object */ | 
					
						
							|  |  |  | utils.book_new = function()/*:Workbook*/ { | 
					
						
							|  |  |  | 	return { SheetNames: [], Sheets: {} }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* add a worksheet to the end of a given workbook */ | 
					
						
							|  |  |  | utils.book_append_sheet = function(wb/*:Workbook*/, ws/*:Worksheet*/, name/*:?string*/) { | 
					
						
							| 
									
										
										
										
											2020-08-02 01:02:42 +00:00
										 |  |  | 	if(!name) for(var i = 1; i <= 0xFFFF; ++i, name = undefined) if(wb.SheetNames.indexOf(name = "Sheet" + i) == -1) break; | 
					
						
							|  |  |  | 	if(!name || wb.SheetNames.length >= 0xFFFF) throw new Error("Too many worksheets"); | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 	check_ws_name(name); | 
					
						
							|  |  |  | 	if(wb.SheetNames.indexOf(name) >= 0) throw new Error("Worksheet with name |" + name + "| already exists!"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	wb.SheetNames.push(name); | 
					
						
							|  |  |  | 	wb.Sheets[name] = ws; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* set sheet visibility (visible/hidden/very hidden) */ | 
					
						
							|  |  |  | utils.book_set_sheet_visibility = function(wb/*:Workbook*/, sh/*:number|string*/, vis/*:number*/) { | 
					
						
							|  |  |  | 	get_default(wb,"Workbook",{}); | 
					
						
							|  |  |  | 	get_default(wb.Workbook,"Sheets",[]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var idx = wb_sheet_idx(wb, sh); | 
					
						
							| 
									
										
										
										
											2017-05-13 18:21:22 +00:00
										 |  |  | 	// $FlowIgnore
 | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 	get_default(wb.Workbook.Sheets,idx, {}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch(vis) { | 
					
						
							|  |  |  | 		case 0: case 1: case 2: break; | 
					
						
							|  |  |  | 		default: throw new Error("Bad sheet visibility setting " + vis); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-05-13 18:21:22 +00:00
										 |  |  | 	// $FlowIgnore
 | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 	wb.Workbook.Sheets[idx].Hidden = vis; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | add_consts([ | 
					
						
							|  |  |  | 	["SHEET_VISIBLE", 0], | 
					
						
							|  |  |  | 	["SHEET_HIDDEN", 1], | 
					
						
							|  |  |  | 	["SHEET_VERY_HIDDEN", 2] | 
					
						
							|  |  |  | ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* set number format */ | 
					
						
							|  |  |  | utils.cell_set_number_format = function(cell/*:Cell*/, fmt/*:string|number*/) { | 
					
						
							|  |  |  | 	cell.z = fmt; | 
					
						
							|  |  |  | 	return cell; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* set cell hyperlink */ | 
					
						
							|  |  |  | utils.cell_set_hyperlink = function(cell/*:Cell*/, target/*:string*/, tooltip/*:?string*/) { | 
					
						
							|  |  |  | 	if(!target) { | 
					
						
							|  |  |  | 		delete cell.l; | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-05-13 18:21:22 +00:00
										 |  |  | 		cell.l = ({ Target: target }/*:Hyperlink*/); | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 		if(tooltip) cell.l.Tooltip = tooltip; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return cell; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-12-15 01:18:40 +00:00
										 |  |  | utils.cell_set_internal_link = function(cell/*:Cell*/, range/*:string*/, tooltip/*:?string*/) { return utils.cell_set_hyperlink(cell, "#" + range, tooltip); }; | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* add to cell comments */ | 
					
						
							|  |  |  | utils.cell_add_comment = function(cell/*:Cell*/, text/*:string*/, author/*:?string*/) { | 
					
						
							|  |  |  | 	if(!cell.c) cell.c = []; | 
					
						
							|  |  |  | 	cell.c.push({t:text, a:author||"SheetJS"}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* set array formula and flush related cells */ | 
					
						
							|  |  |  | utils.sheet_set_array_formula = function(ws/*:Worksheet*/, range, formula/*:string*/) { | 
					
						
							|  |  |  | 	var rng = typeof range != "string" ? range : safe_decode_range(range); | 
					
						
							|  |  |  | 	var rngstr = typeof range == "string" ? range : encode_range(range); | 
					
						
							|  |  |  | 	for(var R = rng.s.r; R <= rng.e.r; ++R) for(var C = rng.s.c; C <= rng.e.c; ++C) { | 
					
						
							|  |  |  | 		var cell = ws_get_cell_stub(ws, R, C); | 
					
						
							|  |  |  | 		cell.t = 'n'; | 
					
						
							|  |  |  | 		cell.F = rngstr; | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  | 		delete cell.v; | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 		if(R == rng.s.r && C == rng.s.c) cell.f = formula; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return ws; | 
					
						
							| 
									
										
										
										
											2017-05-11 18:23:21 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-05-11 07:29:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | return utils; | 
					
						
							|  |  |  | })(utils); | 
					
						
							|  |  |  | 
 |