2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.4.304 BrtBundleSh */
|
2017-02-10 19:23:01 +00:00
|
|
|
function parse_BrtBundleSh(data, length/*:number*/) {
|
2014-01-28 16:38:02 +00:00
|
|
|
var z = {};
|
2017-03-31 18:46:42 +00:00
|
|
|
z.Hidden = data.read_shift(4); //hsState ST_SheetState
|
2014-01-28 16:38:02 +00:00
|
|
|
z.iTabID = data.read_shift(4);
|
|
|
|
z.strRelID = parse_RelID(data,length-8);
|
|
|
|
z.name = parse_XLWideString(data);
|
|
|
|
return z;
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
|
|
|
function write_BrtBundleSh(data, o) {
|
2014-05-29 22:30:03 +00:00
|
|
|
if(!o) o = new_buf(127);
|
2017-03-31 18:46:42 +00:00
|
|
|
o.write_shift(4, data.Hidden);
|
2014-05-29 22:30:03 +00:00
|
|
|
o.write_shift(4, data.iTabID);
|
|
|
|
write_RelID(data.strRelID, o);
|
2018-01-11 08:01:25 +00:00
|
|
|
write_XLWideString(data.name.slice(0,31), o);
|
2017-02-03 20:50:45 +00:00
|
|
|
return o.length > o.l ? o.slice(0, o.l) : o;
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
2014-05-29 22:30:03 +00:00
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.4.815 BrtWbProp */
|
2017-06-03 07:19:09 +00:00
|
|
|
function parse_BrtWbProp(data, length)/*:WBProps*/ {
|
|
|
|
var o/*:WBProps*/ = ({}/*:any*/);
|
2017-06-01 21:22:11 +00:00
|
|
|
var flags = data.read_shift(4);
|
|
|
|
o.defaultThemeVersion = data.read_shift(4);
|
2014-05-29 22:30:03 +00:00
|
|
|
var strName = (length > 8) ? parse_XLWideString(data) : "";
|
2017-11-20 01:51:14 +00:00
|
|
|
if(strName.length > 0) o.CodeName = strName;
|
2017-06-01 21:22:11 +00:00
|
|
|
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;
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
2017-06-03 07:19:09 +00:00
|
|
|
function write_BrtWbProp(data/*:?WBProps*/, o) {
|
2017-05-09 18:07:57 +00:00
|
|
|
if(!o) o = new_buf(72);
|
2017-06-03 07:19:09 +00:00
|
|
|
var flags = 0;
|
|
|
|
if(data) {
|
|
|
|
/* TODO: mirror parse_BrtWbProp fields */
|
|
|
|
if(data.filterPrivacy) flags |= 0x08;
|
|
|
|
}
|
|
|
|
o.write_shift(4, flags);
|
2014-05-29 22:30:03 +00:00
|
|
|
o.write_shift(4, 0);
|
2017-11-20 01:51:14 +00:00
|
|
|
write_XLSBCodeName(data && data.CodeName || "ThisWorkbook", o);
|
2017-03-31 00:47:35 +00:00
|
|
|
return o.slice(0, o.l);
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
2014-05-29 22:30:03 +00:00
|
|
|
|
2014-06-29 18:29:45 +00:00
|
|
|
function parse_BrtFRTArchID$(data, length) {
|
2014-05-29 22:30:03 +00:00
|
|
|
var o = {};
|
|
|
|
data.read_shift(4);
|
|
|
|
o.ArchID = data.read_shift(4);
|
|
|
|
data.l += length - 8;
|
|
|
|
return o;
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
2014-01-28 16:38:02 +00:00
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.4.687 BrtName */
|
2017-02-19 20:36:32 +00:00
|
|
|
function parse_BrtName(data, length, opts) {
|
|
|
|
var end = data.l + length;
|
2018-01-23 09:07:51 +00:00
|
|
|
data.l += 4; //var flags = data.read_shift(4);
|
|
|
|
data.l += 1; //var chKey = data.read_shift(1);
|
2017-02-19 20:36:32 +00:00
|
|
|
var itab = data.read_shift(4);
|
|
|
|
var name = parse_XLNameWideString(data);
|
|
|
|
var formula = parse_XLSBNameParsedFormula(data, 0, opts);
|
|
|
|
var comment = parse_XLNullableWideString(data);
|
2017-03-31 00:47:35 +00:00
|
|
|
//if(0 /* fProc */) {
|
2017-02-19 20:36:32 +00:00
|
|
|
// unusedstring1: XLNullableWideString
|
|
|
|
// description: XLNullableWideString
|
|
|
|
// helpTopic: XLNullableWideString
|
|
|
|
// unusedstring2: XLNullableWideString
|
2017-03-31 00:47:35 +00:00
|
|
|
//}
|
2017-02-19 20:36:32 +00:00
|
|
|
data.l = end;
|
2017-12-15 01:18:40 +00:00
|
|
|
var out = ({Name:name, Ptg:formula}/*:any*/);
|
2017-04-11 22:15:36 +00:00
|
|
|
if(itab < 0xFFFFFFF) out.Sheet = itab;
|
2017-12-15 01:18:40 +00:00
|
|
|
if(comment) out.Comment = comment;
|
2017-04-11 22:15:36 +00:00
|
|
|
return out;
|
2017-02-19 20:36:32 +00:00
|
|
|
}
|
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.1.7.61 Workbook */
|
2017-03-12 18:02:43 +00:00
|
|
|
function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
2014-01-28 16:38:02 +00:00
|
|
|
var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
|
2018-01-23 09:07:51 +00:00
|
|
|
var pass = false;
|
2014-01-28 16:38:02 +00:00
|
|
|
|
2017-02-19 20:36:32 +00:00
|
|
|
if(!opts) opts = {};
|
|
|
|
opts.biff = 12;
|
|
|
|
|
2017-04-11 22:15:36 +00:00
|
|
|
var Names = [];
|
2017-11-15 18:14:02 +00:00
|
|
|
var supbooks = ([[]]/*:any*/);
|
2017-04-11 22:15:36 +00:00
|
|
|
supbooks.SheetNames = [];
|
2017-11-15 18:14:02 +00:00
|
|
|
supbooks.XTI = [];
|
2017-02-19 20:36:32 +00:00
|
|
|
|
2017-04-09 04:03:19 +00:00
|
|
|
recordhopper(data, function hopper_wb(val, R_n, RT) {
|
|
|
|
switch(RT) {
|
|
|
|
case 0x009C: /* 'BrtBundleSh' */
|
2017-04-11 22:15:36 +00:00
|
|
|
supbooks.SheetNames.push(val.name);
|
2017-04-09 04:03:19 +00:00
|
|
|
wb.Sheets.push(val); break;
|
2014-01-28 16:38:02 +00:00
|
|
|
|
2017-07-10 22:18:18 +00:00
|
|
|
case 0x0099: /* 'BrtWbProp' */
|
|
|
|
wb.WBProps = val; break;
|
|
|
|
|
2017-04-09 04:03:19 +00:00
|
|
|
case 0x0027: /* 'BrtName' */
|
2017-11-15 18:14:02 +00:00
|
|
|
if(val.Sheet != null) opts.SID = val.Sheet;
|
2017-04-11 22:15:36 +00:00
|
|
|
val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
|
2017-11-15 18:14:02 +00:00
|
|
|
delete opts.SID;
|
2017-04-11 22:15:36 +00:00
|
|
|
delete val.Ptg;
|
|
|
|
Names.push(val);
|
2017-02-19 20:36:32 +00:00
|
|
|
break;
|
2017-04-09 04:03:19 +00:00
|
|
|
case 0x040C: /* 'BrtNameExt' */ break;
|
|
|
|
|
2017-07-10 22:18:18 +00:00
|
|
|
case 0x0165: /* 'BrtSupSelf' */
|
|
|
|
case 0x0166: /* 'BrtSupSame' */
|
|
|
|
case 0x0163: /* 'BrtSupBookSrc' */
|
|
|
|
case 0x029B: /* 'BrtSupAddin' */
|
2017-11-15 18:14:02 +00:00
|
|
|
if(!supbooks[0].length) supbooks[0] = [RT, val];
|
|
|
|
else supbooks.push([RT, val]);
|
|
|
|
supbooks[supbooks.length - 1].XTI = [];
|
|
|
|
break;
|
2017-07-10 22:18:18 +00:00
|
|
|
case 0x016A: /* 'BrtExternSheet' */
|
2017-11-15 18:14:02 +00:00
|
|
|
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;
|
2017-07-10 22:18:18 +00:00
|
|
|
case 0x0169: /* 'BrtPlaceholderName' */
|
|
|
|
break;
|
2017-06-01 21:22:11 +00:00
|
|
|
|
2018-03-19 21:42:55 +00:00
|
|
|
/* case 'BrtModelTimeGroupingCalcCol' */
|
|
|
|
case 0x0C00: /* 'BrtUid' */
|
2018-03-19 15:27:35 +00:00
|
|
|
case 0x0C01: /* 'BrtRevisionPtr' */
|
2017-04-09 04:03:19 +00:00
|
|
|
case 0x0817: /* 'BrtAbsPath15' */
|
|
|
|
case 0x0216: /* 'BrtBookProtection' */
|
|
|
|
case 0x02A5: /* 'BrtBookProtectionIso' */
|
|
|
|
case 0x009E: /* 'BrtBookView' */
|
|
|
|
case 0x009D: /* 'BrtCalcProp' */
|
|
|
|
case 0x0262: /* 'BrtCrashRecErr' */
|
|
|
|
case 0x0802: /* 'BrtDecoupledPivotCacheID' */
|
|
|
|
case 0x009B: /* 'BrtFileRecover' */
|
|
|
|
case 0x0224: /* 'BrtFileSharing' */
|
|
|
|
case 0x02A4: /* 'BrtFileSharingIso' */
|
|
|
|
case 0x0080: /* 'BrtFileVersion' */
|
|
|
|
case 0x0299: /* 'BrtFnGroup' */
|
|
|
|
case 0x0850: /* 'BrtModelRelationship' */
|
|
|
|
case 0x084D: /* 'BrtModelTable' */
|
|
|
|
case 0x0225: /* 'BrtOleSize' */
|
|
|
|
case 0x0805: /* 'BrtPivotTableRef' */
|
|
|
|
case 0x0254: /* 'BrtSmartTagType' */
|
|
|
|
case 0x081C: /* 'BrtTableSlicerCacheID' */
|
|
|
|
case 0x081B: /* 'BrtTableSlicerCacheIDs' */
|
|
|
|
case 0x0822: /* 'BrtTimelineCachePivotCacheID' */
|
|
|
|
case 0x018D: /* 'BrtUserBookView' */
|
|
|
|
case 0x009A: /* 'BrtWbFactoid' */
|
|
|
|
case 0x045D: /* 'BrtWbProp14' */
|
|
|
|
case 0x0229: /* 'BrtWebOpt' */
|
|
|
|
case 0x082B: /* 'BrtWorkBookPr15' */
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x0023: /* 'BrtFRTBegin' */
|
|
|
|
pass = true; break;
|
|
|
|
case 0x0024: /* 'BrtFRTEnd' */
|
|
|
|
pass = false; break;
|
|
|
|
case 0x0025: /* 'BrtACBegin' */ break;
|
|
|
|
case 0x0026: /* 'BrtACEnd' */ break;
|
|
|
|
|
|
|
|
case 0x0010: /* 'BrtFRTArchID$' */ break;
|
|
|
|
|
2017-04-08 06:55:35 +00:00
|
|
|
default:
|
2017-05-09 18:07:57 +00:00
|
|
|
if((R_n||"").indexOf("Begin") > 0){/* empty */}
|
|
|
|
else if((R_n||"").indexOf("End") > 0){/* empty */}
|
2017-04-09 04:03:19 +00:00
|
|
|
else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
|
2014-01-28 16:38:02 +00:00
|
|
|
}
|
2017-02-19 20:36:32 +00:00
|
|
|
}, opts);
|
2014-01-28 16:38:02 +00:00
|
|
|
|
2014-06-29 18:29:45 +00:00
|
|
|
parse_wb_defaults(wb);
|
2014-01-28 16:38:02 +00:00
|
|
|
|
2017-03-12 18:02:43 +00:00
|
|
|
// $FlowIgnore
|
2017-02-19 20:36:32 +00:00
|
|
|
wb.Names = Names;
|
|
|
|
|
2017-11-15 18:14:02 +00:00
|
|
|
(wb/*:any*/).supbooks = supbooks;
|
2014-01-28 16:38:02 +00:00
|
|
|
return wb;
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
2014-05-16 00:33:34 +00:00
|
|
|
|
2018-01-23 09:07:51 +00:00
|
|
|
function write_BUNDLESHS(ba, wb/*::, opts*/) {
|
2014-05-29 22:30:03 +00:00
|
|
|
write_record(ba, "BrtBeginBundleShs");
|
2014-06-29 18:29:45 +00:00
|
|
|
for(var idx = 0; idx != wb.SheetNames.length; ++idx) {
|
2017-03-31 18:46:42 +00:00
|
|
|
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] };
|
2014-05-29 22:30:03 +00:00
|
|
|
write_record(ba, "BrtBundleSh", write_BrtBundleSh(d));
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|
2014-05-29 22:30:03 +00:00
|
|
|
write_record(ba, "BrtEndBundleShs");
|
|
|
|
}
|
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.4.649 BrtFileVersion */
|
2014-05-29 22:30:03 +00:00
|
|
|
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);
|
|
|
|
o.length = o.l;
|
2017-02-03 20:50:45 +00:00
|
|
|
return o.length > o.l ? o.slice(0, o.l) : o;
|
2014-05-29 22:30:03 +00:00
|
|
|
}
|
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.4.301 BrtBookView */
|
2017-03-31 18:46:42 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2018-01-23 09:07:51 +00:00
|
|
|
function write_BOOKVIEWS(ba, wb/*::, opts*/) {
|
2017-03-31 18:46:42 +00:00
|
|
|
/* required if hidden tab appears before visible tab */
|
|
|
|
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;
|
2014-05-29 22:30:03 +00:00
|
|
|
write_record(ba, "BrtBeginBookViews");
|
2017-03-31 18:46:42 +00:00
|
|
|
write_record(ba, "BrtBookView", write_BrtBookView(vistab));
|
2014-05-29 22:30:03 +00:00
|
|
|
/* 1*(BrtBookView *FRT) */
|
|
|
|
write_record(ba, "BrtEndBookViews");
|
|
|
|
}
|
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.4.305 BrtCalcProp */
|
2018-01-23 09:07:51 +00:00
|
|
|
/*function write_BrtCalcProp(data, o) {
|
2014-05-29 22:30:03 +00:00
|
|
|
if(!o) o = new_buf(26);
|
2018-01-23 09:07:51 +00:00
|
|
|
o.write_shift(4,0); // force recalc
|
2014-05-29 22:30:03 +00:00
|
|
|
o.write_shift(4,1);
|
|
|
|
o.write_shift(4,0);
|
|
|
|
write_Xnum(0, o);
|
|
|
|
o.write_shift(-4, 1023);
|
|
|
|
o.write_shift(1, 0x33);
|
|
|
|
o.write_shift(1, 0x00);
|
|
|
|
return o;
|
2018-01-23 09:07:51 +00:00
|
|
|
}*/
|
2014-05-29 22:30:03 +00:00
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.4.646 BrtFileRecover */
|
2018-01-23 09:07:51 +00:00
|
|
|
/*function write_BrtFileRecover(data, o) {
|
2014-05-29 22:30:03 +00:00
|
|
|
if(!o) o = new_buf(1);
|
|
|
|
o.write_shift(1,0);
|
|
|
|
return o;
|
2018-01-23 09:07:51 +00:00
|
|
|
}*/
|
2014-05-29 22:30:03 +00:00
|
|
|
|
2018-02-14 20:06:35 +00:00
|
|
|
/* [MS-XLSB] 2.1.7.61 Workbook */
|
2014-06-29 18:29:45 +00:00
|
|
|
function write_wb_bin(wb, opts) {
|
2014-05-29 22:30:03 +00:00
|
|
|
var ba = buf_array();
|
|
|
|
write_record(ba, "BrtBeginBook");
|
|
|
|
write_record(ba, "BrtFileVersion", write_BrtFileVersion());
|
|
|
|
/* [[BrtFileSharingIso] BrtFileSharing] */
|
2017-06-03 07:19:09 +00:00
|
|
|
write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
|
2014-05-29 22:30:03 +00:00
|
|
|
/* [ACABSPATH] */
|
|
|
|
/* [[BrtBookProtectionIso] BrtBookProtection] */
|
2017-03-31 18:46:42 +00:00
|
|
|
write_BOOKVIEWS(ba, wb, opts);
|
2014-05-29 22:30:03 +00:00
|
|
|
write_BUNDLESHS(ba, wb, opts);
|
|
|
|
/* [FNGROUP] */
|
|
|
|
/* [EXTERNALS] */
|
|
|
|
/* *BrtName */
|
2017-03-31 00:47:35 +00:00
|
|
|
/* write_record(ba, "BrtCalcProp", write_BrtCalcProp()); */
|
2014-05-29 22:30:03 +00:00
|
|
|
/* [BrtOleSize] */
|
|
|
|
/* *(BrtUserBookView *FRT) */
|
|
|
|
/* [PIVOTCACHEIDS] */
|
|
|
|
/* [BrtWbFactoid] */
|
|
|
|
/* [SMARTTAGTYPES] */
|
|
|
|
/* [BrtWebOpt] */
|
2017-03-31 00:47:35 +00:00
|
|
|
/* write_record(ba, "BrtFileRecover", write_BrtFileRecover()); */
|
2014-05-29 22:30:03 +00:00
|
|
|
/* [WEBPUBITEMS] */
|
|
|
|
/* [CRERRS] */
|
|
|
|
/* FRTWORKBOOK */
|
|
|
|
write_record(ba, "BrtEndBook");
|
2014-05-16 00:33:34 +00:00
|
|
|
|
2014-05-29 22:30:03 +00:00
|
|
|
return ba.end();
|
2014-06-29 18:29:45 +00:00
|
|
|
}
|