| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | /* [MS-XLSB] 2.4.718 BrtRowHdr */ | 
					
						
							|  |  |  | var parse_BrtRowHdr = function(data, length) { | 
					
						
							|  |  |  | 	var z = {}; | 
					
						
							|  |  |  | 	z.r = data.read_shift(4); | 
					
						
							|  |  |  | 	data.l += length-4; | 
					
						
							|  |  |  | 	return z; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.4.812 BrtWsDim */ | 
					
						
							|  |  |  | var parse_BrtWsDim = parse_UncheckedRfX; | 
					
						
							| 
									
										
										
										
											2014-05-29 22:30:03 +00:00
										 |  |  | var write_BrtWsDim = write_UncheckedRfX; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.4.815 BrtWsProp */ | 
					
						
							|  |  |  | var parse_BrtWsProp = function(data, length) { | 
					
						
							|  |  |  | 	var z = {}; | 
					
						
							|  |  |  | 	/* TODO: pull flags */ | 
					
						
							|  |  |  | 	data.l += 19; | 
					
						
							|  |  |  | 	z.name = parse_CodeName(data, length - 19); | 
					
						
							|  |  |  | 	return z; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | /* [MS-XLSB] 2.4.303 BrtCellBlank */ | 
					
						
							| 
									
										
										
										
											2014-03-29 22:53:15 +00:00
										 |  |  | var parse_BrtCellBlank = function(data, length) { | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	return [cell]; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | /* [MS-XLSB] 2.4.304 BrtCellBool */ | 
					
						
							|  |  |  | var parse_BrtCellBool = function(data, length) { | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var fBool = data.read_shift(1); | 
					
						
							|  |  |  | 	return [cell, fBool, 'b']; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.4.305 BrtCellError */ | 
					
						
							|  |  |  | var parse_BrtCellError = function(data, length) { | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var fBool = data.read_shift(1); | 
					
						
							|  |  |  | 	return [cell, fBool, 'e']; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.4.308 BrtCellIsst */ | 
					
						
							|  |  |  | var parse_BrtCellIsst = function(data, length) { | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var isst = data.read_shift(4); | 
					
						
							|  |  |  | 	return [cell, isst, 's']; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.4.310 BrtCellReal */ | 
					
						
							|  |  |  | var parse_BrtCellReal = function(data, length) { | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var value = parse_Xnum(data); | 
					
						
							|  |  |  | 	return [cell, value, 'n']; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.4.311 BrtCellRk */ | 
					
						
							|  |  |  | var parse_BrtCellRk = function(data, length) { | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var value = parse_RkNumber(data); | 
					
						
							|  |  |  | 	return [cell, value, 'n']; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | /* [MS-XLSB] 2.4.314 BrtCellSt */ | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | var parse_BrtCellSt = function(data, length) { | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var value = parse_XLWideString(data); | 
					
						
							|  |  |  | 	return [cell, value, 'str']; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | /* [MS-XLSB] 2.4.647 BrtFmlaBool */ | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | var parse_BrtFmlaBool = function(data, length, opts) { | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var value = data.read_shift(1); | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 	var o = [cell, value, 'b']; | 
					
						
							|  |  |  | 	if(opts.cellFormula) { | 
					
						
							|  |  |  | 		var formula = parse_CellParsedFormula(data, length-9); | 
					
						
							|  |  |  | 		o[3] = ""; /* TODO */ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else data.l += length-9; | 
					
						
							|  |  |  | 	return o; | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-29 06:00:09 +00:00
										 |  |  | /* [MS-XLSB] 2.4.648 BrtFmlaError */ | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | var parse_BrtFmlaError = function(data, length, opts) { | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 	var cell = parse_Cell(data); | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 	var value = data.read_shift(1); | 
					
						
							|  |  |  | 	var o = [cell, value, 'e']; | 
					
						
							|  |  |  | 	if(opts.cellFormula) { | 
					
						
							|  |  |  | 		var formula = parse_CellParsedFormula(data, length-9); | 
					
						
							|  |  |  | 		o[3] = ""; /* TODO */ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else data.l += length-9; | 
					
						
							|  |  |  | 	return o; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* [MS-XLSB] 2.4.649 BrtFmlaNum */ | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | var parse_BrtFmlaNum = function(data, length, opts) { | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var value = parse_Xnum(data); | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 	var o = [cell, value, 'n']; | 
					
						
							|  |  |  | 	if(opts.cellFormula) { | 
					
						
							|  |  |  | 		var formula = parse_CellParsedFormula(data, length - 16); | 
					
						
							|  |  |  | 		o[3] = ""; /* TODO */ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else data.l += length-16; | 
					
						
							|  |  |  | 	return o; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | /* [MS-XLSB] 2.4.650 BrtFmlaString */ | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | var parse_BrtFmlaString = function(data, length, opts) { | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 	var start = data.l; | 
					
						
							|  |  |  | 	var cell = parse_Cell(data); | 
					
						
							|  |  |  | 	var value = parse_XLWideString(data); | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 	var o = [cell, value, 'str']; | 
					
						
							|  |  |  | 	if(opts.cellFormula) { | 
					
						
							|  |  |  | 		var formula = parse_CellParsedFormula(data, start + length - data.l); | 
					
						
							|  |  |  | 		o[3] = ""; /* TODO */ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else data.l = start + length; | 
					
						
							|  |  |  | 	return o; | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-23 21:30:00 +00:00
										 |  |  | /* [MS-XLSB] 2.4.676 BrtMergeCell */ | 
					
						
							|  |  |  | var parse_BrtMergeCell = parse_UncheckedRfX; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-15 09:04:03 +00:00
										 |  |  | /* [MS-XLSB] 2.4.656 BrtHLink */ | 
					
						
							|  |  |  | var parse_BrtHLink = function(data, length, opts) { | 
					
						
							|  |  |  | 	var end = data.l + length; | 
					
						
							|  |  |  | 	var rfx = parse_UncheckedRfX(data, 16); | 
					
						
							|  |  |  | 	var relId = parse_XLNullableWideString(data); | 
					
						
							|  |  |  | 	var loc = parse_XLWideString(data); | 
					
						
							|  |  |  | 	var tooltip = parse_XLWideString(data); | 
					
						
							|  |  |  | 	var display = parse_XLWideString(data); | 
					
						
							|  |  |  | 	data.l = end; | 
					
						
							|  |  |  | 	return {rfx:rfx, relId:relId, loc:loc, tooltip:tooltip, display:display}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | /* [MS-XLSB] 2.1.7.61 Worksheet */ | 
					
						
							| 
									
										
										
										
											2014-04-15 09:04:03 +00:00
										 |  |  | var parse_ws_bin = function(data, opts, rels) { | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 	if(!data) return data; | 
					
						
							| 
									
										
										
										
											2014-04-15 09:04:03 +00:00
										 |  |  | 	if(!rels) rels = {'!id':{}}; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 	var s = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var ref; | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | 	var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} }; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | 	var pass = false, end = false; | 
					
						
							| 
									
										
										
										
											2014-04-15 09:04:03 +00:00
										 |  |  | 	var row, p, cf, R, C,addr; | 
					
						
							| 
									
										
										
										
											2014-03-23 21:30:00 +00:00
										 |  |  | 	var mergecells = []; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 	recordhopper(data, function(val, R) { | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | 		if(end) return; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 		switch(R.n) { | 
					
						
							|  |  |  | 			case 'BrtWsDim': ref = val; break; | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | 			case 'BrtRowHdr': | 
					
						
							|  |  |  | 				row = val; | 
					
						
							|  |  |  | 				if(opts.sheetRows && opts.sheetRows <= row.r) end=true; | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 			case 'BrtFmlaBool': | 
					
						
							|  |  |  | 			case 'BrtFmlaError': | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 			case 'BrtFmlaNum': | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 			case 'BrtFmlaString': | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 			case 'BrtCellBool': | 
					
						
							|  |  |  | 			case 'BrtCellError': | 
					
						
							|  |  |  | 			case 'BrtCellIsst': | 
					
						
							|  |  |  | 			case 'BrtCellReal': | 
					
						
							|  |  |  | 			case 'BrtCellRk': | 
					
						
							| 
									
										
										
										
											2014-03-19 17:53:20 +00:00
										 |  |  | 			case 'BrtCellSt': | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 				p = {t:val[2]}; | 
					
						
							|  |  |  | 				switch(val[2]) { | 
					
						
							|  |  |  | 					case 'n': p.v = val[1]; break; | 
					
						
							|  |  |  | 					case 's': p.v = strs[val[1]].t; p.r = strs[val[1]].r; break; | 
					
						
							|  |  |  | 					case 'b': p.v = val[1] ? true : false; break; | 
					
						
							|  |  |  | 					case 'e': p.raw = val[1]; p.v = BErr[p.raw]; break; | 
					
						
							| 
									
										
										
										
											2014-02-12 06:09:42 +00:00
										 |  |  | 					case 'str': p.v = utf8read(val[1]); break; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 				if(opts.cellFormula && val.length > 3) p.f = val[3]; | 
					
						
							| 
									
										
										
										
											2014-06-02 05:19:07 +00:00
										 |  |  | 				if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.ifmt,null,opts); | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 				s[encode_cell({c:val[0].c,r:row.r})] = p; | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | 				if(refguess.s.r > row.r) refguess.s.r = row.r; | 
					
						
							|  |  |  | 				if(refguess.s.c > val[0].c) refguess.s.c = val[0].c; | 
					
						
							|  |  |  | 				if(refguess.e.r < row.r) refguess.e.r = row.r; | 
					
						
							|  |  |  | 				if(refguess.e.c < val[0].c) refguess.e.c = val[0].c; | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-29 22:53:15 +00:00
										 |  |  | 			case 'BrtCellBlank': if(!opts.sheetStubs) break; | 
					
						
							|  |  |  | 				p = {t:'str',v:undefined}; | 
					
						
							|  |  |  | 				s[encode_cell({c:val[0].c,r:row.r})] = p; | 
					
						
							|  |  |  | 				if(refguess.s.r > row.r) refguess.s.r = row.r; | 
					
						
							|  |  |  | 				if(refguess.s.c > val[0].c) refguess.s.c = val[0].c; | 
					
						
							|  |  |  | 				if(refguess.e.r < row.r) refguess.e.r = row.r; | 
					
						
							|  |  |  | 				if(refguess.e.c < val[0].c) refguess.e.c = val[0].c; | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-23 21:30:00 +00:00
										 |  |  | 			/* Merge Cells */ | 
					
						
							|  |  |  | 			case 'BrtBeginMergeCells': break; | 
					
						
							|  |  |  | 			case 'BrtEndMergeCells': break; | 
					
						
							|  |  |  | 			case 'BrtMergeCell': mergecells.push(val); break; | 
					
						
							| 
									
										
										
										
											2014-04-15 09:04:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			case 'BrtHLink': | 
					
						
							|  |  |  | 				var rel = rels['!id'][val.relId]; | 
					
						
							|  |  |  | 				if(rel) { | 
					
						
							|  |  |  | 					val.Target = rel.Target; | 
					
						
							|  |  |  | 					if(val.loc) val.Target += "#"+val.loc; | 
					
						
							|  |  |  | 					val.Rel = rel; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) { | 
					
						
							|  |  |  | 					addr = encode_cell({c:C,r:R}); | 
					
						
							|  |  |  | 					if(!s[addr]) s[addr] = {t:"str",v:undefined}; | 
					
						
							|  |  |  | 					s[addr].l = val; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 			case 'BrtArrFmla': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtShrFmla': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginSheet': break; | 
					
						
							|  |  |  | 			case 'BrtWsProp': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtSheetCalcProp': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginWsViews': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginWsView': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-03-19 17:53:20 +00:00
										 |  |  | 			case 'BrtPane': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtSel': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 			case 'BrtEndWsView': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndWsViews': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtACBegin': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-03-19 17:53:20 +00:00
										 |  |  | 			case 'BrtRwDescent': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 			case 'BrtACEnd': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtWsFmtInfoEx14': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtWsFmtInfo': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginColInfos': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtColInfo': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndColInfos': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginSheetData': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndSheetData': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtSheetProtection': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtPrintOptions': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtMargins': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtPageSetup': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-01-31 11:52:18 +00:00
										 |  |  | 			case 'BrtFRTBegin': pass = true; break; | 
					
						
							|  |  |  | 			case 'BrtFRTEnd': pass = false; break; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 			case 'BrtEndSheet': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-03-19 17:53:20 +00:00
										 |  |  | 			case 'BrtDrawing': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 			case 'BrtLegacyDrawing': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-03-29 02:05:50 +00:00
										 |  |  | 			case 'BrtLegacyDrawingHF': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-03-19 17:53:20 +00:00
										 |  |  | 			case 'BrtPhoneticInfo': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginHeaderFooter': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndHeaderFooter': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBrk': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginRwBrk': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndRwBrk': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginColBrk': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndColBrk': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginUserShViews': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginUserShView': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndUserShView': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndUserShViews': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBkHim': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginOleObjects': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtOleObject': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndOleObjects': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginListParts': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtListPart': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndListParts': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginSortState': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginSortCond': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndSortCond': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndSortState': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginConditionalFormatting': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndConditionalFormatting': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginCFRule': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndCFRule': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginDVals': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtDVal': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndDVals': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtRangeProtection': break; // TODO
 | 
					
						
							| 
									
										
										
										
											2014-03-29 02:05:50 +00:00
										 |  |  | 			case 'BrtBeginDCon': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtEndDCon': break; // TODO
 | 
					
						
							|  |  |  | 			case 'BrtBeginDRefs': break; | 
					
						
							|  |  |  | 			case 'BrtDRef': break; | 
					
						
							|  |  |  | 			case 'BrtEndDRefs': break; | 
					
						
							| 
									
										
										
										
											2014-03-21 02:44:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			/* ActiveX */ | 
					
						
							|  |  |  | 			case 'BrtBeginActiveXControls': break; | 
					
						
							|  |  |  | 			case 'BrtActiveX': break; | 
					
						
							|  |  |  | 			case 'BrtEndActiveXControls': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* AutoFilter */ | 
					
						
							|  |  |  | 			case 'BrtBeginAFilter': break; | 
					
						
							|  |  |  | 			case 'BrtEndAFilter': break; | 
					
						
							|  |  |  | 			case 'BrtBeginFilterColumn': break; | 
					
						
							|  |  |  | 			case 'BrtBeginFilters': break; | 
					
						
							| 
									
										
										
										
											2014-04-15 09:04:03 +00:00
										 |  |  | 			case 'BrtFilter': break; | 
					
						
							| 
									
										
										
										
											2014-03-21 02:44:27 +00:00
										 |  |  | 			case 'BrtEndFilters': break; | 
					
						
							|  |  |  | 			case 'BrtEndFilterColumn': break; | 
					
						
							|  |  |  | 			case 'BrtDynamicFilter': break; | 
					
						
							|  |  |  | 			case 'BrtTop10Filter': break; | 
					
						
							|  |  |  | 			case 'BrtBeginCustomFilters': break; | 
					
						
							|  |  |  | 			case 'BrtCustomFilter': break; | 
					
						
							|  |  |  | 			case 'BrtEndCustomFilters': break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-29 02:05:50 +00:00
										 |  |  | 			/* Cell Watch */ | 
					
						
							|  |  |  | 			case 'BrtBeginCellWatches': break; | 
					
						
							|  |  |  | 			case 'BrtCellWatch': break; | 
					
						
							|  |  |  | 			case 'BrtEndCellWatches': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* Table */ | 
					
						
							|  |  |  | 			case 'BrtTable': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* Ignore Cell Errors */ | 
					
						
							|  |  |  | 			case 'BrtBeginCellIgnoreECs': break; | 
					
						
							|  |  |  | 			case 'BrtCellIgnoreEC': break; | 
					
						
							|  |  |  | 			case 'BrtEndCellIgnoreECs': break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-23 21:30:00 +00:00
										 |  |  | 			default: if(!pass || opts.WTF) throw new Error("Unexpected record " + R.n); | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-13 06:22:42 +00:00
										 |  |  | 	}, opts); | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 	if(!s["!ref"] && (refguess.s.r < 1000000 || ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0)) s["!ref"] = encode_range(ref); | 
					
						
							| 
									
										
										
										
											2014-03-29 22:53:15 +00:00
										 |  |  | 	if(opts.sheetRows && s["!ref"]) { | 
					
						
							| 
									
										
										
										
											2014-02-19 03:03:28 +00:00
										 |  |  | 		var tmpref = decode_range(s["!ref"]); | 
					
						
							|  |  |  | 		if(opts.sheetRows < +tmpref.e.r) { | 
					
						
							|  |  |  | 			tmpref.e.r = opts.sheetRows - 1; | 
					
						
							|  |  |  | 			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r; | 
					
						
							|  |  |  | 			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r; | 
					
						
							|  |  |  | 			if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c; | 
					
						
							|  |  |  | 			if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c; | 
					
						
							|  |  |  | 			s["!fullref"] = s["!ref"]; | 
					
						
							|  |  |  | 			s["!ref"] = encode_range(tmpref); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-03-23 21:30:00 +00:00
										 |  |  | 	if(mergecells.length > 0) s["!merges"] = mergecells; | 
					
						
							| 
									
										
										
										
											2014-01-28 16:38:02 +00:00
										 |  |  | 	return s; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 22:30:03 +00:00
										 |  |  | function write_CELLTABLE(ba, ws, idx, opts, wb) { | 
					
						
							|  |  |  | 	var r = decode_range(ws['!ref'] || "A1"); | 
					
						
							|  |  |  | 	write_record(ba, 'BrtBeginSheetData'); | 
					
						
							|  |  |  | 	for(var i = r.s.r; i <= r.e.r; ++i) { | 
					
						
							|  |  |  | 		/* [ACCELLTABLE] */ | 
					
						
							|  |  |  | 		/* BrtRowHdr */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* *16384CELL */ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	write_record(ba, 'BrtEndSheetData'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var write_ws_bin = function(idx, opts, wb) { | 
					
						
							|  |  |  | 	var ba = buf_array(); | 
					
						
							|  |  |  | 	var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {}; | 
					
						
							|  |  |  | 	var r = decode_range(ws['!ref'] || "A1"); | 
					
						
							|  |  |  | 	write_record(ba, "BrtBeginSheet"); | 
					
						
							|  |  |  | 	/* [BrtWsProp] */ | 
					
						
							|  |  |  | 	write_record(ba, "BrtWsDim", write_BrtWsDim(r)); | 
					
						
							|  |  |  | 	/* [WSVIEWS2] */ | 
					
						
							|  |  |  | 	/* [WSFMTINFO] */ | 
					
						
							|  |  |  | 	/* *COLINFOS */ | 
					
						
							|  |  |  | 	write_CELLTABLE(ba, ws, idx, opts, wb); | 
					
						
							|  |  |  | 	/* [BrtSheetCalcProp] */ | 
					
						
							|  |  |  | 	/* [[BrtSheetProtectionIso] BrtSheetProtection] */ | 
					
						
							|  |  |  | 	/* *([BrtRangeProtectionIso] BrtRangeProtection) */ | 
					
						
							|  |  |  | 	/* [SCENMAN] */ | 
					
						
							|  |  |  | 	/* [AUTOFILTER] */ | 
					
						
							|  |  |  | 	/* [SORTSTATE] */ | 
					
						
							|  |  |  | 	/* [DCON] */ | 
					
						
							|  |  |  | 	/* [USERSHVIEWS] */ | 
					
						
							|  |  |  | 	/* [MERGECELLS] */ | 
					
						
							|  |  |  | 	/* [BrtPhoneticInfo] */ | 
					
						
							|  |  |  | 	/* *CONDITIONALFORMATTING */ | 
					
						
							|  |  |  | 	/* [DVALS] */ | 
					
						
							|  |  |  | 	/* *BrtHLink */ | 
					
						
							|  |  |  | 	/* [BrtPrintOptions] */ | 
					
						
							|  |  |  | 	/* [BrtMargins] */ | 
					
						
							|  |  |  | 	/* [BrtPageSetup] */ | 
					
						
							|  |  |  | 	/* [HEADERFOOTER] */ | 
					
						
							|  |  |  | 	/* [RWBRK] */ | 
					
						
							|  |  |  | 	/* [COLBRK] */ | 
					
						
							|  |  |  | 	/* *BrtBigName */ | 
					
						
							|  |  |  | 	/* [CELLWATCHES] */ | 
					
						
							|  |  |  | 	/* [IGNOREECS] */ | 
					
						
							|  |  |  | 	/* [SMARTTAGS] */ | 
					
						
							|  |  |  | 	/* [BrtDrawing] */ | 
					
						
							|  |  |  | 	/* [BrtLegacyDrawing] */ | 
					
						
							|  |  |  | 	/* [BrtLegacyDrawingHF] */ | 
					
						
							|  |  |  | 	/* [BrtBkHim] */ | 
					
						
							|  |  |  | 	/* [OLEOBJECTS] */ | 
					
						
							|  |  |  | 	/* [ACTIVEXCONTROLS] */ | 
					
						
							|  |  |  | 	/* [WEBPUBITEMS] */ | 
					
						
							|  |  |  | 	/* [LISTPARTS] */ | 
					
						
							|  |  |  | 	/* FRTWORKSHEET */ | 
					
						
							|  |  |  | 	write_record(ba, "BrtEndSheet"); | 
					
						
							|  |  |  | 	return ba.end(); | 
					
						
							|  |  |  | }; |