function parse_BrtBundleSh(data, length) { var z = {}; z.Hidden = data.read_shift(4); z.iTabID = data.read_shift(4); z.strRelID = parse_RelID(data,length-8); z.name = parse_XLWideString(data); return z;}function write_BrtBundleSh(data, o) { if(!o) o = new_buf(127); o.write_shift(4, data.Hidden); o.write_shift(4, data.iTabID); write_RelID(data.strRelID, o); write_XLWideString(data.name.slice(0,31), o); return o.length > o.l ? o.slice(0, o.l) : o;}
function parse_BrtWbProp(data, length) { var o = ({}); var flags = data.read_shift(4); o.defaultThemeVersion = data.read_shift(4); var strName = (length > 8) ? parse_XLWideString(data) : ""; if(strName.length > 0) o.CodeName = strName; o.autoCompressPictures = !!(flags & 0x10000); o.backupFile = !!(flags & 0x40); o.checkCompatibility = !!(flags & 0x1000); o.date1904 = !!(flags & 0x01); o.filterPrivacy = !!(flags & 0x08); o.hidePivotFieldList = !!(flags & 0x400); o.promptedSolutions = !!(flags & 0x10); o.publishItems = !!(flags & 0x800); o.refreshAllConnections = !!(flags & 0x40000); o.saveExternalLinkValues = !!(flags & 0x80); o.showBorderUnselectedTables = !!(flags & 0x04); o.showInkAnnotation = !!(flags & 0x20); o.showObjects = ["all", "placeholders", "none"][(flags >> 13) & 0x03]; o.showPivotChartFilter = !!(flags & 0x8000); o.updateLinks = ["userSet", "never", "always"][(flags >> 8) & 0x03]; return o;}function write_BrtWbProp(data, o) { if(!o) o = new_buf(72); var flags = 0; if(data) { if(data.filterPrivacy) flags |= 0x08; } o.write_shift(4, flags); o.write_shift(4, 0); write_XLSBCodeName(data && data.CodeName || "ThisWorkbook", o); return o.slice(0, o.l);}
function parse_BrtFRTArchID$(data, length) { var o = {}; data.read_shift(4); o.ArchID = data.read_shift(4); data.l += length - 8; return o;}
function parse_BrtName(data, length, opts) { var end = data.l + length; data.l += 4; data.l += 1; var itab = data.read_shift(4); var name = parse_XLNameWideString(data); var formula = parse_XLSBNameParsedFormula(data, 0, opts); var comment = parse_XLNullableWideString(data); data.l = end; var out = ({Name:name, Ptg:formula}); if(itab < 0xFFFFFFF) out.Sheet = itab; if(comment) out.Comment = comment; return out;}
function parse_wb_bin(data, opts) { var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" }; var state = []; var pass = false;
if(!opts) opts = {}; opts.biff = 12;
var Names = []; var supbooks = ([[]]); supbooks.SheetNames = []; supbooks.XTI = [];
XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
recordhopper(data, function hopper_wb(val, R_n, RT) { switch(RT) { case 0x009C: supbooks.SheetNames.push(val.name); wb.Sheets.push(val); break;
case 0x0099: wb.WBProps = val; break;
case 0x0027: if(val.Sheet != null) opts.SID = val.Sheet; val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts); delete opts.SID; delete val.Ptg; Names.push(val); break; case 0x040C: break;
case 0x0165: case 0x0166: case 0x0163: case 0x029B: if(!supbooks[0].length) supbooks[0] = [RT, val]; else supbooks.push([RT, val]); supbooks[supbooks.length - 1].XTI = []; break; case 0x016A: if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; } supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break; case 0x0169: break;
case 0x0817: case 0x009E: case 0x008F: case 0x0298: case 0x0161: break;
case 0x0C00: case 0x0C01: case 0x0216: case 0x02A5: case 0x009D: case 0x0262: case 0x0802: case 0x009B: case 0x0224: case 0x02A4: case 0x0080: case 0x0299: case 0x0850: case 0x084D: case 0x0225: case 0x0805: case 0x0254: case 0x081C: case 0x081B: case 0x0822: case 0x018D: case 0x009A: case 0x045D: case 0x0229: case 0x082B: break;
case 0x0023: state.push(R_n); pass = true; break; case 0x0024: state.pop(); pass = false; break; case 0x0025: state.push(R_n); pass = true; break; case 0x0026: state.pop(); pass = false; break;
case 0x0010: break;
default: if((R_n||"").indexOf("Begin") > 0){} else if((R_n||"").indexOf("End") > 0){} else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n); } }, opts);
parse_wb_defaults(wb);
wb.Names = Names;
(wb).supbooks = supbooks; return wb;}
function write_BUNDLESHS(ba, wb) { write_record(ba, "BrtBeginBundleShs"); for(var idx = 0; idx != wb.SheetNames.length; ++idx) { var viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0; var d = { Hidden: viz, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] }; write_record(ba, "BrtBundleSh", write_BrtBundleSh(d)); } write_record(ba, "BrtEndBundleShs");}
function write_BrtFileVersion(data, o) { if(!o) o = new_buf(127); for(var i = 0; i != 4; ++i) o.write_shift(4, 0); write_XLWideString("SheetJS", o); write_XLWideString(XLSX.version, o); write_XLWideString(XLSX.version, o); write_XLWideString("7262", o); return o.length > o.l ? o.slice(0, o.l) : o;}
function write_BrtBookView(idx, o) { if(!o) o = new_buf(29); o.write_shift(-4, 0); o.write_shift(-4, 460); o.write_shift(4, 28800); o.write_shift(4, 17600); o.write_shift(4, 500); o.write_shift(4, idx); o.write_shift(4, idx); var flags = 0x78; o.write_shift(1, flags); return o.length > o.l ? o.slice(0, o.l) : o;}
function write_BOOKVIEWS(ba, wb) { if(!wb.Workbook || !wb.Workbook.Sheets) return; var sheets = wb.Workbook.Sheets; var i = 0, vistab = -1, hidden = -1; for(; i < sheets.length; ++i) { if(!sheets[i] || !sheets[i].Hidden && vistab == -1) vistab = i; else if(sheets[i].Hidden == 1 && hidden == -1) hidden = i; } if(hidden > vistab) return; write_record(ba, "BrtBeginBookViews"); write_record(ba, "BrtBookView", write_BrtBookView(vistab)); write_record(ba, "BrtEndBookViews");}
function write_wb_bin(wb, opts) { var ba = buf_array(); write_record(ba, "BrtBeginBook"); write_record(ba, "BrtFileVersion", write_BrtFileVersion()); write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null)); write_BOOKVIEWS(ba, wb, opts); write_BUNDLESHS(ba, wb, opts); write_record(ba, "BrtEndBook");
return ba.end();}