Skip to main content
Module

x/sheetjs/bits/68_wsbin.js

πŸ“— SheetJS Community Edition -- Spreadsheet Data Toolkit
Extremely Popular
Latest
File
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034

/* [MS-XLSB] 2.4.726 BrtRowHdr */function parse_BrtRowHdr(data, length) { var z = ({}/*:any*/); var tgt = data.l + length; z.r = data.read_shift(4); data.l += 4; // TODO: ixfe var miyRw = data.read_shift(2); data.l += 1; // TODO: top/bot padding var flags = data.read_shift(1); data.l = tgt; if(flags & 0x07) z.level = flags & 0x07; if(flags & 0x10) z.hidden = true; if(flags & 0x20) z.hpt = miyRw / 20; return z;}function write_BrtRowHdr(R/*:number*/, range, ws) { var o = new_buf(17+8*16); var row = (ws['!rows']||[])[R]||{}; o.write_shift(4, R);
o.write_shift(4, 0); /* TODO: ixfe */
var miyRw = 0x0140; if(row.hpx) miyRw = px2pt(row.hpx) * 20; else if(row.hpt) miyRw = row.hpt * 20; o.write_shift(2, miyRw);
o.write_shift(1, 0); /* top/bot padding */
var flags = 0x0; if(row.level) flags |= row.level; if(row.hidden) flags |= 0x10; if(row.hpx || row.hpt) flags |= 0x20; o.write_shift(1, flags);
o.write_shift(1, 0); /* phonetic guide */
/* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */ var ncolspan = 0, lcs = o.l; o.l += 4;
var caddr = {r:R, c:0}; 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)]; if(cell) { if(first < 0) first = j; last = j; } } if(first < 0) continue; ++ncolspan; o.write_shift(4, first); o.write_shift(4, last); }
var l = o.l; o.l = lcs; o.write_shift(4, ncolspan); o.l = l;
return o.length > o.l ? o.slice(0, o.l) : o;}function write_row_header(ba, ws, range, R) { var o = write_BrtRowHdr(R, range, ws); if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o);}
/* [MS-XLSB] 2.4.820 BrtWsDim */var parse_BrtWsDim = parse_UncheckedRfX;var write_BrtWsDim = write_UncheckedRfX;
/* [MS-XLSB] 2.4.821 BrtWsFmtInfo */function parse_BrtWsFmtInfo(/*::data, length*/) {}//function write_BrtWsFmtInfo(ws, o) { }
/* [MS-XLSB] 2.4.823 BrtWsProp */function parse_BrtWsProp(data, length) { var z = {}; var f = data[data.l]; ++data.l; z.above = !(f & 0x40); z.left = !(f & 0x80); /* TODO: pull flags */ data.l += 18; z.name = parse_XLSBCodeName(data, length - 19); return z;}function write_BrtWsProp(str, outl, o) { if(o == null) o = new_buf(84+4*str.length); var f = 0xC0; if(outl) { if(outl.above) f &= ~0x40; if(outl.left) f &= ~0x80; } o.write_shift(1, f); for(var i = 1; i < 3; ++i) o.write_shift(1,0); write_BrtColor({auto:1}, o); o.write_shift(-4,-1); o.write_shift(-4,-1); write_XLSBCodeName(str, o); return o.slice(0, o.l);}
/* [MS-XLSB] 2.4.306 BrtCellBlank */function parse_BrtCellBlank(data) { var cell = parse_XLSBCell(data); return [cell];}function write_BrtCellBlank(cell, ncell, o) { if(o == null) o = new_buf(8); return write_XLSBCell(ncell, o);}function parse_BrtShortBlank(data) { var cell = parse_XLSBShortCell(data); return [cell];}function write_BrtShortBlank(cell, ncell, o) { if(o == null) o = new_buf(4); return write_XLSBShortCell(ncell, o);}
/* [MS-XLSB] 2.4.307 BrtCellBool */function parse_BrtCellBool(data) { var cell = parse_XLSBCell(data); var fBool = data.read_shift(1); return [cell, fBool, 'b'];}function write_BrtCellBool(cell, ncell, o) { if(o == null) o = new_buf(9); write_XLSBCell(ncell, o); o.write_shift(1, cell.v ? 1 : 0); return o;}function parse_BrtShortBool(data) { var cell = parse_XLSBShortCell(data); var fBool = data.read_shift(1); return [cell, fBool, 'b'];}function write_BrtShortBool(cell, ncell, o) { if(o == null) o = new_buf(5); write_XLSBShortCell(ncell, o); o.write_shift(1, cell.v ? 1 : 0); return o;}
/* [MS-XLSB] 2.4.308 BrtCellError */function parse_BrtCellError(data) { var cell = parse_XLSBCell(data); var bError = data.read_shift(1); return [cell, bError, 'e'];}function write_BrtCellError(cell, ncell, o) { if(o == null) o = new_buf(9); write_XLSBCell(ncell, o); o.write_shift(1, cell.v); return o;}function parse_BrtShortError(data) { var cell = parse_XLSBShortCell(data); var bError = data.read_shift(1); return [cell, bError, 'e'];}function write_BrtShortError(cell, ncell, o) { if(o == null) o = new_buf(8); write_XLSBShortCell(ncell, o); o.write_shift(1, cell.v); o.write_shift(2, 0); o.write_shift(1, 0); return o;}

