function parse_BrtRowHdr(data, length) { var z = ({}); var tgt = data.l + length; z.r = data.read_shift(4); data.l += 4; var miyRw = data.read_shift(2); data.l += 1; 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, range, ws) { var o = new_buf(17+8*16); var row = (ws['!rows']||[])[R]||{}; o.write_shift(4, R);
o.write_shift(4, 0);
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);
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);
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);}
var parse_BrtWsDim = parse_UncheckedRfX;var write_BrtWsDim = write_UncheckedRfX;
function parse_BrtWsFmtInfo() {}
function parse_BrtWsProp(data, length) { var z = {}; var f = data[data.l]; ++data.l; z.above = !(f & 0x40); z.left = !(f & 0x80); 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);}
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);}
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;}
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;}
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;}
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;}
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;}
function parse_BrtCellRString(data) { var cell = parse_XLSBCell(data); var value = parse_RichStr(data); return [cell, value, 'is'];}
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;}
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, cell, opts.supbooks, opts); } else data.l = end; return o;}
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, cell, opts.supbooks, opts); } else data.l = end; return o;}
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, cell, opts.supbooks, opts); } else data.l = end; return o;}
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, cell, opts.supbooks, opts); } else data.l = end; return o;}
var parse_BrtMergeCell = parse_UncheckedRfX;var write_BrtMergeCell = write_UncheckedRfX;function write_BrtBeginMergeCells(cnt, o) { if(o == null) o = new_buf(4); o.write_shift(4, cnt); return o;}
function parse_BrtHLink(data, length) { 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}); 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);}
function parse_BrtPane() {}
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;}
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;}
function write_BrtColInfo(C, 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); 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); return o;}
var BrtMarginKeys = ["left","right","top","bottom","header","footer"];function parse_BrtMargins(data) { var margins = ({}); BrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); }); return margins;}function write_BrtMargins(margins, o) { if(o == null) o = new_buf(6*8); default_margins(margins); BrtMarginKeys.forEach(function(k) { write_Xnum((margins)[k], o); }); return o;}
function parse_BrtBeginWsView(data) { 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); o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(1, 0); o.write_shift(1, 0); o.write_shift(2, 0); o.write_shift(2, 100); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(4, 0); return o;}
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;}
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); [ ["objects", false], ["scenarios", false], ["formatCells", true], ["formatColumns", true], ["formatRows", true], ["insertColumns", true], ["insertRows", true], ["insertHyperlinks", true], ["deleteColumns", true], ["deleteRows", true], ["selectLockedCells", false], ["sort", true], ["autoFilter", true], ["pivotTables", true], ["selectUnlockedCells", false] ].forEach(function(n) { 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() {}function parse_BrtDVal14() {}function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) { if(!data) return data; var opts = _opts || {}; if(!rels) rels = {'!id':{}}; if(DENSE != null && opts.dense == null) opts.dense = DENSE; var s = (opts.dense ? [] : {});
var ref; var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
var state = []; var pass = false, end = false; var row, p, cf, R, C, addr, sstr, rr, cell; var merges = []; opts.biff = 12; opts['!row'] = 0;
var ai = 0, af = false;
var arrayf = []; var sharedf = {}; var supbooks = opts.supbooks || wb.supbooks || ([[]]); 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 = [], 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: ref = val; break; case 0x0000: 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: case 0x0003: case 0x0004: case 0x0005: case 0x0006: case 0x0007: case 0x0008: case 0x0009: case 0x000A: case 0x000B: case 0x000D: case 0x000E: case 0x000F: case 0x0010: case 0x0011: case 0x0012: case 0x003E: p = ({t:val[2]}); 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: case 0x000C: if(!opts.sheetStubs || pass) break; p = ({t:'z',v:void 0}); 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: merges.push(val); break;
case 0x0031: { cm = ((opts.xlmeta||{}).Types||[])[val-1]; } break;
case 0x01EE: 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: if(!opts.cellFormula) break; arrayf.push(val); 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); cell.F = encode_range(val[0]); break; case 0x01AB: 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;
case 0x003C: 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: s['!autofilter'] = { ref:encode_range(val) }; break;
case 0x01DC: s['!margins'] = val; break;
case 0x0093: 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: if(!wb.Views) wb.Views = [{}]; if(!wb.Views[0]) wb.Views[0] = {}; if(val.RTL) wb.Views[0].RTL = true; break;
case 0x01E5: break;
case 0x0040: case 0x041D: break;
case 0x0097: break; case 0x0098: case 0x00AF: case 0x0284: case 0x0271: case 0x0232: case 0x018C: case 0x0458: case 0x047A: case 0x01D7: case 0x041A: case 0x0289: case 0x0451: case 0x024D: case 0x025F: case 0x0234: case 0x041F: case 0x00A8: case 0x00AE: case 0x049C: case 0x01F3: case 0x01FB: case 0x0226: case 0x00AB: case 0x00A7: case 0x0499: case 0x00A9: case 0x049D: case 0x0227: case 0x0228: case 0x0295: case 0x027F: case 0x01DE: case 0x0219: case 0x01DD: case 0x0218: case 0x044F: case 0x02A8: case 0x0450: case 0x0400: case 0x0297: case 0x0217: case 0x02A6: case 0x01F8: case 0x0413: case 0x01AC: case 0x00AA: case 0x0C00: case 0x0032: case 0x0816: case 0x0415: break;
case 0x0023: pass = true; break; case 0x0024: pass = false; break; case 0x0025: state.push(R_n); pass = true; break; case 0x0026: state.pop(); pass = false; break;
default: if((R_n||"").indexOf("Begin") > 0){} else if((R_n||"").indexOf("End") > 0){} 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;}
function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) { if(cell.v === undefined) return false; var vv = ""; switch(cell.t) { case 'b': vv = cell.v ? "1" : "0"; break; case 'd': cell = dup(cell); cell.z = cell.z || SSF._table[14]; cell.v = datenum(parseDate(cell.v)); cell.t = 'n'; break; case 'n': case 'e': vv = ''+cell.v; break; default: vv = cell.v; break; } var o = ({r:R, c:C}); 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), 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': 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, idx, opts) { var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = []; 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); 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) { 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; } last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen); } } write_record(ba, 'BrtEndSheetData');}
function write_MERGECELLS(ba, ws) { 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/*::, 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) { 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, rels) { 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, idx, rels) { 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);
if(!wb.Workbook) wb.Workbook = ({Sheets:[]}); if(!wb.Workbook.Names) wb.Workbook.Names = []; var names = 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))); write_record(ba, "BrtEndAFilter");}
function write_WSVIEWS2(ba, ws, Workbook) { write_record(ba, "BrtBeginWsViews"); { write_record(ba, "BrtBeginWsView", write_BrtBeginWsView(ws, Workbook)); write_record(ba, "BrtEndWsView"); } write_record(ba, "BrtEndWsViews");}
function write_WSFMTINFO() { }
function write_SHEETPROTECT(ba, ws) { if(!ws['!protect']) return; write_record(ba, "BrtSheetProtection", write_BrtSheetProtection(ws['!protect']));}
function write_ws_bin(idx, opts, wb, rels) { var ba = buf_array(); var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {}; var c = 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'] = []; 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); write_SHEETPROTECT(ba, ws); write_AUTOFILTER(ba, ws, wb, idx); write_MERGECELLS(ba, ws); write_HLINKS(ba, ws, rels); if(ws['!margins']) write_record(ba, "BrtMargins", write_BrtMargins(ws['!margins'])); if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws); write_LEGACYDRAWING(ba, ws, idx, rels); write_record(ba, "BrtEndSheet"); return ba.end();}