/* [MS-XLSB] 2.4.311 BrtCellIsst */function parse_BrtCellIsst(data) { var cell = parse_XLSBCell(data); var isst = data.read_shift(4); return [cell, isst, 's'];}function write_BrtCellIsst(cell, ncell, o) { if(o == null) o = new_buf(12); write_XLSBCell(ncell, o); o.write_shift(4, ncell.v); return o;}function parse_BrtShortIsst(data) { var cell = parse_XLSBShortCell(data); var isst = data.read_shift(4); return [cell, isst, 's'];}function write_BrtShortIsst(cell, ncell, o) { if(o == null) o = new_buf(8); write_XLSBShortCell(ncell, o); o.write_shift(4, ncell.v); return o;}
/* [MS-XLSB] 2.4.313 BrtCellReal */function parse_BrtCellReal(data) { var cell = parse_XLSBCell(data); var value = parse_Xnum(data); return [cell, value, 'n'];}function write_BrtCellReal(cell, ncell, o) { if(o == null) o = new_buf(16); write_XLSBCell(ncell, o); write_Xnum(cell.v, o); return o;}function parse_BrtShortReal(data) { var cell = parse_XLSBShortCell(data); var value = parse_Xnum(data); return [cell, value, 'n'];}function write_BrtShortReal(cell, ncell, o) { if(o == null) o = new_buf(12); write_XLSBShortCell(ncell, o); write_Xnum(cell.v, o); return o;}
/* [MS-XLSB] 2.4.314 BrtCellRk */function parse_BrtCellRk(data) { var cell = parse_XLSBCell(data); var value = parse_RkNumber(data); return [cell, value, 'n'];}function write_BrtCellRk(cell, ncell, o) { if(o == null) o = new_buf(12); write_XLSBCell(ncell, o); write_RkNumber(cell.v, o); return o;}function parse_BrtShortRk(data) { var cell = parse_XLSBShortCell(data); var value = parse_RkNumber(data); return [cell, value, 'n'];}function write_BrtShortRk(cell, ncell, o) { if(o == null) o = new_buf(8); write_XLSBShortCell(ncell, o); write_RkNumber(cell.v, o); return o;}
/* [MS-XLSB] 2.4.323 BrtCellRString */function parse_BrtCellRString(data) { var cell = parse_XLSBCell(data); var value = parse_RichStr(data); return [cell, value, 'is'];}
/* [MS-XLSB] 2.4.317 BrtCellSt */function parse_BrtCellSt(data) { var cell = parse_XLSBCell(data); var value = parse_XLWideString(data); return [cell, value, 'str'];}function write_BrtCellSt(cell, ncell, o) { if(o == null) o = new_buf(12 + 4 * cell.v.length); write_XLSBCell(ncell, o); write_XLWideString(cell.v, o); return o.length > o.l ? o.slice(0, o.l) : o;}function parse_BrtShortSt(data) { var cell = parse_XLSBShortCell(data); var value = parse_XLWideString(data); return [cell, value, 'str'];}function write_BrtShortSt(cell, ncell, o) { if(o == null) o = new_buf(8 + 4 * cell.v.length); write_XLSBShortCell(ncell, o); write_XLWideString(cell.v, o); return o.length > o.l ? o.slice(0, o.l) : o;}
/* [MS-XLSB] 2.4.653 BrtFmlaBool */function parse_BrtFmlaBool(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = data.read_shift(1); var o = [cell, value, 'b']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o;}
/* [MS-XLSB] 2.4.654 BrtFmlaError */function parse_BrtFmlaError(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = data.read_shift(1); var o = [cell, value, 'e']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o;}
/* [MS-XLSB] 2.4.655 BrtFmlaNum */function parse_BrtFmlaNum(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = parse_Xnum(data); var o = [cell, value, 'n']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o;}
/* [MS-XLSB] 2.4.656 BrtFmlaString */function parse_BrtFmlaString(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = parse_XLWideString(data); var o = [cell, value, 'str']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o;}
/* [MS-XLSB] 2.4.682 BrtMergeCell */var parse_BrtMergeCell = parse_UncheckedRfX;var write_BrtMergeCell = write_UncheckedRfX;/* [MS-XLSB] 2.4.107 BrtBeginMergeCells */function write_BrtBeginMergeCells(cnt, o) { if(o == null) o = new_buf(4); o.write_shift(4, cnt); return o;}
/* [MS-XLSB] 2.4.662 BrtHLink */function parse_BrtHLink(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; var o = ({rfx:rfx, relId:relId, loc:loc, display:display}/*:any*/); if(tooltip) o.Tooltip = tooltip; return o;}function write_BrtHLink(l, rId) { var o = new_buf(50+4*(l[1].Target.length + (l[1].Tooltip || "").length)); write_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o); write_RelID("rId" + rId, o); var locidx = l[1].Target.indexOf("#"); var loc = locidx == -1 ? "" : l[1].Target.slice(locidx+1); write_XLWideString(loc || "", o); write_XLWideString(l[1].Tooltip || "", o); write_XLWideString("", o); return o.slice(0, o.l);}
/* [MS-XLSB] 2.4.692 BrtPane */function parse_BrtPane(/*data, length, opts*/) {}
/* [MS-XLSB] 2.4.6 BrtArrFmla */function parse_BrtArrFmla(data, length, opts) { var end = data.l + length; var rfx = parse_RfX(data, 16); var fAlwaysCalc = data.read_shift(1); var o = [rfx]; o[2] = fAlwaysCalc; if(opts.cellFormula) { var formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts); o[1] = formula; } else data.l = end; return o;}
/* [MS-XLSB] 2.4.750 BrtShrFmla */function parse_BrtShrFmla(data, length, opts) { var end = data.l + length; var rfx = parse_UncheckedRfX(data, 16); var o = [rfx]; if(opts.cellFormula) { var formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts); o[1] = formula; data.l = end; } else data.l = end; return o;}
/* [MS-XLSB] 2.4.323 BrtColInfo *//* TODO: once XLS ColInfo is set, combine the functions */function write_BrtColInfo(C/*:number*/, col, o) { if(o == null) o = new_buf(18); var p = col_obj_w(C, col); o.write_shift(-4, C); o.write_shift(-4, C); o.write_shift(4, (p.width || 10) * 256); o.write_shift(4, 0/*ixfe*/); // style var flags = 0; if(col.hidden) flags |= 0x01; if(typeof p.width == 'number') flags |= 0x02; if(col.level) flags |= (col.level << 8); o.write_shift(2, flags); // bit flag return o;}
/* [MS-XLSB] 2.4.678 BrtMargins */var BrtMarginKeys = ["left","right","top","bottom","header","footer"];function parse_BrtMargins(data/*::, length, opts*/)/*:Margins*/ { var margins = ({}/*:any*/); BrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); }); return margins;}function write_BrtMargins(margins/*:Margins*/, o) { if(o == null) o = new_buf(6*8); default_margins(margins); BrtMarginKeys.forEach(function(k) { write_Xnum((margins/*:any*/)[k], o); }); return o;}
/* [MS-XLSB] 2.4.299 BrtBeginWsView */function parse_BrtBeginWsView(data/*::, length, opts*/) { var f = data.read_shift(2); data.l += 28; return { RTL: f & 0x20 };}function write_BrtBeginWsView(ws, Workbook, o) { if(o == null) o = new_buf(30); var f = 0x39c; if((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20; o.write_shift(2, f); // bit flag o.write_shift(4, 0); o.write_shift(4, 0); // view first row o.write_shift(4, 0); // view first col o.write_shift(1, 0); // gridline color ICV o.write_shift(1, 0); o.write_shift(2, 0); o.write_shift(2, 100); // zoom scale o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(4, 0); // workbook view id return o;}
/* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */function write_BrtCellIgnoreEC(ref) { var o = new_buf(24); o.write_shift(4, 4); o.write_shift(4, 1); write_UncheckedRfX(ref, o); return o;}
/* [MS-XLSB] 2.4.748 BrtSheetProtection */function write_BrtSheetProtection(sp, o) { if(o == null) o = new_buf(16*4+2); o.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0); o.write_shift(4, 1); // this record should not be written if no protection [ ["objects", false], // fObjects ["scenarios", false], // fScenarios ["formatCells", true], // fFormatCells ["formatColumns", true], // fFormatColumns ["formatRows", true], // fFormatRows ["insertColumns", true], // fInsertColumns ["insertRows", true], // fInsertRows ["insertHyperlinks", true], // fInsertHyperlinks ["deleteColumns", true], // fDeleteColumns ["deleteRows", true], // fDeleteRows ["selectLockedCells", false], // fSelLockedCells ["sort", true], // fSort ["autoFilter", true], // fAutoFilter ["pivotTables", true], // fPivotTables ["selectUnlockedCells", false] // fSelUnlockedCells ].forEach(function(n) { /*:: if(o == null) throw "unreachable"; */ if(n[1]) o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0); else o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1); }); return o;}
function parse_BrtDVal(/*data, length, opts*/) {}function parse_BrtDVal14(/*data, length, opts*/) {}/* [MS-XLSB] 2.1.7.61 Worksheet */function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/*:Worksheet*/ { if(!data) return data; var opts = _opts || {}; if(!rels) rels = {'!id':{}}; if(DENSE != null && opts.dense == null) opts.dense = DENSE; var s/*:Worksheet*/ = (opts.dense ? [] : {});
var ref; var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
var state/*:Array<string>*/ = []; var pass = false, end = false; var row, p, cf, R, C, addr, sstr, rr, cell/*:Cell*/; var merges/*:Array<Range>*/ = []; opts.biff = 12; opts['!row'] = 0;
var ai = 0, af = false;
var arrayf/*:Array<[Range, string]>*/ = []; var sharedf = {}; var supbooks = opts.supbooks || /*::(*/wb/*:: :any)*/.supbooks || ([[]]/*:any*/); supbooks.sharedf = sharedf; supbooks.arrayf = arrayf; supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; }); if(!opts.supbooks) { opts.supbooks = supbooks; if(wb.Names) for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i]; }
var colinfo/*:Array<ColInfo>*/ = [], rowinfo/*:Array<RowInfo>*/ = []; var seencol = false;
XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
var cm, vm;
recordhopper(data, function ws_parse(val, R_n, RT) { if(end) return; switch(RT) { case 0x0094: /* 'BrtWsDim' */ ref = val; break; case 0x0000: /* 'BrtRowHdr' */ row = val; if(opts.sheetRows && opts.sheetRows <= row.r) end=true; rr = encode_row(R = row.r); opts['!row'] = row.r; if(val.hidden || val.hpt || val.level != null) { if(val.hpt) val.hpx = pt2px(val.hpt); rowinfo[val.r] = val; } break;
case 0x0002: /* 'BrtCellRk' */ case 0x0003: /* 'BrtCellError' */ case 0x0004: /* 'BrtCellBool' */ case 0x0005: /* 'BrtCellReal' */ case 0x0006: /* 'BrtCellSt' */ case 0x0007: /* 'BrtCellIsst' */ case 0x0008: /* 'BrtFmlaString' */ case 0x0009: /* 'BrtFmlaNum' */ case 0x000A: /* 'BrtFmlaBool' */ case 0x000B: /* 'BrtFmlaError' */ case 0x000D: /* 'BrtShortRk' */ case 0x000E: /* 'BrtShortError' */ case 0x000F: /* 'BrtShortBool' */ case 0x0010: /* 'BrtShortReal' */ case 0x0011: /* 'BrtShortSt' */ case 0x0012: /* 'BrtShortIsst' */ case 0x003E: /* 'BrtCellRString' */ p = ({t:val[2]}/*:any*/); switch(val[2]) { case 'n': p.v = val[1]; break; case 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break; case 'b': p.v = val[1] ? true : false; break; case 'e': p.v = val[1]; if(opts.cellText !== false) p.w = BErr[p.v]; break; case 'str': p.t = 's'; p.v = val[1]; break; case 'is': p.t = 's'; p.v = val[1].t; break; } 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; } else s[encode_col(C) + rr] = p; if(opts.cellFormula) { af = false; for(ai = 0; ai < arrayf.length; ++ai) { var aii = arrayf[ai]; if(row.r >= aii[0].s.r && row.r <= aii[0].e.r) if(C >= aii[0].s.c && C <= aii[0].e.c) { p.F = encode_range(aii[0]); af = true; } } if(!af && val.length > 3) p.f = val[3]; }
if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.c > C) refguess.s.c = C; if(refguess.e.r < row.r) refguess.e.r = row.r; if(refguess.e.c < C) refguess.e.c = C; if(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.numFmtId])) { var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); } } if(cm) { if(cm.name == 'XLDAPR') p.D = true; cm = void 0; } if(vm) vm = void 0; break;
case 0x0001: /* 'BrtCellBlank' */ case 0x000C: /* 'BrtShortBlank' */ 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; } 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; if(refguess.e.r < row.r) refguess.e.r = row.r; if(refguess.e.c < C) refguess.e.c = C; if(cm) { if(cm.name == 'XLDAPR') p.D = true; cm = void 0; } if(vm) vm = void 0; break;
case 0x00B0: /* 'BrtMergeCell' */ merges.push(val); break;
case 0x0031: { /* 'BrtCellMeta' */ cm = ((opts.xlmeta||{}).Types||[])[val-1]; } break;
case 0x01EE: /* 'BrtHLink' */ var rel = rels['!id'][val.relId]; if(rel) { val.Target = rel.Target; if(val.loc) val.Target += "#"+val.loc; val.Rel = rel; } else if(val.relId == '') { val.Target = "#" + val.loc; } 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; } else { addr = encode_cell({c:C,r:R}); if(!s[addr]) s[addr] = {t:'z',v:undefined}; s[addr].l = val; } } break;
case 0x01AA: /* 'BrtArrFmla' */ if(!opts.cellFormula) break; arrayf.push(val); cell = ((opts.dense ? s[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.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts); break;
/* identical to 'ColInfo' in XLS */ case 0x003C: /* 'BrtColInfo' */ if(!opts.cellStyles) break; while(val.e >= val.s) { colinfo[val.e--] = { width: val.w/256, hidden: !!(val.flags & 0x01), level: val.level }; if(!seencol) { seencol = true; find_mdw_colw(val.w/256); } process_col(colinfo[val.e+1]); } break;
case 0x00A1: /* 'BrtBeginAFilter' */ s['!autofilter'] = { ref:encode_range(val) }; break;
case 0x01DC: /* 'BrtMargins' */ s['!margins'] = val; break;
case 0x0093: /* 'BrtWsProp' */ if(!wb.Sheets[idx]) wb.Sheets[idx] = {}; if(val.name) wb.Sheets[idx].CodeName = val.name; if(val.above || val.left) s['!outline'] = { above: val.above, left: val.left }; break;
case 0x0089: /* 'BrtBeginWsView' */ if(!wb.Views) wb.Views = [{}]; if(!wb.Views[0]) wb.Views[0] = {}; if(val.RTL) wb.Views[0].RTL = true; break;
case 0x01E5: /* 'BrtWsFmtInfo' */ break;
case 0x0040: /* 'BrtDVal' */ case 0x041D: /* 'BrtDVal14' */ break;
case 0x0097: /* 'BrtPane' */ break; case 0x0098: /* 'BrtSel' */ case 0x00AF: /* 'BrtAFilterDateGroupItem' */ case 0x0284: /* 'BrtActiveX' */ case 0x0271: /* 'BrtBigName' */ case 0x0232: /* 'BrtBkHim' */ case 0x018C: /* 'BrtBrk' */ case 0x0458: /* 'BrtCFIcon' */ case 0x047A: /* 'BrtCFRuleExt' */ case 0x01D7: /* 'BrtCFVO' */ case 0x041A: /* 'BrtCFVO14' */ case 0x0289: /* 'BrtCellIgnoreEC' */ case 0x0451: /* 'BrtCellIgnoreEC14' */ case 0x024D: /* 'BrtCellSmartTagProperty' */ case 0x025F: /* 'BrtCellWatch' */ case 0x0234: /* 'BrtColor' */ case 0x041F: /* 'BrtColor14' */ case 0x00A8: /* 'BrtColorFilter' */ case 0x00AE: /* 'BrtCustomFilter' */ case 0x049C: /* 'BrtCustomFilter14' */ case 0x01F3: /* 'BrtDRef' */ case 0x01FB: /* 'BrtDXF' */ case 0x0226: /* 'BrtDrawing' */ case 0x00AB: /* 'BrtDynamicFilter' */ case 0x00A7: /* 'BrtFilter' */ case 0x0499: /* 'BrtFilter14' */ case 0x00A9: /* 'BrtIconFilter' */ case 0x049D: /* 'BrtIconFilter14' */ case 0x0227: /* 'BrtLegacyDrawing' */ case 0x0228: /* 'BrtLegacyDrawingHF' */ case 0x0295: /* 'BrtListPart' */ case 0x027F: /* 'BrtOleObject' */ case 0x01DE: /* 'BrtPageSetup' */ case 0x0219: /* 'BrtPhoneticInfo' */ case 0x01DD: /* 'BrtPrintOptions' */ case 0x0218: /* 'BrtRangeProtection' */ case 0x044F: /* 'BrtRangeProtection14' */ case 0x02A8: /* 'BrtRangeProtectionIso' */ case 0x0450: /* 'BrtRangeProtectionIso14' */ case 0x0400: /* 'BrtRwDescent' */ case 0x0297: /* 'BrtSheetCalcProp' */ case 0x0217: /* 'BrtSheetProtection' */ case 0x02A6: /* 'BrtSheetProtectionIso' */ case 0x01F8: /* 'BrtSlc' */ case 0x0413: /* 'BrtSparkline' */ case 0x01AC: /* 'BrtTable' */ case 0x00AA: /* 'BrtTop10Filter' */ case 0x0C00: /* 'BrtUid' */ case 0x0032: /* 'BrtValueMeta' */ case 0x0816: /* 'BrtWebExtension' */ case 0x0415: /* 'BrtWsFmtInfoEx14' */ break;
case 0x0023: /* 'BrtFRTBegin' */ pass = true; break; case 0x0024: /* 'BrtFRTEnd' */ pass = false; break; case 0x0025: /* 'BrtACBegin' */ state.push(R_n); pass = true; break; case 0x0026: /* 'BrtACEnd' */ state.pop(); pass = false; break;
default: if((R_n||"").indexOf("Begin") > 0){/* empty */} else if((R_n||"").indexOf("End") > 0){/* empty */} else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n); } }, opts);
delete opts.supbooks; delete opts['!row'];
if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess); if(opts.sheetRows && s["!ref"]) { var tmpref = safe_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); } } if(merges.length > 0) s["!merges"] = merges; if(colinfo.length > 0) s["!cols"] = colinfo; if(rowinfo.length > 0) s["!rows"] = rowinfo; return s;}
/* TODO: something useful -- this is a stub */function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts, ws/*:Worksheet*/, last_seen/*:boolean*/)/*:boolean*/ { if(cell.v === undefined) return false; var vv = ""; switch(cell.t) { case 'b': vv = cell.v ? "1" : "0"; break; case 'd': // no BrtCellDate :( cell = dup(cell); cell.z = cell.z || SSF._table[14]; cell.v = datenum(parseDate(cell.v)); cell.t = 'n'; break; /* falls through */ case 'n': case 'e': vv = ''+cell.v; break; default: vv = cell.v; break; } var o/*:any*/ = ({r:R, c:C}/*:any*/); /* TODO: cell style */ o.s = get_cell_style(opts.cellXfs, cell, opts); if(cell.l) ws['!links'].push([encode_cell(o), cell.l]); if(cell.c) ws['!comments'].push([encode_cell(o), cell.c]); switch(cell.t) { case 's': case 'str': if(opts.bookSST) { vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings); o.t = "s"; o.v = vv; if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o)); else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); } else { o.t = "str"; if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o)); else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o)); } return true; case 'n': /* TODO: determine threshold for Real vs RK */ if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) { if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o)); else write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o)); } else { if(last_seen) write_record(ba, "BrtShortReal", write_BrtShortReal(cell, o)); else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o)); } return true; case 'b': o.t = "b"; if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o)); else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o)); return true; case 'e': o.t = "e"; if(last_seen) write_record(ba, "BrtShortError", write_BrtShortError(cell, o)); else write_record(ba, "BrtCellError", write_BrtCellError(cell, o)); return true; } if(last_seen) write_record(ba, "BrtShortBlank", write_BrtShortBlank(cell, o)); else write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)); return true;}
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, 'BrtBeginSheetData'); var dense = Array.isArray(ws); 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) { rr = encode_row(R); /* [ACCELLTABLE] */ /* BrtRowHdr */ write_row_header(ba, ws, range, R); var last_seen = false; if(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) { /* *16384CELL */ if(R === range.s.r) cols[C] = encode_col(C); ref = cols[C] + rr; var cell = dense ? (ws[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); } } write_record(ba, 'BrtEndSheetData');}
function write_MERGECELLS(ba, ws/*:Worksheet*/) { if(!ws || !ws['!merges']) return; write_record(ba, 'BrtBeginMergeCells', write_BrtBeginMergeCells(ws['!merges'].length)); ws['!merges'].forEach(function(m) { write_record(ba, 'BrtMergeCell', write_BrtMergeCell(m)); }); write_record(ba, 'BrtEndMergeCells');}
function write_COLINFOS(ba, ws/*:Worksheet*//*::, idx:number, opts, wb:Workbook*/) { if(!ws || !ws['!cols']) return; write_record(ba, 'BrtBeginColInfos'); ws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 'BrtColInfo', write_BrtColInfo(i, m)); }); write_record(ba, 'BrtEndColInfos');}
function write_IGNOREECS(ba, ws/*:Worksheet*/) { if(!ws || !ws['!ref']) return; write_record(ba, 'BrtBeginCellIgnoreECs'); write_record(ba, 'BrtCellIgnoreEC', write_BrtCellIgnoreEC(safe_decode_range(ws['!ref']))); write_record(ba, 'BrtEndCellIgnoreECs');}
function write_HLINKS(ba, ws/*:Worksheet*/, rels) { /* *BrtHLink */ ws['!links'].forEach(function(l) { if(!l[1].Target) return; var rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, ""), RELS.HLINK); write_record(ba, "BrtHLink", write_BrtHLink(l, rId)); }); delete ws['!links'];}function write_LEGACYDRAWING(ba, ws/*:Worksheet*/, idx/*:number*/, rels) { /* [BrtLegacyDrawing] */ if(ws['!comments'].length > 0) { var rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx+1) + ".vml", RELS.VML); write_record(ba, "BrtLegacyDrawing", write_RelID("rId" + rId)); ws['!legacy'] = rId; }}
function write_AUTOFILTER(ba, ws, wb, idx) { if(!ws['!autofilter']) return; var data = ws['!autofilter']; var ref = typeof data.ref === "string" ? data.ref : encode_range(data.ref);
/* Update FilterDatabase defined name for the worksheet */ if(!wb.Workbook) wb.Workbook = ({Sheets:[]}/*:any*/); if(!wb.Workbook.Names) wb.Workbook.Names = []; var names/*: Array<any> */ = wb.Workbook.Names; var range = decode_range(ref); if(range.s.r == range.e.r) { range.e.r = decode_range(ws["!ref"]).e.r; ref = encode_range(range); } for(var i = 0; i < names.length; ++i) { var name = names[i]; if(name.Name != '_xlnm._FilterDatabase') continue; if(name.Sheet != idx) continue; name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref; break; } if(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref });
write_record(ba, "BrtBeginAFilter", write_UncheckedRfX(safe_decode_range(ref))); /* *FILTERCOLUMN */ /* [SORTSTATE] */ /* BrtEndAFilter */ write_record(ba, "BrtEndAFilter");}
function write_WSVIEWS2(ba, ws, Workbook) { write_record(ba, "BrtBeginWsViews"); { /* 1*WSVIEW2 */ /* [ACUID] */ write_record(ba, "BrtBeginWsView", write_BrtBeginWsView(ws, Workbook)); /* [BrtPane] */ /* *4BrtSel */ /* *4SXSELECT */ /* *FRT */ write_record(ba, "BrtEndWsView"); } /* *FRT */ write_record(ba, "BrtEndWsViews");}
function write_WSFMTINFO(/*::ba, ws*/) { /* [ACWSFMTINFO] */ //write_record(ba, "BrtWsFmtInfo", write_BrtWsFmtInfo(ws));}
function write_SHEETPROTECT(ba, ws) { if(!ws['!protect']) return; /* [BrtSheetProtectionIso] */ write_record(ba, "BrtSheetProtection", write_BrtSheetProtection(ws['!protect']));}
function write_ws_bin(idx/*:number*/, opts, wb/*:Workbook*/, rels) { var ba = buf_array(); var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {}; var c/*:string*/ = s; try { if(wb && wb.Workbook) c = wb.Workbook.Sheets[idx].CodeName || c; } catch(e) {} var r = safe_decode_range(ws['!ref'] || "A1"); if(r.e.c > 0x3FFF || r.e.r > 0xFFFFF) { if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:XFD1048576"); r.e.c = Math.min(r.e.c, 0x3FFF); r.e.r = Math.min(r.e.c, 0xFFFFF); } ws['!links'] = []; /* passed back to write_zip and removed there */ ws['!comments'] = []; write_record(ba, "BrtBeginSheet"); if(wb.vbaraw || ws['!outline']) write_record(ba, "BrtWsProp", write_BrtWsProp(c, ws['!outline'])); write_record(ba, "BrtWsDim", write_BrtWsDim(r)); write_WSVIEWS2(ba, ws, wb.Workbook); write_WSFMTINFO(ba, ws); write_COLINFOS(ba, ws, idx, opts, wb); write_CELLTABLE(ba, ws, idx, opts, wb); /* [BrtSheetCalcProp] */ write_SHEETPROTECT(ba, ws); /* *([BrtRangeProtectionIso] BrtRangeProtection) */ /* [SCENMAN] */ write_AUTOFILTER(ba, ws, wb, idx); /* [SORTSTATE] */ /* [DCON] */ /* [USERSHVIEWS] */ write_MERGECELLS(ba, ws); /* [BrtPhoneticInfo] */ /* *CONDITIONALFORMATTING */ /* [DVALS] */ write_HLINKS(ba, ws, rels); /* [BrtPrintOptions] */ if(ws['!margins']) write_record(ba, "BrtMargins", write_BrtMargins(ws['!margins'])); /* [BrtPageSetup] */ /* [HEADERFOOTER] */ /* [RWBRK] */ /* [COLBRK] */ /* *BrtBigName */ /* [CELLWATCHES] */ if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws); /* [SMARTTAGS] */ /* [BrtDrawing] */ write_LEGACYDRAWING(ba, ws, idx, rels); /* [BrtLegacyDrawingHF] */ /* [BrtBkHim] */ /* [OLEOBJECTS] */ /* [ACTIVEXCONTROLS] */ /* [WEBPUBITEMS] */ /* [LISTPARTS] */ /* FRTWORKSHEET */ write_record(ba, "BrtEndSheet"); return ba.end();}