1
forked from sheetjs/sheetjs

version bump 0.17.1: short XLSB records

This commit is contained in:
SheetJS 2021-08-18 14:34:02 -04:00
parent 81b7614e45
commit 7468f3b635
22 changed files with 1052 additions and 290 deletions

@ -4,6 +4,10 @@ This log is intended to keep track of backwards-incompatible changes, including
but not limited to API changes and file location changes. Minor behavioral but not limited to API changes and file location changes. Minor behavioral
changes may not be included if they are not expected to break existing code. changes may not be included if they are not expected to break existing code.
## v0.17.1
* `XLSB` writer uses short cell form when viable
## v0.16.2 ## v0.16.2
* Disabled `PRN` parsing by default (better support for CSV without delimeters) * Disabled `PRN` parsing by default (better support for CSV without delimeters)

@ -1 +1 @@
XLSX.version = '0.17.0'; XLSX.version = '0.17.1';

@ -88,6 +88,19 @@ function write_XLSBCell(cell/*:any*/, o/*:?Block*/) {
return o; return o;
} }
/* Short XLSB Cell does not include column */
function parse_XLSBShortCell(data)/*:any*/ {
var iStyleRef = data.read_shift(2);
iStyleRef += data.read_shift(1) <<16;
data.l++; //var fPhShow = data.read_shift(1);
return { c:-1, iStyleRef: iStyleRef };
}
function write_XLSBShortCell(cell/*:any*/, o/*:?Block*/) {
if(o == null) o = new_buf(4);
o.write_shift(3, cell.iStyleRef || cell.s);
o.write_shift(1, 0); /* fPhShow */
return o;
}
/* [MS-XLSB] 2.5.21 */ /* [MS-XLSB] 2.5.21 */
var parse_XLSBCodeName = parse_XLWideString; var parse_XLSBCodeName = parse_XLWideString;

@ -397,6 +397,7 @@ var SYLK = (function() {
case 'C': case 'C':
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
@ -863,6 +864,7 @@ var PRN = (function() {
else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
sep = str.charAt(4); str = str.slice(6); sep = str.charAt(4); str = str.slice(6);
} }
else sep = guess_sep(str.slice(0,1024));
} }
else sep = guess_sep(str.slice(0,1024)); else sep = guess_sep(str.slice(0,1024));
var R = 0, C = 0, v = 0; var R = 0, C = 0, v = 0;

@ -103,7 +103,14 @@ function write_BrtCellBlank(cell, ncell, o) {
if(o == null) o = new_buf(8); if(o == null) o = new_buf(8);
return write_XLSBCell(ncell, o); 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 */ /* [MS-XLSB] 2.4.307 BrtCellBool */
function parse_BrtCellBool(data) { function parse_BrtCellBool(data) {
@ -117,6 +124,17 @@ function write_BrtCellBool(cell, ncell, o) {
o.write_shift(1, cell.v ? 1 : 0); o.write_shift(1, cell.v ? 1 : 0);
return o; 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 */ /* [MS-XLSB] 2.4.308 BrtCellError */
function parse_BrtCellError(data) { function parse_BrtCellError(data) {
@ -124,6 +142,26 @@ function parse_BrtCellError(data) {
var bError = data.read_shift(1); var bError = data.read_shift(1);
return [cell, bError, 'e']; 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 */ /* [MS-XLSB] 2.4.311 BrtCellIsst */
function parse_BrtCellIsst(data) { function parse_BrtCellIsst(data) {
@ -137,6 +175,17 @@ function write_BrtCellIsst(cell, ncell, o) {
o.write_shift(4, ncell.v); o.write_shift(4, ncell.v);
return o; 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 */ /* [MS-XLSB] 2.4.313 BrtCellReal */
function parse_BrtCellReal(data) { function parse_BrtCellReal(data) {
@ -150,6 +199,17 @@ function write_BrtCellReal(cell, ncell, o) {
write_Xnum(cell.v, o); write_Xnum(cell.v, o);
return 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 */ /* [MS-XLSB] 2.4.314 BrtCellRk */
function parse_BrtCellRk(data) { function parse_BrtCellRk(data) {
@ -163,6 +223,17 @@ function write_BrtCellRk(cell, ncell, o) {
write_RkNumber(cell.v, o); write_RkNumber(cell.v, o);
return 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.317 BrtCellSt */ /* [MS-XLSB] 2.4.317 BrtCellSt */
@ -177,6 +248,17 @@ function write_BrtCellSt(cell, ncell, o) {
write_XLWideString(cell.v, o); write_XLWideString(cell.v, o);
return o.length > o.l ? o.slice(0, o.l) : 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 */ /* [MS-XLSB] 2.4.653 BrtFmlaBool */
function parse_BrtFmlaBool(data, length, opts) { function parse_BrtFmlaBool(data, length, opts) {
@ -439,6 +521,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
var colinfo/*:Array<ColInfo>*/ = [], rowinfo/*:Array<RowInfo>*/ = []; var colinfo/*:Array<ColInfo>*/ = [], rowinfo/*:Array<RowInfo>*/ = [];
var seencol = false; var seencol = false;
XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
recordhopper(data, function ws_parse(val, R_n, RT) { recordhopper(data, function ws_parse(val, R_n, RT) {
if(end) return; if(end) return;
switch(RT) { switch(RT) {
@ -465,6 +549,12 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 0x0009: /* 'BrtFmlaNum' */ case 0x0009: /* 'BrtFmlaNum' */
case 0x000A: /* 'BrtFmlaBool' */ case 0x000A: /* 'BrtFmlaBool' */
case 0x000B: /* 'BrtFmlaError' */ case 0x000B: /* 'BrtFmlaError' */
case 0x000D: /* 'BrtShortRk' */
case 0x000E: /* 'BrtShortError' */
case 0x000F: /* 'BrtShortBool' */
case 0x0010: /* 'BrtShortReal' */
case 0x0011: /* 'BrtShortSt' */
case 0x0012: /* 'BrtShortIsst' */
p = ({t:val[2]}/*:any*/); p = ({t:val[2]}/*:any*/);
switch(val[2]) { switch(val[2]) {
case 'n': p.v = val[1]; break; case 'n': p.v = val[1]; break;
@ -474,7 +564,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 'str': p.t = 's'; p.v = val[1]; break; case 'str': p.t = 's'; p.v = val[1]; break;
} }
if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles); if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(opts.cellFormula) { if(opts.cellFormula) {
@ -498,9 +588,10 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
break; break;
case 0x0001: /* 'BrtCellBlank' */ case 0x0001: /* 'BrtCellBlank' */
case 0x000C: /* 'BrtShortBlank' */
if(!opts.sheetStubs || pass) break; if(!opts.sheetStubs || pass) break;
p = ({t:'z',v:undefined}/*:any*/); p = ({t:'z',v:undefined}/*:any*/);
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.r > row.r) refguess.s.r = row.r;
@ -586,6 +677,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 0x0097: /* 'BrtPane' */ case 0x0097: /* 'BrtPane' */
break; break;
case 0x0098: /* 'BrtSel' */
case 0x00AF: /* 'BrtAFilterDateGroupItem' */ case 0x00AF: /* 'BrtAFilterDateGroupItem' */
case 0x0284: /* 'BrtActiveX' */ case 0x0284: /* 'BrtActiveX' */
case 0x0271: /* 'BrtBigName' */ case 0x0271: /* 'BrtBigName' */
@ -625,7 +717,6 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 0x02A8: /* 'BrtRangeProtectionIso' */ case 0x02A8: /* 'BrtRangeProtectionIso' */
case 0x0450: /* 'BrtRangeProtectionIso14' */ case 0x0450: /* 'BrtRangeProtectionIso14' */
case 0x0400: /* 'BrtRwDescent' */ case 0x0400: /* 'BrtRwDescent' */
case 0x0098: /* 'BrtSel' */
case 0x0297: /* 'BrtSheetCalcProp' */ case 0x0297: /* 'BrtSheetCalcProp' */
case 0x0217: /* 'BrtSheetProtection' */ case 0x0217: /* 'BrtSheetProtection' */
case 0x02A6: /* 'BrtSheetProtectionIso' */ case 0x02A6: /* 'BrtSheetProtectionIso' */
@ -678,8 +769,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
} }
/* TODO: something useful -- this is a stub */ /* TODO: something useful -- this is a stub */
function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts, ws/*:Worksheet*/) { 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; if(cell.v === undefined) return false;
var vv = ""; var vv = "";
switch(cell.t) { switch(cell.t) {
case 'b': vv = cell.v ? "1" : "0"; break; case 'b': vv = cell.v ? "1" : "0"; break;
@ -702,24 +793,37 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num
if(opts.bookSST) { if(opts.bookSST) {
vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings); vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings);
o.t = "s"; o.v = vv; o.t = "s"; o.v = vv;
write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
} else { } else {
o.t = "str"; o.t = "str";
write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o)); if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
} }
return; return true;
case 'n': case 'n':
/* TODO: determine threshold for Real vs RK */ /* TODO: determine threshold for Real vs RK */
if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o)); if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o)); if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
return; 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': case 'b':
o.t = "b"; o.t = "b";
write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o)); if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
return; else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
case 'e': /* TODO: error */ o.t = "e"; break; 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;
} }
write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)); 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*/) { function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) {
@ -733,14 +837,15 @@ function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Work
/* [ACCELLTABLE] */ /* [ACCELLTABLE] */
/* BrtRowHdr */ /* BrtRowHdr */
write_row_header(ba, ws, range, 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.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
/* *16384CELL */ /* *16384CELL */
if(R === range.s.r) cols[C] = encode_col(C); if(R === range.s.r) cols[C] = encode_col(C);
ref = cols[C] + rr; ref = cols[C] + rr;
var cell = dense ? (ws[R]||[])[C] : ws[ref]; var cell = dense ? (ws[R]||[])[C] : ws[ref];
if(!cell) continue; if(!cell) { last_seen = false; continue; }
/* write cell */ /* write cell */
write_ws_bin_cell(ba, cell, R, C, opts, ws); last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
} }
} }
write_record(ba, 'BrtEndSheetData'); write_record(ba, 'BrtEndSheetData');

@ -97,6 +97,8 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
supbooks.SheetNames = []; supbooks.SheetNames = [];
supbooks.XTI = []; supbooks.XTI = [];
XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
recordhopper(data, function hopper_wb(val, R_n, RT) { recordhopper(data, function hopper_wb(val, R_n, RT) {
switch(RT) { switch(RT) {
case 0x009C: /* 'BrtBundleSh' */ case 0x009C: /* 'BrtBundleSh' */
@ -131,13 +133,18 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
case 0x0169: /* 'BrtPlaceholderName' */ case 0x0169: /* 'BrtPlaceholderName' */
break; break;
case 0x0817: /* 'BrtAbsPath15' */
case 0x009E: /* 'BrtBookView' */
case 0x008F: /* 'BrtBeginBundleShs' */
case 0x0298: /* 'BrtBeginFnGroup' */
case 0x0161: /* 'BrtBeginExternals' */
break;
/* case 'BrtModelTimeGroupingCalcCol' */ /* case 'BrtModelTimeGroupingCalcCol' */
case 0x0C00: /* 'BrtUid' */ case 0x0C00: /* 'BrtUid' */
case 0x0C01: /* 'BrtRevisionPtr' */ case 0x0C01: /* 'BrtRevisionPtr' */
case 0x0817: /* 'BrtAbsPath15' */
case 0x0216: /* 'BrtBookProtection' */ case 0x0216: /* 'BrtBookProtection' */
case 0x02A5: /* 'BrtBookProtectionIso' */ case 0x02A5: /* 'BrtBookProtectionIso' */
case 0x009E: /* 'BrtBookView' */
case 0x009D: /* 'BrtCalcProp' */ case 0x009D: /* 'BrtCalcProp' */
case 0x0262: /* 'BrtCrashRecErr' */ case 0x0262: /* 'BrtCrashRecErr' */
case 0x0802: /* 'BrtDecoupledPivotCacheID' */ case 0x0802: /* 'BrtDecoupledPivotCacheID' */

@ -12,7 +12,13 @@ var XLSBRecordEnum = {
/*::[*/0x0009/*::]*/: { n:"BrtFmlaNum", f:parse_BrtFmlaNum }, /*::[*/0x0009/*::]*/: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
/*::[*/0x000A/*::]*/: { n:"BrtFmlaBool", f:parse_BrtFmlaBool }, /*::[*/0x000A/*::]*/: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
/*::[*/0x000B/*::]*/: { n:"BrtFmlaError", f:parse_BrtFmlaError }, /*::[*/0x000B/*::]*/: { n:"BrtFmlaError", f:parse_BrtFmlaError },
/*::[*/0x0010/*::]*/: { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ }, /*::[*/0x000C/*::]*/: { n:"BrtShortBlank", f:parse_BrtShortBlank },
/*::[*/0x000D/*::]*/: { n:"BrtShortRk", f:parse_BrtShortRk },
/*::[*/0x000E/*::]*/: { n:"BrtShortError", f:parse_BrtShortError },
/*::[*/0x000F/*::]*/: { n:"BrtShortBool", f:parse_BrtShortBool },
/*::[*/0x0010/*::]*/: { n:"BrtShortReal", f:parse_BrtShortReal },
/*::[*/0x0011/*::]*/: { n:"BrtShortSt", f:parse_BrtShortSt },
/*::[*/0x0012/*::]*/: { n:"BrtShortIsst", f:parse_BrtShortIsst },
/*::[*/0x0013/*::]*/: { n:"BrtSSTItem", f:parse_RichStr }, /*::[*/0x0013/*::]*/: { n:"BrtSSTItem", f:parse_RichStr },
/*::[*/0x0014/*::]*/: { n:"BrtPCDIMissing" }, /*::[*/0x0014/*::]*/: { n:"BrtPCDIMissing" },
/*::[*/0x0015/*::]*/: { n:"BrtPCDINumber" }, /*::[*/0x0015/*::]*/: { n:"BrtPCDINumber" },
@ -836,6 +842,7 @@ var XLSBRecordEnum = {
}; };
var XLSBRE = evert_key(XLSBRecordEnum, 'n'); var XLSBRE = evert_key(XLSBRecordEnum, 'n');
XLSBRE["BrtFRTArchID$"] = 0x0010;
/* [MS-XLS] 2.3 Record Enumeration */ /* [MS-XLS] 2.3 Record Enumeration */
var XLSRecordEnum = { var XLSRecordEnum = {

32
dist/xlsx.core.min.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/xlsx.core.min.map generated vendored

File diff suppressed because one or more lines are too long

340
dist/xlsx.extendscript.js generated vendored

@ -9161,7 +9161,7 @@ module.exports = ZStream;
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.17.0'; XLSX.version = '0.17.1';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*global cptable:true, window */ /*global cptable:true, window */
if(typeof module !== "undefined" && typeof require !== 'undefined') { if(typeof module !== "undefined" && typeof require !== 'undefined') {
@ -13057,6 +13057,19 @@ function write_XLSBCell(cell, o) {
return o; return o;
} }
/* Short XLSB Cell does not include column */
function parse_XLSBShortCell(data) {
var iStyleRef = data.read_shift(2);
iStyleRef += data.read_shift(1) <<16;
data.l++; //var fPhShow = data.read_shift(1);
return { c:-1, iStyleRef: iStyleRef };
}
function write_XLSBShortCell(cell, o) {
if(o == null) o = new_buf(4);
o.write_shift(3, cell.iStyleRef || cell.s);
o.write_shift(1, 0); /* fPhShow */
return o;
}
/* [MS-XLSB] 2.5.21 */ /* [MS-XLSB] 2.5.21 */
var parse_XLSBCodeName = parse_XLWideString; var parse_XLSBCodeName = parse_XLWideString;
@ -16095,7 +16108,9 @@ var dbf_codepage_map = {
0x4D: 936, 0x4E: 949, 0x4D: 936, 0x4E: 949,
0x4F: 950, 0x50: 874, 0x4F: 950, 0x50: 874,
0x57: 1252, 0x58: 1252, 0x57: 1252, 0x58: 1252,
0x59: 1252, 0x59: 1252, 0x6C: 863,
0x86: 737, 0x87: 852,
0x88: 857, 0xCC: 1257,
0xFF: 16969 0xFF: 16969
}; };
@ -16119,7 +16134,6 @@ var DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];
/* TODO: find an actual specification */ /* TODO: find an actual specification */
function dbf_to_aoa(buf, opts) { function dbf_to_aoa(buf, opts) {
var out = []; var out = [];
/* TODO: browser based */
var d = (new_raw_buf(1)); var d = (new_raw_buf(1));
switch(opts.type) { switch(opts.type) {
case 'base64': d = s2a(Base64.decode(buf)); break; case 'base64': d = s2a(Base64.decode(buf)); break;
@ -16128,43 +16142,54 @@ function dbf_to_aoa(buf, opts) {
case 'array': d = buf; break; case 'array': d = buf; break;
} }
prep_blob(d, 0); prep_blob(d, 0);
/* header */ /* header */
var ft = d.read_shift(1); var ft = d.read_shift(1);
var memo = false; var memo = !!(ft & 0x88);
var vfp = false, l7 = false; var vfp = false, l7 = false;
switch(ft) { switch(ft) {
case 0x02: case 0x03: break; case 0x02: break; // dBASE II
case 0x30: vfp = true; memo = true; break; case 0x03: break; // dBASE III
case 0x31: vfp = true; break; case 0x30: vfp = true; memo = true; break; // VFP
case 0x83: memo = true; break; case 0x31: vfp = true; memo = true; break; // VFP with autoincrement
case 0x8B: memo = true; break; // 0x43 dBASE IV SQL table files
case 0x8C: memo = true; l7 = true; break; // 0x63 dBASE IV SQL system files
case 0xF5: memo = true; break; case 0x83: break; // dBASE III with memo
case 0x8B: break; // dBASE IV with memo
case 0x8C: l7 = true; break; // dBASE Level 7 with memo
// case 0xCB dBASE IV SQL table files with memo
case 0xF5: break; // FoxPro 2.x with memo
// case 0xFB FoxBASE
default: throw new Error("DBF Unsupported Version: " + ft.toString(16)); default: throw new Error("DBF Unsupported Version: " + ft.toString(16));
} }
var /*filedate = new Date(),*/ nrow = 0, fpos = 0;
var nrow = 0, fpos = 0x0209;
if(ft == 0x02) nrow = d.read_shift(2); if(ft == 0x02) nrow = d.read_shift(2);
/*filedate = new Date(d.read_shift(1) + 1900, d.read_shift(1) - 1, d.read_shift(1));*/d.l += 3; d.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD
if(ft != 0x02) nrow = d.read_shift(4); if(nrow > 1048576) nrow = 1e6; if(ft != 0x02) nrow = d.read_shift(4);
if(ft != 0x02) fpos = d.read_shift(2); if(nrow > 1048576) nrow = 1e6;
var rlen = d.read_shift(2);
var /*flags = 0,*/ current_cp = 1252; if(ft != 0x02) fpos = d.read_shift(2); // header length
if(ft != 0x02) { var rlen = d.read_shift(2); // record length
d.l+=16;
/*flags = */d.read_shift(1);
//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
/* codepage present in FoxPro */ var /*flags = 0,*/ current_cp = opts.codepage || 1252;
if(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]]; if(ft != 0x02) { // 20 reserved bytes
d.l+=1; d.l+=16;
/*flags = */d.read_shift(1);
//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
d.l+=2; /* codepage present in FoxPro and dBASE Level 7 */
if(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];
d.l+=1;
d.l+=2;
} }
if(l7) d.l += 36; if(l7) d.l += 36; // Level 7: 32 byte "Language driver name", 4 byte reserved
var fields = [], field = ({}); var fields = [], field = ({});
var hend = fpos - 10 - (vfp ? 264 : 0), ww = l7 ? 32 : 11; var hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0))));
while(ft == 0x02 ? d.l < d.length && d[d.l] != 0x0d: d.l < hend) { var ww = l7 ? 32 : 11;
while(d.l < hend && d[d.l] != 0x0d) {
field = ({}); field = ({});
field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\u0000\r\n].*$/g,""); field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\u0000\r\n].*$/g,"");
d.l += ww; d.l += ww;
@ -16176,42 +16201,45 @@ var fields = [], field = ({});
if(field.name.length) fields.push(field); if(field.name.length) fields.push(field);
if(ft != 0x02) d.l += l7 ? 13 : 14; if(ft != 0x02) d.l += l7 ? 13 : 14;
switch(field.type) { switch(field.type) {
case 'B': // VFP Double case 'B': // Double (VFP) / Binary (dBASE L7)
if((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type); if((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
break; break;
case 'G': // General case 'G': // General (FoxPro and dBASE L7)
case 'P': // Picture case 'P': // Picture (FoxPro and dBASE L7)
if(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type); if(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
break; break;
case 'C': // character case '+': // Autoincrement (dBASE L7 only)
case 'D': // date case '0': // _NullFlags (VFP only)
case 'F': // floating point case '@': // Timestamp (dBASE L7 only)
case 'I': // long case 'C': // Character (dBASE II)
case 'L': // boolean case 'D': // Date (dBASE III)
case 'M': // memo case 'F': // Float (dBASE IV)
case 'N': // number case 'I': // Long (VFP and dBASE L7)
case 'O': // double case 'L': // Logical (dBASE II)
case 'T': // datetime case 'M': // Memo (dBASE III)
case 'Y': // currency case 'N': // Number (dBASE II)
case '0': // VFP _NullFlags case 'O': // Double (dBASE L7 only)
case '@': // timestamp case 'T': // Datetime (VFP only)
case '+': // autoincrement case 'Y': // Currency (VFP only)
break; break;
default: throw new Error('Unknown Field Type: ' + field.type); default: throw new Error('Unknown Field Type: ' + field.type);
} }
} }
if(d[d.l] !== 0x0D) d.l = fpos-1; if(d[d.l] !== 0x0D) d.l = fpos-1;
else if(ft == 0x02) d.l = 0x209; if(d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
if(ft != 0x02) { d.l = fpos;
if(d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
d.l = fpos;
}
/* data */ /* data */
var R = 0, C = 0; var R = 0, C = 0;
out[0] = []; out[0] = [];
for(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name; for(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name;
while(nrow-- > 0) { while(nrow-- > 0) {
if(d[d.l] === 0x2A) { d.l+=rlen; continue; } if(d[d.l] === 0x2A) {
// TODO: record marked as deleted -- create a hidden row?
d.l+=rlen;
continue;
}
++d.l; ++d.l;
out[++R] = []; C = 0; out[++R] = []; C = 0;
for(C = 0; C != fields.length; ++C) { for(C = 0; C != fields.length; ++C) {
@ -16220,8 +16248,8 @@ var fields = [], field = ({});
var s = cptable.utils.decode(current_cp, dd); var s = cptable.utils.decode(current_cp, dd);
switch(fields[C].type) { switch(fields[C].type) {
case 'C': case 'C':
out[R][C] = cptable.utils.decode(current_cp, dd); // NOTE: it is conventional to write ' / / ' for empty dates
out[R][C] = out[R][C].trim(); if(s.trim().length) out[R][C] = s.replace(/\s+$/,"");
break; break;
case 'D': case 'D':
if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8)); if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8));
@ -16229,18 +16257,24 @@ var fields = [], field = ({});
break; break;
case 'F': out[R][C] = parseFloat(s.trim()); break; case 'F': out[R][C] = parseFloat(s.trim()); break;
case '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break; case '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break;
case 'L': switch(s.toUpperCase()) { case 'L': switch(s.trim().toUpperCase()) {
case 'Y': case 'T': out[R][C] = true; break; case 'Y': case 'T': out[R][C] = true; break;
case 'N': case 'F': out[R][C] = false; break; case 'N': case 'F': out[R][C] = false; break;
case ' ': case '?': out[R][C] = false; break; /* NOTE: technically uninitialized */ case '': case '?': break;
default: throw new Error("DBF Unrecognized L:|" + s + "|"); default: throw new Error("DBF Unrecognized L:|" + s + "|");
} break; } break;
case 'M': /* TODO: handle memo files */ case 'M': /* TODO: handle memo files */
if(!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16)); if(!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16));
out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4)); out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4));
break; break;
case 'N': out[R][C] = +s.replace(/\u0000/g,"").trim(); break; case 'N':
case '@': out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400); break; s = s.replace(/\u0000/g,"").trim();
// NOTE: dBASE II interprets " . " as 0
if(s && s != ".") out[R][C] = +s || 0; break;
case '@':
// NOTE: dBASE specs appear to be incorrect
out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
break;
case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break; case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break; case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break; case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
@ -16433,8 +16467,9 @@ var SYLK = (function() {
formats.push(rstr.slice(3).replace(/;;/g, ";")); formats.push(rstr.slice(3).replace(/;;/g, ";"));
break; break;
case 'C': case 'C':
var C_seen_K = false, C_seen_X = false; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
@ -16455,12 +16490,30 @@ var SYLK = (function() {
C_seen_K = true; C_seen_K = true;
break; break;
case 'E': case 'E':
C_seen_E = true;
var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C}); var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C});
arr[R][C] = [arr[R][C], formula]; arr[R][C] = [arr[R][C], formula];
break; break;
case 'S':
C_seen_S = true;
arr[R][C] = [arr[R][C], "S5S"];
break;
case 'G': break; // unknown
case 'R': _R = parseInt(record[rj].slice(1))-1; break;
case 'C': _C = parseInt(record[rj].slice(1))-1; break;
default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
} }
if(C_seen_K) { arr[R][C] = val; next_cell_format = null; } if(C_seen_K) {
if(arr[R][C] && arr[R][C].length == 2) arr[R][C][0] = val;
else arr[R][C] = val;
next_cell_format = null;
}
if(C_seen_S) {
if(C_seen_E) throw new Error("SYLK shared formula cannot have own formula");
var shrbase = _R > -1 && arr[_R][_C];
if(!shrbase || !shrbase[1]) throw new Error("SYLK shared formula cannot find base");
arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});
}
break; break;
case 'F': case 'F':
var F_seen = 0; var F_seen = 0;
@ -16795,9 +16848,9 @@ var ETH = (function() {
var PRN = (function() { var PRN = (function() {
function set_text_arr(data, arr, R, C, o) { function set_text_arr(data, arr, R, C, o) {
if(o.raw) arr[R][C] = data; if(o.raw) arr[R][C] = data;
else if(data === ""){/* empty */}
else if(data === 'TRUE') arr[R][C] = true; else if(data === 'TRUE') arr[R][C] = true;
else if(data === 'FALSE') arr[R][C] = false; else if(data === 'FALSE') arr[R][C] = false;
else if(data === ""){/* empty */}
else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data); else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);
else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data); else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);
else arr[R][C] = data; else arr[R][C] = data;
@ -16883,6 +16936,7 @@ var PRN = (function() {
else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
sep = str.charAt(4); str = str.slice(6); sep = str.charAt(4); str = str.slice(6);
} }
else sep = guess_sep(str.slice(0,1024));
} }
else sep = guess_sep(str.slice(0,1024)); else sep = guess_sep(str.slice(0,1024));
var R = 0, C = 0, v = 0; var R = 0, C = 0, v = 0;
@ -16956,7 +17010,7 @@ var PRN = (function() {
default: throw new Error("Unrecognized type " + opts.type); default: throw new Error("Unrecognized type " + opts.type);
} }
if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3)); if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));
else if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(1252,str)); else if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591,str));
if(str.slice(0,19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts); if(str.slice(0,19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);
return prn_to_sheet_str(str, opts); return prn_to_sheet_str(str, opts);
} }
@ -23092,7 +23146,14 @@ function write_BrtCellBlank(cell, ncell, o) {
if(o == null) o = new_buf(8); if(o == null) o = new_buf(8);
return write_XLSBCell(ncell, o); 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 */ /* [MS-XLSB] 2.4.307 BrtCellBool */
function parse_BrtCellBool(data) { function parse_BrtCellBool(data) {
@ -23106,6 +23167,17 @@ function write_BrtCellBool(cell, ncell, o) {
o.write_shift(1, cell.v ? 1 : 0); o.write_shift(1, cell.v ? 1 : 0);
return o; 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 */ /* [MS-XLSB] 2.4.308 BrtCellError */
function parse_BrtCellError(data) { function parse_BrtCellError(data) {
@ -23113,6 +23185,26 @@ function parse_BrtCellError(data) {
var bError = data.read_shift(1); var bError = data.read_shift(1);
return [cell, bError, 'e']; 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 */ /* [MS-XLSB] 2.4.311 BrtCellIsst */
function parse_BrtCellIsst(data) { function parse_BrtCellIsst(data) {
@ -23126,6 +23218,17 @@ function write_BrtCellIsst(cell, ncell, o) {
o.write_shift(4, ncell.v); o.write_shift(4, ncell.v);
return o; 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 */ /* [MS-XLSB] 2.4.313 BrtCellReal */
function parse_BrtCellReal(data) { function parse_BrtCellReal(data) {
@ -23139,6 +23242,17 @@ function write_BrtCellReal(cell, ncell, o) {
write_Xnum(cell.v, o); write_Xnum(cell.v, o);
return 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 */ /* [MS-XLSB] 2.4.314 BrtCellRk */
function parse_BrtCellRk(data) { function parse_BrtCellRk(data) {
@ -23152,6 +23266,17 @@ function write_BrtCellRk(cell, ncell, o) {
write_RkNumber(cell.v, o); write_RkNumber(cell.v, o);
return 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.317 BrtCellSt */ /* [MS-XLSB] 2.4.317 BrtCellSt */
@ -23166,6 +23291,17 @@ function write_BrtCellSt(cell, ncell, o) {
write_XLWideString(cell.v, o); write_XLWideString(cell.v, o);
return o.length > o.l ? o.slice(0, o.l) : 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 */ /* [MS-XLSB] 2.4.653 BrtFmlaBool */
function parse_BrtFmlaBool(data, length, opts) { function parse_BrtFmlaBool(data, length, opts) {
@ -23427,6 +23563,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
var colinfo = [], rowinfo = []; var colinfo = [], rowinfo = [];
var seencol = false; var seencol = false;
XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
recordhopper(data, function ws_parse(val, R_n, RT) { recordhopper(data, function ws_parse(val, R_n, RT) {
if(end) return; if(end) return;
switch(RT) { switch(RT) {
@ -23453,6 +23591,12 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x0009: /* 'BrtFmlaNum' */ case 0x0009: /* 'BrtFmlaNum' */
case 0x000A: /* 'BrtFmlaBool' */ case 0x000A: /* 'BrtFmlaBool' */
case 0x000B: /* 'BrtFmlaError' */ case 0x000B: /* 'BrtFmlaError' */
case 0x000D: /* 'BrtShortRk' */
case 0x000E: /* 'BrtShortError' */
case 0x000F: /* 'BrtShortBool' */
case 0x0010: /* 'BrtShortReal' */
case 0x0011: /* 'BrtShortSt' */
case 0x0012: /* 'BrtShortIsst' */
p = ({t:val[2]}); p = ({t:val[2]});
switch(val[2]) { switch(val[2]) {
case 'n': p.v = val[1]; break; case 'n': p.v = val[1]; break;
@ -23462,7 +23606,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 'str': p.t = 's'; p.v = val[1]; break; case 'str': p.t = 's'; p.v = val[1]; break;
} }
if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles); if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(opts.cellFormula) { if(opts.cellFormula) {
@ -23486,9 +23630,10 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
break; break;
case 0x0001: /* 'BrtCellBlank' */ case 0x0001: /* 'BrtCellBlank' */
case 0x000C: /* 'BrtShortBlank' */
if(!opts.sheetStubs || pass) break; if(!opts.sheetStubs || pass) break;
p = ({t:'z',v:undefined}); p = ({t:'z',v:undefined});
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.r > row.r) refguess.s.r = row.r;
@ -23574,6 +23719,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x0097: /* 'BrtPane' */ case 0x0097: /* 'BrtPane' */
break; break;
case 0x0098: /* 'BrtSel' */
case 0x00AF: /* 'BrtAFilterDateGroupItem' */ case 0x00AF: /* 'BrtAFilterDateGroupItem' */
case 0x0284: /* 'BrtActiveX' */ case 0x0284: /* 'BrtActiveX' */
case 0x0271: /* 'BrtBigName' */ case 0x0271: /* 'BrtBigName' */
@ -23613,7 +23759,6 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x02A8: /* 'BrtRangeProtectionIso' */ case 0x02A8: /* 'BrtRangeProtectionIso' */
case 0x0450: /* 'BrtRangeProtectionIso14' */ case 0x0450: /* 'BrtRangeProtectionIso14' */
case 0x0400: /* 'BrtRwDescent' */ case 0x0400: /* 'BrtRwDescent' */
case 0x0098: /* 'BrtSel' */
case 0x0297: /* 'BrtSheetCalcProp' */ case 0x0297: /* 'BrtSheetCalcProp' */
case 0x0217: /* 'BrtSheetProtection' */ case 0x0217: /* 'BrtSheetProtection' */
case 0x02A6: /* 'BrtSheetProtectionIso' */ case 0x02A6: /* 'BrtSheetProtectionIso' */
@ -23666,8 +23811,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
} }
/* TODO: something useful -- this is a stub */ /* TODO: something useful -- this is a stub */
function write_ws_bin_cell(ba, cell, R, C, opts, ws) { function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {
if(cell.v === undefined) return; if(cell.v === undefined) return false;
var vv = ""; var vv = "";
switch(cell.t) { switch(cell.t) {
case 'b': vv = cell.v ? "1" : "0"; break; case 'b': vv = cell.v ? "1" : "0"; break;
@ -23690,24 +23835,37 @@ function write_ws_bin_cell(ba, cell, R, C, opts, ws) {
if(opts.bookSST) { if(opts.bookSST) {
vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings); vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);
o.t = "s"; o.v = vv; o.t = "s"; o.v = vv;
write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
} else { } else {
o.t = "str"; o.t = "str";
write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o)); if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
} }
return; return true;
case 'n': case 'n':
/* TODO: determine threshold for Real vs RK */ /* TODO: determine threshold for Real vs RK */
if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o)); if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o)); if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
return; 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': case 'b':
o.t = "b"; o.t = "b";
write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o)); if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
return; else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
case 'e': /* TODO: error */ o.t = "e"; break; 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;
} }
write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)); 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) { function write_CELLTABLE(ba, ws, idx, opts) {
@ -23721,14 +23879,15 @@ function write_CELLTABLE(ba, ws, idx, opts) {
/* [ACCELLTABLE] */ /* [ACCELLTABLE] */
/* BrtRowHdr */ /* BrtRowHdr */
write_row_header(ba, ws, range, 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.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
/* *16384CELL */ /* *16384CELL */
if(R === range.s.r) cols[C] = encode_col(C); if(R === range.s.r) cols[C] = encode_col(C);
ref = cols[C] + rr; ref = cols[C] + rr;
var cell = dense ? (ws[R]||[])[C] : ws[ref]; var cell = dense ? (ws[R]||[])[C] : ws[ref];
if(!cell) continue; if(!cell) { last_seen = false; continue; }
/* write cell */ /* write cell */
write_ws_bin_cell(ba, cell, R, C, opts, ws); last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
} }
} }
write_record(ba, 'BrtEndSheetData'); write_record(ba, 'BrtEndSheetData');
@ -24524,6 +24683,8 @@ function parse_wb_bin(data, opts) {
supbooks.SheetNames = []; supbooks.SheetNames = [];
supbooks.XTI = []; supbooks.XTI = [];
XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
recordhopper(data, function hopper_wb(val, R_n, RT) { recordhopper(data, function hopper_wb(val, R_n, RT) {
switch(RT) { switch(RT) {
case 0x009C: /* 'BrtBundleSh' */ case 0x009C: /* 'BrtBundleSh' */
@ -24558,13 +24719,18 @@ function parse_wb_bin(data, opts) {
case 0x0169: /* 'BrtPlaceholderName' */ case 0x0169: /* 'BrtPlaceholderName' */
break; break;
case 0x0817: /* 'BrtAbsPath15' */
case 0x009E: /* 'BrtBookView' */
case 0x008F: /* 'BrtBeginBundleShs' */
case 0x0298: /* 'BrtBeginFnGroup' */
case 0x0161: /* 'BrtBeginExternals' */
break;
/* case 'BrtModelTimeGroupingCalcCol' */ /* case 'BrtModelTimeGroupingCalcCol' */
case 0x0C00: /* 'BrtUid' */ case 0x0C00: /* 'BrtUid' */
case 0x0C01: /* 'BrtRevisionPtr' */ case 0x0C01: /* 'BrtRevisionPtr' */
case 0x0817: /* 'BrtAbsPath15' */
case 0x0216: /* 'BrtBookProtection' */ case 0x0216: /* 'BrtBookProtection' */
case 0x02A5: /* 'BrtBookProtectionIso' */ case 0x02A5: /* 'BrtBookProtectionIso' */
case 0x009E: /* 'BrtBookView' */
case 0x009D: /* 'BrtCalcProp' */ case 0x009D: /* 'BrtCalcProp' */
case 0x0262: /* 'BrtCrashRecErr' */ case 0x0262: /* 'BrtCrashRecErr' */
case 0x0802: /* 'BrtDecoupledPivotCacheID' */ case 0x0802: /* 'BrtDecoupledPivotCacheID' */
@ -26997,7 +27163,13 @@ var XLSBRecordEnum = {
0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum }, 0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool }, 0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError }, 0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError },
0x0010: { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ }, 0x000C: { n:"BrtShortBlank", f:parse_BrtShortBlank },
0x000D: { n:"BrtShortRk", f:parse_BrtShortRk },
0x000E: { n:"BrtShortError", f:parse_BrtShortError },
0x000F: { n:"BrtShortBool", f:parse_BrtShortBool },
0x0010: { n:"BrtShortReal", f:parse_BrtShortReal },
0x0011: { n:"BrtShortSt", f:parse_BrtShortSt },
0x0012: { n:"BrtShortIsst", f:parse_BrtShortIsst },
0x0013: { n:"BrtSSTItem", f:parse_RichStr }, 0x0013: { n:"BrtSSTItem", f:parse_RichStr },
0x0014: { n:"BrtPCDIMissing" }, 0x0014: { n:"BrtPCDIMissing" },
0x0015: { n:"BrtPCDINumber" }, 0x0015: { n:"BrtPCDINumber" },
@ -27821,6 +27993,7 @@ var XLSBRecordEnum = {
}; };
var XLSBRE = evert_key(XLSBRecordEnum, 'n'); var XLSBRE = evert_key(XLSBRecordEnum, 'n');
XLSBRE["BrtFRTArchID$"] = 0x0010;
/* [MS-XLS] 2.3 Record Enumeration */ /* [MS-XLS] 2.3 Record Enumeration */
var XLSRecordEnum = { var XLSRecordEnum = {
@ -30184,7 +30357,10 @@ function readSync(data, opts) {
case 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break; case 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break;
case 0x09: if(n[1] <= 0x04) return parse_xlscfb(d, o); break; case 0x09: if(n[1] <= 0x04) return parse_xlscfb(d, o); break;
case 0x3C: return parse_xlml(d, o); case 0x3C: return parse_xlml(d, o);
case 0x49: if(n[1] === 0x44) return read_wb_ID(d, o); break; case 0x49:
if(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error("TIFF Image File is not a spreadsheet");
if(n[1] === 0x44) return read_wb_ID(d, o);
break;
case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break; case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;
case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str); case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);
case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str); case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);

30
dist/xlsx.full.min.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/xlsx.full.min.map generated vendored

File diff suppressed because one or more lines are too long

340
dist/xlsx.js generated vendored

@ -4,7 +4,7 @@
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.17.0'; XLSX.version = '0.17.1';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*global cptable:true, window */ /*global cptable:true, window */
if(typeof module !== "undefined" && typeof require !== 'undefined') { if(typeof module !== "undefined" && typeof require !== 'undefined') {
@ -3900,6 +3900,19 @@ function write_XLSBCell(cell, o) {
return o; return o;
} }
/* Short XLSB Cell does not include column */
function parse_XLSBShortCell(data) {
var iStyleRef = data.read_shift(2);
iStyleRef += data.read_shift(1) <<16;
data.l++; //var fPhShow = data.read_shift(1);
return { c:-1, iStyleRef: iStyleRef };
}
function write_XLSBShortCell(cell, o) {
if(o == null) o = new_buf(4);
o.write_shift(3, cell.iStyleRef || cell.s);
o.write_shift(1, 0); /* fPhShow */
return o;
}
/* [MS-XLSB] 2.5.21 */ /* [MS-XLSB] 2.5.21 */
var parse_XLSBCodeName = parse_XLWideString; var parse_XLSBCodeName = parse_XLWideString;
@ -6938,7 +6951,9 @@ var dbf_codepage_map = {
0x4D: 936, 0x4E: 949, 0x4D: 936, 0x4E: 949,
0x4F: 950, 0x50: 874, 0x4F: 950, 0x50: 874,
0x57: 1252, 0x58: 1252, 0x57: 1252, 0x58: 1252,
0x59: 1252, 0x59: 1252, 0x6C: 863,
0x86: 737, 0x87: 852,
0x88: 857, 0xCC: 1257,
0xFF: 16969 0xFF: 16969
}; };
@ -6962,7 +6977,6 @@ var DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];
/* TODO: find an actual specification */ /* TODO: find an actual specification */
function dbf_to_aoa(buf, opts) { function dbf_to_aoa(buf, opts) {
var out = []; var out = [];
/* TODO: browser based */
var d = (new_raw_buf(1)); var d = (new_raw_buf(1));
switch(opts.type) { switch(opts.type) {
case 'base64': d = s2a(Base64.decode(buf)); break; case 'base64': d = s2a(Base64.decode(buf)); break;
@ -6971,43 +6985,54 @@ function dbf_to_aoa(buf, opts) {
case 'array': d = buf; break; case 'array': d = buf; break;
} }
prep_blob(d, 0); prep_blob(d, 0);
/* header */ /* header */
var ft = d.read_shift(1); var ft = d.read_shift(1);
var memo = false; var memo = !!(ft & 0x88);
var vfp = false, l7 = false; var vfp = false, l7 = false;
switch(ft) { switch(ft) {
case 0x02: case 0x03: break; case 0x02: break; // dBASE II
case 0x30: vfp = true; memo = true; break; case 0x03: break; // dBASE III
case 0x31: vfp = true; break; case 0x30: vfp = true; memo = true; break; // VFP
case 0x83: memo = true; break; case 0x31: vfp = true; memo = true; break; // VFP with autoincrement
case 0x8B: memo = true; break; // 0x43 dBASE IV SQL table files
case 0x8C: memo = true; l7 = true; break; // 0x63 dBASE IV SQL system files
case 0xF5: memo = true; break; case 0x83: break; // dBASE III with memo
case 0x8B: break; // dBASE IV with memo
case 0x8C: l7 = true; break; // dBASE Level 7 with memo
// case 0xCB dBASE IV SQL table files with memo
case 0xF5: break; // FoxPro 2.x with memo
// case 0xFB FoxBASE
default: throw new Error("DBF Unsupported Version: " + ft.toString(16)); default: throw new Error("DBF Unsupported Version: " + ft.toString(16));
} }
var /*filedate = new Date(),*/ nrow = 0, fpos = 0;
var nrow = 0, fpos = 0x0209;
if(ft == 0x02) nrow = d.read_shift(2); if(ft == 0x02) nrow = d.read_shift(2);
/*filedate = new Date(d.read_shift(1) + 1900, d.read_shift(1) - 1, d.read_shift(1));*/d.l += 3; d.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD
if(ft != 0x02) nrow = d.read_shift(4); if(nrow > 1048576) nrow = 1e6; if(ft != 0x02) nrow = d.read_shift(4);
if(ft != 0x02) fpos = d.read_shift(2); if(nrow > 1048576) nrow = 1e6;
var rlen = d.read_shift(2);
var /*flags = 0,*/ current_cp = 1252; if(ft != 0x02) fpos = d.read_shift(2); // header length
if(ft != 0x02) { var rlen = d.read_shift(2); // record length
d.l+=16;
/*flags = */d.read_shift(1);
//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
/* codepage present in FoxPro */ var /*flags = 0,*/ current_cp = opts.codepage || 1252;
if(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]]; if(ft != 0x02) { // 20 reserved bytes
d.l+=1; d.l+=16;
/*flags = */d.read_shift(1);
//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
d.l+=2; /* codepage present in FoxPro and dBASE Level 7 */
if(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];
d.l+=1;
d.l+=2;
} }
if(l7) d.l += 36; if(l7) d.l += 36; // Level 7: 32 byte "Language driver name", 4 byte reserved
var fields = [], field = ({}); var fields = [], field = ({});
var hend = fpos - 10 - (vfp ? 264 : 0), ww = l7 ? 32 : 11; var hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0))));
while(ft == 0x02 ? d.l < d.length && d[d.l] != 0x0d: d.l < hend) { var ww = l7 ? 32 : 11;
while(d.l < hend && d[d.l] != 0x0d) {
field = ({}); field = ({});
field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\u0000\r\n].*$/g,""); field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\u0000\r\n].*$/g,"");
d.l += ww; d.l += ww;
@ -7019,42 +7044,45 @@ var fields = [], field = ({});
if(field.name.length) fields.push(field); if(field.name.length) fields.push(field);
if(ft != 0x02) d.l += l7 ? 13 : 14; if(ft != 0x02) d.l += l7 ? 13 : 14;
switch(field.type) { switch(field.type) {
case 'B': // VFP Double case 'B': // Double (VFP) / Binary (dBASE L7)
if((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type); if((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
break; break;
case 'G': // General case 'G': // General (FoxPro and dBASE L7)
case 'P': // Picture case 'P': // Picture (FoxPro and dBASE L7)
if(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type); if(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
break; break;
case 'C': // character case '+': // Autoincrement (dBASE L7 only)
case 'D': // date case '0': // _NullFlags (VFP only)
case 'F': // floating point case '@': // Timestamp (dBASE L7 only)
case 'I': // long case 'C': // Character (dBASE II)
case 'L': // boolean case 'D': // Date (dBASE III)
case 'M': // memo case 'F': // Float (dBASE IV)
case 'N': // number case 'I': // Long (VFP and dBASE L7)
case 'O': // double case 'L': // Logical (dBASE II)
case 'T': // datetime case 'M': // Memo (dBASE III)
case 'Y': // currency case 'N': // Number (dBASE II)
case '0': // VFP _NullFlags case 'O': // Double (dBASE L7 only)
case '@': // timestamp case 'T': // Datetime (VFP only)
case '+': // autoincrement case 'Y': // Currency (VFP only)
break; break;
default: throw new Error('Unknown Field Type: ' + field.type); default: throw new Error('Unknown Field Type: ' + field.type);
} }
} }
if(d[d.l] !== 0x0D) d.l = fpos-1; if(d[d.l] !== 0x0D) d.l = fpos-1;
else if(ft == 0x02) d.l = 0x209; if(d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
if(ft != 0x02) { d.l = fpos;
if(d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
d.l = fpos;
}
/* data */ /* data */
var R = 0, C = 0; var R = 0, C = 0;
out[0] = []; out[0] = [];
for(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name; for(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name;
while(nrow-- > 0) { while(nrow-- > 0) {
if(d[d.l] === 0x2A) { d.l+=rlen; continue; } if(d[d.l] === 0x2A) {
// TODO: record marked as deleted -- create a hidden row?
d.l+=rlen;
continue;
}
++d.l; ++d.l;
out[++R] = []; C = 0; out[++R] = []; C = 0;
for(C = 0; C != fields.length; ++C) { for(C = 0; C != fields.length; ++C) {
@ -7063,8 +7091,8 @@ var fields = [], field = ({});
var s = cptable.utils.decode(current_cp, dd); var s = cptable.utils.decode(current_cp, dd);
switch(fields[C].type) { switch(fields[C].type) {
case 'C': case 'C':
out[R][C] = cptable.utils.decode(current_cp, dd); // NOTE: it is conventional to write ' / / ' for empty dates
out[R][C] = out[R][C].trim(); if(s.trim().length) out[R][C] = s.replace(/\s+$/,"");
break; break;
case 'D': case 'D':
if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8)); if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8));
@ -7072,18 +7100,24 @@ var fields = [], field = ({});
break; break;
case 'F': out[R][C] = parseFloat(s.trim()); break; case 'F': out[R][C] = parseFloat(s.trim()); break;
case '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break; case '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break;
case 'L': switch(s.toUpperCase()) { case 'L': switch(s.trim().toUpperCase()) {
case 'Y': case 'T': out[R][C] = true; break; case 'Y': case 'T': out[R][C] = true; break;
case 'N': case 'F': out[R][C] = false; break; case 'N': case 'F': out[R][C] = false; break;
case ' ': case '?': out[R][C] = false; break; /* NOTE: technically uninitialized */ case '': case '?': break;
default: throw new Error("DBF Unrecognized L:|" + s + "|"); default: throw new Error("DBF Unrecognized L:|" + s + "|");
} break; } break;
case 'M': /* TODO: handle memo files */ case 'M': /* TODO: handle memo files */
if(!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16)); if(!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16));
out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4)); out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4));
break; break;
case 'N': out[R][C] = +s.replace(/\u0000/g,"").trim(); break; case 'N':
case '@': out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400); break; s = s.replace(/\u0000/g,"").trim();
// NOTE: dBASE II interprets " . " as 0
if(s && s != ".") out[R][C] = +s || 0; break;
case '@':
// NOTE: dBASE specs appear to be incorrect
out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
break;
case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break; case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break; case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break; case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
@ -7276,8 +7310,9 @@ var SYLK = (function() {
formats.push(rstr.slice(3).replace(/;;/g, ";")); formats.push(rstr.slice(3).replace(/;;/g, ";"));
break; break;
case 'C': case 'C':
var C_seen_K = false, C_seen_X = false; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
@ -7298,12 +7333,30 @@ var SYLK = (function() {
C_seen_K = true; C_seen_K = true;
break; break;
case 'E': case 'E':
C_seen_E = true;
var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C}); var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C});
arr[R][C] = [arr[R][C], formula]; arr[R][C] = [arr[R][C], formula];
break; break;
case 'S':
C_seen_S = true;
arr[R][C] = [arr[R][C], "S5S"];
break;
case 'G': break; // unknown
case 'R': _R = parseInt(record[rj].slice(1))-1; break;
case 'C': _C = parseInt(record[rj].slice(1))-1; break;
default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
} }
if(C_seen_K) { arr[R][C] = val; next_cell_format = null; } if(C_seen_K) {
if(arr[R][C] && arr[R][C].length == 2) arr[R][C][0] = val;
else arr[R][C] = val;
next_cell_format = null;
}
if(C_seen_S) {
if(C_seen_E) throw new Error("SYLK shared formula cannot have own formula");
var shrbase = _R > -1 && arr[_R][_C];
if(!shrbase || !shrbase[1]) throw new Error("SYLK shared formula cannot find base");
arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});
}
break; break;
case 'F': case 'F':
var F_seen = 0; var F_seen = 0;
@ -7638,9 +7691,9 @@ var ETH = (function() {
var PRN = (function() { var PRN = (function() {
function set_text_arr(data, arr, R, C, o) { function set_text_arr(data, arr, R, C, o) {
if(o.raw) arr[R][C] = data; if(o.raw) arr[R][C] = data;
else if(data === ""){/* empty */}
else if(data === 'TRUE') arr[R][C] = true; else if(data === 'TRUE') arr[R][C] = true;
else if(data === 'FALSE') arr[R][C] = false; else if(data === 'FALSE') arr[R][C] = false;
else if(data === ""){/* empty */}
else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data); else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);
else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data); else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);
else arr[R][C] = data; else arr[R][C] = data;
@ -7726,6 +7779,7 @@ var PRN = (function() {
else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
sep = str.charAt(4); str = str.slice(6); sep = str.charAt(4); str = str.slice(6);
} }
else sep = guess_sep(str.slice(0,1024));
} }
else sep = guess_sep(str.slice(0,1024)); else sep = guess_sep(str.slice(0,1024));
var R = 0, C = 0, v = 0; var R = 0, C = 0, v = 0;
@ -7799,7 +7853,7 @@ var PRN = (function() {
default: throw new Error("Unrecognized type " + opts.type); default: throw new Error("Unrecognized type " + opts.type);
} }
if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3)); if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));
else if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(1252,str)); else if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591,str));
if(str.slice(0,19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts); if(str.slice(0,19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);
return prn_to_sheet_str(str, opts); return prn_to_sheet_str(str, opts);
} }
@ -13935,7 +13989,14 @@ function write_BrtCellBlank(cell, ncell, o) {
if(o == null) o = new_buf(8); if(o == null) o = new_buf(8);
return write_XLSBCell(ncell, o); 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 */ /* [MS-XLSB] 2.4.307 BrtCellBool */
function parse_BrtCellBool(data) { function parse_BrtCellBool(data) {
@ -13949,6 +14010,17 @@ function write_BrtCellBool(cell, ncell, o) {
o.write_shift(1, cell.v ? 1 : 0); o.write_shift(1, cell.v ? 1 : 0);
return o; 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 */ /* [MS-XLSB] 2.4.308 BrtCellError */
function parse_BrtCellError(data) { function parse_BrtCellError(data) {
@ -13956,6 +14028,26 @@ function parse_BrtCellError(data) {
var bError = data.read_shift(1); var bError = data.read_shift(1);
return [cell, bError, 'e']; 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 */ /* [MS-XLSB] 2.4.311 BrtCellIsst */
function parse_BrtCellIsst(data) { function parse_BrtCellIsst(data) {
@ -13969,6 +14061,17 @@ function write_BrtCellIsst(cell, ncell, o) {
o.write_shift(4, ncell.v); o.write_shift(4, ncell.v);
return o; 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 */ /* [MS-XLSB] 2.4.313 BrtCellReal */
function parse_BrtCellReal(data) { function parse_BrtCellReal(data) {
@ -13982,6 +14085,17 @@ function write_BrtCellReal(cell, ncell, o) {
write_Xnum(cell.v, o); write_Xnum(cell.v, o);
return 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 */ /* [MS-XLSB] 2.4.314 BrtCellRk */
function parse_BrtCellRk(data) { function parse_BrtCellRk(data) {
@ -13995,6 +14109,17 @@ function write_BrtCellRk(cell, ncell, o) {
write_RkNumber(cell.v, o); write_RkNumber(cell.v, o);
return 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.317 BrtCellSt */ /* [MS-XLSB] 2.4.317 BrtCellSt */
@ -14009,6 +14134,17 @@ function write_BrtCellSt(cell, ncell, o) {
write_XLWideString(cell.v, o); write_XLWideString(cell.v, o);
return o.length > o.l ? o.slice(0, o.l) : 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 */ /* [MS-XLSB] 2.4.653 BrtFmlaBool */
function parse_BrtFmlaBool(data, length, opts) { function parse_BrtFmlaBool(data, length, opts) {
@ -14270,6 +14406,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
var colinfo = [], rowinfo = []; var colinfo = [], rowinfo = [];
var seencol = false; var seencol = false;
XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
recordhopper(data, function ws_parse(val, R_n, RT) { recordhopper(data, function ws_parse(val, R_n, RT) {
if(end) return; if(end) return;
switch(RT) { switch(RT) {
@ -14296,6 +14434,12 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x0009: /* 'BrtFmlaNum' */ case 0x0009: /* 'BrtFmlaNum' */
case 0x000A: /* 'BrtFmlaBool' */ case 0x000A: /* 'BrtFmlaBool' */
case 0x000B: /* 'BrtFmlaError' */ case 0x000B: /* 'BrtFmlaError' */
case 0x000D: /* 'BrtShortRk' */
case 0x000E: /* 'BrtShortError' */
case 0x000F: /* 'BrtShortBool' */
case 0x0010: /* 'BrtShortReal' */
case 0x0011: /* 'BrtShortSt' */
case 0x0012: /* 'BrtShortIsst' */
p = ({t:val[2]}); p = ({t:val[2]});
switch(val[2]) { switch(val[2]) {
case 'n': p.v = val[1]; break; case 'n': p.v = val[1]; break;
@ -14305,7 +14449,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 'str': p.t = 's'; p.v = val[1]; break; case 'str': p.t = 's'; p.v = val[1]; break;
} }
if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles); if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(opts.cellFormula) { if(opts.cellFormula) {
@ -14329,9 +14473,10 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
break; break;
case 0x0001: /* 'BrtCellBlank' */ case 0x0001: /* 'BrtCellBlank' */
case 0x000C: /* 'BrtShortBlank' */
if(!opts.sheetStubs || pass) break; if(!opts.sheetStubs || pass) break;
p = ({t:'z',v:undefined}); p = ({t:'z',v:undefined});
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.r > row.r) refguess.s.r = row.r;
@ -14417,6 +14562,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x0097: /* 'BrtPane' */ case 0x0097: /* 'BrtPane' */
break; break;
case 0x0098: /* 'BrtSel' */
case 0x00AF: /* 'BrtAFilterDateGroupItem' */ case 0x00AF: /* 'BrtAFilterDateGroupItem' */
case 0x0284: /* 'BrtActiveX' */ case 0x0284: /* 'BrtActiveX' */
case 0x0271: /* 'BrtBigName' */ case 0x0271: /* 'BrtBigName' */
@ -14456,7 +14602,6 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x02A8: /* 'BrtRangeProtectionIso' */ case 0x02A8: /* 'BrtRangeProtectionIso' */
case 0x0450: /* 'BrtRangeProtectionIso14' */ case 0x0450: /* 'BrtRangeProtectionIso14' */
case 0x0400: /* 'BrtRwDescent' */ case 0x0400: /* 'BrtRwDescent' */
case 0x0098: /* 'BrtSel' */
case 0x0297: /* 'BrtSheetCalcProp' */ case 0x0297: /* 'BrtSheetCalcProp' */
case 0x0217: /* 'BrtSheetProtection' */ case 0x0217: /* 'BrtSheetProtection' */
case 0x02A6: /* 'BrtSheetProtectionIso' */ case 0x02A6: /* 'BrtSheetProtectionIso' */
@ -14509,8 +14654,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
} }
/* TODO: something useful -- this is a stub */ /* TODO: something useful -- this is a stub */
function write_ws_bin_cell(ba, cell, R, C, opts, ws) { function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {
if(cell.v === undefined) return; if(cell.v === undefined) return false;
var vv = ""; var vv = "";
switch(cell.t) { switch(cell.t) {
case 'b': vv = cell.v ? "1" : "0"; break; case 'b': vv = cell.v ? "1" : "0"; break;
@ -14533,24 +14678,37 @@ function write_ws_bin_cell(ba, cell, R, C, opts, ws) {
if(opts.bookSST) { if(opts.bookSST) {
vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings); vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);
o.t = "s"; o.v = vv; o.t = "s"; o.v = vv;
write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
} else { } else {
o.t = "str"; o.t = "str";
write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o)); if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
} }
return; return true;
case 'n': case 'n':
/* TODO: determine threshold for Real vs RK */ /* TODO: determine threshold for Real vs RK */
if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o)); if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o)); if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
return; 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': case 'b':
o.t = "b"; o.t = "b";
write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o)); if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
return; else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
case 'e': /* TODO: error */ o.t = "e"; break; 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;
} }
write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)); 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) { function write_CELLTABLE(ba, ws, idx, opts) {
@ -14564,14 +14722,15 @@ function write_CELLTABLE(ba, ws, idx, opts) {
/* [ACCELLTABLE] */ /* [ACCELLTABLE] */
/* BrtRowHdr */ /* BrtRowHdr */
write_row_header(ba, ws, range, 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.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
/* *16384CELL */ /* *16384CELL */
if(R === range.s.r) cols[C] = encode_col(C); if(R === range.s.r) cols[C] = encode_col(C);
ref = cols[C] + rr; ref = cols[C] + rr;
var cell = dense ? (ws[R]||[])[C] : ws[ref]; var cell = dense ? (ws[R]||[])[C] : ws[ref];
if(!cell) continue; if(!cell) { last_seen = false; continue; }
/* write cell */ /* write cell */
write_ws_bin_cell(ba, cell, R, C, opts, ws); last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
} }
} }
write_record(ba, 'BrtEndSheetData'); write_record(ba, 'BrtEndSheetData');
@ -15367,6 +15526,8 @@ function parse_wb_bin(data, opts) {
supbooks.SheetNames = []; supbooks.SheetNames = [];
supbooks.XTI = []; supbooks.XTI = [];
XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
recordhopper(data, function hopper_wb(val, R_n, RT) { recordhopper(data, function hopper_wb(val, R_n, RT) {
switch(RT) { switch(RT) {
case 0x009C: /* 'BrtBundleSh' */ case 0x009C: /* 'BrtBundleSh' */
@ -15401,13 +15562,18 @@ function parse_wb_bin(data, opts) {
case 0x0169: /* 'BrtPlaceholderName' */ case 0x0169: /* 'BrtPlaceholderName' */
break; break;
case 0x0817: /* 'BrtAbsPath15' */
case 0x009E: /* 'BrtBookView' */
case 0x008F: /* 'BrtBeginBundleShs' */
case 0x0298: /* 'BrtBeginFnGroup' */
case 0x0161: /* 'BrtBeginExternals' */
break;
/* case 'BrtModelTimeGroupingCalcCol' */ /* case 'BrtModelTimeGroupingCalcCol' */
case 0x0C00: /* 'BrtUid' */ case 0x0C00: /* 'BrtUid' */
case 0x0C01: /* 'BrtRevisionPtr' */ case 0x0C01: /* 'BrtRevisionPtr' */
case 0x0817: /* 'BrtAbsPath15' */
case 0x0216: /* 'BrtBookProtection' */ case 0x0216: /* 'BrtBookProtection' */
case 0x02A5: /* 'BrtBookProtectionIso' */ case 0x02A5: /* 'BrtBookProtectionIso' */
case 0x009E: /* 'BrtBookView' */
case 0x009D: /* 'BrtCalcProp' */ case 0x009D: /* 'BrtCalcProp' */
case 0x0262: /* 'BrtCrashRecErr' */ case 0x0262: /* 'BrtCrashRecErr' */
case 0x0802: /* 'BrtDecoupledPivotCacheID' */ case 0x0802: /* 'BrtDecoupledPivotCacheID' */
@ -17840,7 +18006,13 @@ var XLSBRecordEnum = {
0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum }, 0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool }, 0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError }, 0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError },
0x0010: { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ }, 0x000C: { n:"BrtShortBlank", f:parse_BrtShortBlank },
0x000D: { n:"BrtShortRk", f:parse_BrtShortRk },
0x000E: { n:"BrtShortError", f:parse_BrtShortError },
0x000F: { n:"BrtShortBool", f:parse_BrtShortBool },
0x0010: { n:"BrtShortReal", f:parse_BrtShortReal },
0x0011: { n:"BrtShortSt", f:parse_BrtShortSt },
0x0012: { n:"BrtShortIsst", f:parse_BrtShortIsst },
0x0013: { n:"BrtSSTItem", f:parse_RichStr }, 0x0013: { n:"BrtSSTItem", f:parse_RichStr },
0x0014: { n:"BrtPCDIMissing" }, 0x0014: { n:"BrtPCDIMissing" },
0x0015: { n:"BrtPCDINumber" }, 0x0015: { n:"BrtPCDINumber" },
@ -18664,6 +18836,7 @@ var XLSBRecordEnum = {
}; };
var XLSBRE = evert_key(XLSBRecordEnum, 'n'); var XLSBRE = evert_key(XLSBRecordEnum, 'n');
XLSBRE["BrtFRTArchID$"] = 0x0010;
/* [MS-XLS] 2.3 Record Enumeration */ /* [MS-XLS] 2.3 Record Enumeration */
var XLSRecordEnum = { var XLSRecordEnum = {
@ -21027,7 +21200,10 @@ function readSync(data, opts) {
case 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break; case 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break;
case 0x09: if(n[1] <= 0x04) return parse_xlscfb(d, o); break; case 0x09: if(n[1] <= 0x04) return parse_xlscfb(d, o); break;
case 0x3C: return parse_xlml(d, o); case 0x3C: return parse_xlml(d, o);
case 0x49: if(n[1] === 0x44) return read_wb_ID(d, o); break; case 0x49:
if(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error("TIFF Image File is not a spreadsheet");
if(n[1] === 0x44) return read_wb_ID(d, o);
break;
case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break; case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;
case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str); case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);
case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str); case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);

28
dist/xlsx.min.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/xlsx.min.map generated vendored

File diff suppressed because one or more lines are too long

16
dist/xlsx.mini.min.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/xlsx.mini.min.map generated vendored

File diff suppressed because one or more lines are too long

@ -1,6 +1,6 @@
{ {
"name": "xlsx", "name": "xlsx",
"version": "0.17.0", "version": "0.17.1",
"author": "sheetjs", "author": "sheetjs",
"description": "SheetJS Spreadsheet data parser and writer", "description": "SheetJS Spreadsheet data parser and writer",
"keywords": [ "keywords": [

@ -4,7 +4,7 @@
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.17.0'; XLSX.version = '0.17.1';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*:: declare var cptable:any; */ /*:: declare var cptable:any; */
/*global cptable:true, window */ /*global cptable:true, window */
@ -3993,6 +3993,19 @@ function write_XLSBCell(cell/*:any*/, o/*:?Block*/) {
return o; return o;
} }
/* Short XLSB Cell does not include column */
function parse_XLSBShortCell(data)/*:any*/ {
var iStyleRef = data.read_shift(2);
iStyleRef += data.read_shift(1) <<16;
data.l++; //var fPhShow = data.read_shift(1);
return { c:-1, iStyleRef: iStyleRef };
}
function write_XLSBShortCell(cell/*:any*/, o/*:?Block*/) {
if(o == null) o = new_buf(4);
o.write_shift(3, cell.iStyleRef || cell.s);
o.write_shift(1, 0); /* fPhShow */
return o;
}
/* [MS-XLSB] 2.5.21 */ /* [MS-XLSB] 2.5.21 */
var parse_XLSBCodeName = parse_XLWideString; var parse_XLSBCodeName = parse_XLWideString;
@ -7397,6 +7410,7 @@ var SYLK = (function() {
case 'C': case 'C':
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
@ -7863,6 +7877,7 @@ var PRN = (function() {
else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
sep = str.charAt(4); str = str.slice(6); sep = str.charAt(4); str = str.slice(6);
} }
else sep = guess_sep(str.slice(0,1024));
} }
else sep = guess_sep(str.slice(0,1024)); else sep = guess_sep(str.slice(0,1024));
var R = 0, C = 0, v = 0; var R = 0, C = 0, v = 0;
@ -14076,7 +14091,14 @@ function write_BrtCellBlank(cell, ncell, o) {
if(o == null) o = new_buf(8); if(o == null) o = new_buf(8);
return write_XLSBCell(ncell, o); 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 */ /* [MS-XLSB] 2.4.307 BrtCellBool */
function parse_BrtCellBool(data) { function parse_BrtCellBool(data) {
@ -14090,6 +14112,17 @@ function write_BrtCellBool(cell, ncell, o) {
o.write_shift(1, cell.v ? 1 : 0); o.write_shift(1, cell.v ? 1 : 0);
return o; 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 */ /* [MS-XLSB] 2.4.308 BrtCellError */
function parse_BrtCellError(data) { function parse_BrtCellError(data) {
@ -14097,6 +14130,26 @@ function parse_BrtCellError(data) {
var bError = data.read_shift(1); var bError = data.read_shift(1);
return [cell, bError, 'e']; 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 */ /* [MS-XLSB] 2.4.311 BrtCellIsst */
function parse_BrtCellIsst(data) { function parse_BrtCellIsst(data) {
@ -14110,6 +14163,17 @@ function write_BrtCellIsst(cell, ncell, o) {
o.write_shift(4, ncell.v); o.write_shift(4, ncell.v);
return o; 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 */ /* [MS-XLSB] 2.4.313 BrtCellReal */
function parse_BrtCellReal(data) { function parse_BrtCellReal(data) {
@ -14123,6 +14187,17 @@ function write_BrtCellReal(cell, ncell, o) {
write_Xnum(cell.v, o); write_Xnum(cell.v, o);
return 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 */ /* [MS-XLSB] 2.4.314 BrtCellRk */
function parse_BrtCellRk(data) { function parse_BrtCellRk(data) {
@ -14136,6 +14211,17 @@ function write_BrtCellRk(cell, ncell, o) {
write_RkNumber(cell.v, o); write_RkNumber(cell.v, o);
return 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.317 BrtCellSt */ /* [MS-XLSB] 2.4.317 BrtCellSt */
@ -14150,6 +14236,17 @@ function write_BrtCellSt(cell, ncell, o) {
write_XLWideString(cell.v, o); write_XLWideString(cell.v, o);
return o.length > o.l ? o.slice(0, o.l) : 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 */ /* [MS-XLSB] 2.4.653 BrtFmlaBool */
function parse_BrtFmlaBool(data, length, opts) { function parse_BrtFmlaBool(data, length, opts) {
@ -14412,6 +14509,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
var colinfo/*:Array<ColInfo>*/ = [], rowinfo/*:Array<RowInfo>*/ = []; var colinfo/*:Array<ColInfo>*/ = [], rowinfo/*:Array<RowInfo>*/ = [];
var seencol = false; var seencol = false;
XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
recordhopper(data, function ws_parse(val, R_n, RT) { recordhopper(data, function ws_parse(val, R_n, RT) {
if(end) return; if(end) return;
switch(RT) { switch(RT) {
@ -14438,6 +14537,12 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 0x0009: /* 'BrtFmlaNum' */ case 0x0009: /* 'BrtFmlaNum' */
case 0x000A: /* 'BrtFmlaBool' */ case 0x000A: /* 'BrtFmlaBool' */
case 0x000B: /* 'BrtFmlaError' */ case 0x000B: /* 'BrtFmlaError' */
case 0x000D: /* 'BrtShortRk' */
case 0x000E: /* 'BrtShortError' */
case 0x000F: /* 'BrtShortBool' */
case 0x0010: /* 'BrtShortReal' */
case 0x0011: /* 'BrtShortSt' */
case 0x0012: /* 'BrtShortIsst' */
p = ({t:val[2]}/*:any*/); p = ({t:val[2]}/*:any*/);
switch(val[2]) { switch(val[2]) {
case 'n': p.v = val[1]; break; case 'n': p.v = val[1]; break;
@ -14447,7 +14552,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 'str': p.t = 's'; p.v = val[1]; break; case 'str': p.t = 's'; p.v = val[1]; break;
} }
if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles); if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(opts.cellFormula) { if(opts.cellFormula) {
@ -14471,9 +14576,10 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
break; break;
case 0x0001: /* 'BrtCellBlank' */ case 0x0001: /* 'BrtCellBlank' */
case 0x000C: /* 'BrtShortBlank' */
if(!opts.sheetStubs || pass) break; if(!opts.sheetStubs || pass) break;
p = ({t:'z',v:undefined}/*:any*/); p = ({t:'z',v:undefined}/*:any*/);
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.r > row.r) refguess.s.r = row.r;
@ -14559,6 +14665,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 0x0097: /* 'BrtPane' */ case 0x0097: /* 'BrtPane' */
break; break;
case 0x0098: /* 'BrtSel' */
case 0x00AF: /* 'BrtAFilterDateGroupItem' */ case 0x00AF: /* 'BrtAFilterDateGroupItem' */
case 0x0284: /* 'BrtActiveX' */ case 0x0284: /* 'BrtActiveX' */
case 0x0271: /* 'BrtBigName' */ case 0x0271: /* 'BrtBigName' */
@ -14598,7 +14705,6 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
case 0x02A8: /* 'BrtRangeProtectionIso' */ case 0x02A8: /* 'BrtRangeProtectionIso' */
case 0x0450: /* 'BrtRangeProtectionIso14' */ case 0x0450: /* 'BrtRangeProtectionIso14' */
case 0x0400: /* 'BrtRwDescent' */ case 0x0400: /* 'BrtRwDescent' */
case 0x0098: /* 'BrtSel' */
case 0x0297: /* 'BrtSheetCalcProp' */ case 0x0297: /* 'BrtSheetCalcProp' */
case 0x0217: /* 'BrtSheetProtection' */ case 0x0217: /* 'BrtSheetProtection' */
case 0x02A6: /* 'BrtSheetProtectionIso' */ case 0x02A6: /* 'BrtSheetProtectionIso' */
@ -14651,8 +14757,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
} }
/* TODO: something useful -- this is a stub */ /* TODO: something useful -- this is a stub */
function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts, ws/*:Worksheet*/) { 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; if(cell.v === undefined) return false;
var vv = ""; var vv = "";
switch(cell.t) { switch(cell.t) {
case 'b': vv = cell.v ? "1" : "0"; break; case 'b': vv = cell.v ? "1" : "0"; break;
@ -14675,24 +14781,37 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num
if(opts.bookSST) { if(opts.bookSST) {
vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings); vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings);
o.t = "s"; o.v = vv; o.t = "s"; o.v = vv;
write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
} else { } else {
o.t = "str"; o.t = "str";
write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o)); if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
} }
return; return true;
case 'n': case 'n':
/* TODO: determine threshold for Real vs RK */ /* TODO: determine threshold for Real vs RK */
if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o)); if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o)); if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
return; 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': case 'b':
o.t = "b"; o.t = "b";
write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o)); if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
return; else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
case 'e': /* TODO: error */ o.t = "e"; break; 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;
} }
write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)); 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*/) { function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) {
@ -14706,14 +14825,15 @@ function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Work
/* [ACCELLTABLE] */ /* [ACCELLTABLE] */
/* BrtRowHdr */ /* BrtRowHdr */
write_row_header(ba, ws, range, 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.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
/* *16384CELL */ /* *16384CELL */
if(R === range.s.r) cols[C] = encode_col(C); if(R === range.s.r) cols[C] = encode_col(C);
ref = cols[C] + rr; ref = cols[C] + rr;
var cell = dense ? (ws[R]||[])[C] : ws[ref]; var cell = dense ? (ws[R]||[])[C] : ws[ref];
if(!cell) continue; if(!cell) { last_seen = false; continue; }
/* write cell */ /* write cell */
write_ws_bin_cell(ba, cell, R, C, opts, ws); last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
} }
} }
write_record(ba, 'BrtEndSheetData'); write_record(ba, 'BrtEndSheetData');
@ -15511,6 +15631,8 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
supbooks.SheetNames = []; supbooks.SheetNames = [];
supbooks.XTI = []; supbooks.XTI = [];
XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
recordhopper(data, function hopper_wb(val, R_n, RT) { recordhopper(data, function hopper_wb(val, R_n, RT) {
switch(RT) { switch(RT) {
case 0x009C: /* 'BrtBundleSh' */ case 0x009C: /* 'BrtBundleSh' */
@ -15545,13 +15667,18 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
case 0x0169: /* 'BrtPlaceholderName' */ case 0x0169: /* 'BrtPlaceholderName' */
break; break;
case 0x0817: /* 'BrtAbsPath15' */
case 0x009E: /* 'BrtBookView' */
case 0x008F: /* 'BrtBeginBundleShs' */
case 0x0298: /* 'BrtBeginFnGroup' */
case 0x0161: /* 'BrtBeginExternals' */
break;
/* case 'BrtModelTimeGroupingCalcCol' */ /* case 'BrtModelTimeGroupingCalcCol' */
case 0x0C00: /* 'BrtUid' */ case 0x0C00: /* 'BrtUid' */
case 0x0C01: /* 'BrtRevisionPtr' */ case 0x0C01: /* 'BrtRevisionPtr' */
case 0x0817: /* 'BrtAbsPath15' */
case 0x0216: /* 'BrtBookProtection' */ case 0x0216: /* 'BrtBookProtection' */
case 0x02A5: /* 'BrtBookProtectionIso' */ case 0x02A5: /* 'BrtBookProtectionIso' */
case 0x009E: /* 'BrtBookView' */
case 0x009D: /* 'BrtCalcProp' */ case 0x009D: /* 'BrtCalcProp' */
case 0x0262: /* 'BrtCrashRecErr' */ case 0x0262: /* 'BrtCrashRecErr' */
case 0x0802: /* 'BrtDecoupledPivotCacheID' */ case 0x0802: /* 'BrtDecoupledPivotCacheID' */
@ -17996,7 +18123,13 @@ var XLSBRecordEnum = {
/*::[*/0x0009/*::]*/: { n:"BrtFmlaNum", f:parse_BrtFmlaNum }, /*::[*/0x0009/*::]*/: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
/*::[*/0x000A/*::]*/: { n:"BrtFmlaBool", f:parse_BrtFmlaBool }, /*::[*/0x000A/*::]*/: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
/*::[*/0x000B/*::]*/: { n:"BrtFmlaError", f:parse_BrtFmlaError }, /*::[*/0x000B/*::]*/: { n:"BrtFmlaError", f:parse_BrtFmlaError },
/*::[*/0x0010/*::]*/: { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ }, /*::[*/0x000C/*::]*/: { n:"BrtShortBlank", f:parse_BrtShortBlank },
/*::[*/0x000D/*::]*/: { n:"BrtShortRk", f:parse_BrtShortRk },
/*::[*/0x000E/*::]*/: { n:"BrtShortError", f:parse_BrtShortError },
/*::[*/0x000F/*::]*/: { n:"BrtShortBool", f:parse_BrtShortBool },
/*::[*/0x0010/*::]*/: { n:"BrtShortReal", f:parse_BrtShortReal },
/*::[*/0x0011/*::]*/: { n:"BrtShortSt", f:parse_BrtShortSt },
/*::[*/0x0012/*::]*/: { n:"BrtShortIsst", f:parse_BrtShortIsst },
/*::[*/0x0013/*::]*/: { n:"BrtSSTItem", f:parse_RichStr }, /*::[*/0x0013/*::]*/: { n:"BrtSSTItem", f:parse_RichStr },
/*::[*/0x0014/*::]*/: { n:"BrtPCDIMissing" }, /*::[*/0x0014/*::]*/: { n:"BrtPCDIMissing" },
/*::[*/0x0015/*::]*/: { n:"BrtPCDINumber" }, /*::[*/0x0015/*::]*/: { n:"BrtPCDINumber" },
@ -18820,6 +18953,7 @@ var XLSBRecordEnum = {
}; };
var XLSBRE = evert_key(XLSBRecordEnum, 'n'); var XLSBRE = evert_key(XLSBRecordEnum, 'n');
XLSBRE["BrtFRTArchID$"] = 0x0010;
/* [MS-XLS] 2.3 Record Enumeration */ /* [MS-XLS] 2.3 Record Enumeration */
var XLSRecordEnum = { var XLSRecordEnum = {

178
xlsx.js generated

@ -4,7 +4,7 @@
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.17.0'; XLSX.version = '0.17.1';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*global cptable:true, window */ /*global cptable:true, window */
if(typeof module !== "undefined" && typeof require !== 'undefined') { if(typeof module !== "undefined" && typeof require !== 'undefined') {
@ -3900,6 +3900,19 @@ function write_XLSBCell(cell, o) {
return o; return o;
} }
/* Short XLSB Cell does not include column */
function parse_XLSBShortCell(data) {
var iStyleRef = data.read_shift(2);
iStyleRef += data.read_shift(1) <<16;
data.l++; //var fPhShow = data.read_shift(1);
return { c:-1, iStyleRef: iStyleRef };
}
function write_XLSBShortCell(cell, o) {
if(o == null) o = new_buf(4);
o.write_shift(3, cell.iStyleRef || cell.s);
o.write_shift(1, 0); /* fPhShow */
return o;
}
/* [MS-XLSB] 2.5.21 */ /* [MS-XLSB] 2.5.21 */
var parse_XLSBCodeName = parse_XLWideString; var parse_XLSBCodeName = parse_XLWideString;
@ -7299,6 +7312,7 @@ var SYLK = (function() {
case 'C': case 'C':
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
@ -7765,6 +7779,7 @@ var PRN = (function() {
else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
sep = str.charAt(4); str = str.slice(6); sep = str.charAt(4); str = str.slice(6);
} }
else sep = guess_sep(str.slice(0,1024));
} }
else sep = guess_sep(str.slice(0,1024)); else sep = guess_sep(str.slice(0,1024));
var R = 0, C = 0, v = 0; var R = 0, C = 0, v = 0;
@ -13974,7 +13989,14 @@ function write_BrtCellBlank(cell, ncell, o) {
if(o == null) o = new_buf(8); if(o == null) o = new_buf(8);
return write_XLSBCell(ncell, o); 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 */ /* [MS-XLSB] 2.4.307 BrtCellBool */
function parse_BrtCellBool(data) { function parse_BrtCellBool(data) {
@ -13988,6 +14010,17 @@ function write_BrtCellBool(cell, ncell, o) {
o.write_shift(1, cell.v ? 1 : 0); o.write_shift(1, cell.v ? 1 : 0);
return o; 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 */ /* [MS-XLSB] 2.4.308 BrtCellError */
function parse_BrtCellError(data) { function parse_BrtCellError(data) {
@ -13995,6 +14028,26 @@ function parse_BrtCellError(data) {
var bError = data.read_shift(1); var bError = data.read_shift(1);
return [cell, bError, 'e']; 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 */ /* [MS-XLSB] 2.4.311 BrtCellIsst */
function parse_BrtCellIsst(data) { function parse_BrtCellIsst(data) {
@ -14008,6 +14061,17 @@ function write_BrtCellIsst(cell, ncell, o) {
o.write_shift(4, ncell.v); o.write_shift(4, ncell.v);
return o; 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 */ /* [MS-XLSB] 2.4.313 BrtCellReal */
function parse_BrtCellReal(data) { function parse_BrtCellReal(data) {
@ -14021,6 +14085,17 @@ function write_BrtCellReal(cell, ncell, o) {
write_Xnum(cell.v, o); write_Xnum(cell.v, o);
return 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 */ /* [MS-XLSB] 2.4.314 BrtCellRk */
function parse_BrtCellRk(data) { function parse_BrtCellRk(data) {
@ -14034,6 +14109,17 @@ function write_BrtCellRk(cell, ncell, o) {
write_RkNumber(cell.v, o); write_RkNumber(cell.v, o);
return 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.317 BrtCellSt */ /* [MS-XLSB] 2.4.317 BrtCellSt */
@ -14048,6 +14134,17 @@ function write_BrtCellSt(cell, ncell, o) {
write_XLWideString(cell.v, o); write_XLWideString(cell.v, o);
return o.length > o.l ? o.slice(0, o.l) : 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 */ /* [MS-XLSB] 2.4.653 BrtFmlaBool */
function parse_BrtFmlaBool(data, length, opts) { function parse_BrtFmlaBool(data, length, opts) {
@ -14309,6 +14406,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
var colinfo = [], rowinfo = []; var colinfo = [], rowinfo = [];
var seencol = false; var seencol = false;
XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
recordhopper(data, function ws_parse(val, R_n, RT) { recordhopper(data, function ws_parse(val, R_n, RT) {
if(end) return; if(end) return;
switch(RT) { switch(RT) {
@ -14335,6 +14434,12 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x0009: /* 'BrtFmlaNum' */ case 0x0009: /* 'BrtFmlaNum' */
case 0x000A: /* 'BrtFmlaBool' */ case 0x000A: /* 'BrtFmlaBool' */
case 0x000B: /* 'BrtFmlaError' */ case 0x000B: /* 'BrtFmlaError' */
case 0x000D: /* 'BrtShortRk' */
case 0x000E: /* 'BrtShortError' */
case 0x000F: /* 'BrtShortBool' */
case 0x0010: /* 'BrtShortReal' */
case 0x0011: /* 'BrtShortSt' */
case 0x0012: /* 'BrtShortIsst' */
p = ({t:val[2]}); p = ({t:val[2]});
switch(val[2]) { switch(val[2]) {
case 'n': p.v = val[1]; break; case 'n': p.v = val[1]; break;
@ -14344,7 +14449,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 'str': p.t = 's'; p.v = val[1]; break; case 'str': p.t = 's'; p.v = val[1]; break;
} }
if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles); if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(opts.cellFormula) { if(opts.cellFormula) {
@ -14368,9 +14473,10 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
break; break;
case 0x0001: /* 'BrtCellBlank' */ case 0x0001: /* 'BrtCellBlank' */
case 0x000C: /* 'BrtShortBlank' */
if(!opts.sheetStubs || pass) break; if(!opts.sheetStubs || pass) break;
p = ({t:'z',v:undefined}); p = ({t:'z',v:undefined});
C = val[0].c; C = val[0].c == -1 ? C + 1 : val[0].c;
if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
else s[encode_col(C) + rr] = p; else s[encode_col(C) + rr] = p;
if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.r > row.r) refguess.s.r = row.r;
@ -14456,6 +14562,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x0097: /* 'BrtPane' */ case 0x0097: /* 'BrtPane' */
break; break;
case 0x0098: /* 'BrtSel' */
case 0x00AF: /* 'BrtAFilterDateGroupItem' */ case 0x00AF: /* 'BrtAFilterDateGroupItem' */
case 0x0284: /* 'BrtActiveX' */ case 0x0284: /* 'BrtActiveX' */
case 0x0271: /* 'BrtBigName' */ case 0x0271: /* 'BrtBigName' */
@ -14495,7 +14602,6 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
case 0x02A8: /* 'BrtRangeProtectionIso' */ case 0x02A8: /* 'BrtRangeProtectionIso' */
case 0x0450: /* 'BrtRangeProtectionIso14' */ case 0x0450: /* 'BrtRangeProtectionIso14' */
case 0x0400: /* 'BrtRwDescent' */ case 0x0400: /* 'BrtRwDescent' */
case 0x0098: /* 'BrtSel' */
case 0x0297: /* 'BrtSheetCalcProp' */ case 0x0297: /* 'BrtSheetCalcProp' */
case 0x0217: /* 'BrtSheetProtection' */ case 0x0217: /* 'BrtSheetProtection' */
case 0x02A6: /* 'BrtSheetProtectionIso' */ case 0x02A6: /* 'BrtSheetProtectionIso' */
@ -14548,8 +14654,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
} }
/* TODO: something useful -- this is a stub */ /* TODO: something useful -- this is a stub */
function write_ws_bin_cell(ba, cell, R, C, opts, ws) { function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {
if(cell.v === undefined) return; if(cell.v === undefined) return false;
var vv = ""; var vv = "";
switch(cell.t) { switch(cell.t) {
case 'b': vv = cell.v ? "1" : "0"; break; case 'b': vv = cell.v ? "1" : "0"; break;
@ -14572,24 +14678,37 @@ function write_ws_bin_cell(ba, cell, R, C, opts, ws) {
if(opts.bookSST) { if(opts.bookSST) {
vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings); vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);
o.t = "s"; o.v = vv; o.t = "s"; o.v = vv;
write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
} else { } else {
o.t = "str"; o.t = "str";
write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o)); if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
} }
return; return true;
case 'n': case 'n':
/* TODO: determine threshold for Real vs RK */ /* TODO: determine threshold for Real vs RK */
if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o)); if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o)); if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
return; 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': case 'b':
o.t = "b"; o.t = "b";
write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o)); if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
return; else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
case 'e': /* TODO: error */ o.t = "e"; break; 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;
} }
write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)); 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) { function write_CELLTABLE(ba, ws, idx, opts) {
@ -14603,14 +14722,15 @@ function write_CELLTABLE(ba, ws, idx, opts) {
/* [ACCELLTABLE] */ /* [ACCELLTABLE] */
/* BrtRowHdr */ /* BrtRowHdr */
write_row_header(ba, ws, range, 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.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
/* *16384CELL */ /* *16384CELL */
if(R === range.s.r) cols[C] = encode_col(C); if(R === range.s.r) cols[C] = encode_col(C);
ref = cols[C] + rr; ref = cols[C] + rr;
var cell = dense ? (ws[R]||[])[C] : ws[ref]; var cell = dense ? (ws[R]||[])[C] : ws[ref];
if(!cell) continue; if(!cell) { last_seen = false; continue; }
/* write cell */ /* write cell */
write_ws_bin_cell(ba, cell, R, C, opts, ws); last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
} }
} }
write_record(ba, 'BrtEndSheetData'); write_record(ba, 'BrtEndSheetData');
@ -15406,6 +15526,8 @@ function parse_wb_bin(data, opts) {
supbooks.SheetNames = []; supbooks.SheetNames = [];
supbooks.XTI = []; supbooks.XTI = [];
XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
recordhopper(data, function hopper_wb(val, R_n, RT) { recordhopper(data, function hopper_wb(val, R_n, RT) {
switch(RT) { switch(RT) {
case 0x009C: /* 'BrtBundleSh' */ case 0x009C: /* 'BrtBundleSh' */
@ -15440,13 +15562,18 @@ function parse_wb_bin(data, opts) {
case 0x0169: /* 'BrtPlaceholderName' */ case 0x0169: /* 'BrtPlaceholderName' */
break; break;
case 0x0817: /* 'BrtAbsPath15' */
case 0x009E: /* 'BrtBookView' */
case 0x008F: /* 'BrtBeginBundleShs' */
case 0x0298: /* 'BrtBeginFnGroup' */
case 0x0161: /* 'BrtBeginExternals' */
break;
/* case 'BrtModelTimeGroupingCalcCol' */ /* case 'BrtModelTimeGroupingCalcCol' */
case 0x0C00: /* 'BrtUid' */ case 0x0C00: /* 'BrtUid' */
case 0x0C01: /* 'BrtRevisionPtr' */ case 0x0C01: /* 'BrtRevisionPtr' */
case 0x0817: /* 'BrtAbsPath15' */
case 0x0216: /* 'BrtBookProtection' */ case 0x0216: /* 'BrtBookProtection' */
case 0x02A5: /* 'BrtBookProtectionIso' */ case 0x02A5: /* 'BrtBookProtectionIso' */
case 0x009E: /* 'BrtBookView' */
case 0x009D: /* 'BrtCalcProp' */ case 0x009D: /* 'BrtCalcProp' */
case 0x0262: /* 'BrtCrashRecErr' */ case 0x0262: /* 'BrtCrashRecErr' */
case 0x0802: /* 'BrtDecoupledPivotCacheID' */ case 0x0802: /* 'BrtDecoupledPivotCacheID' */
@ -17879,7 +18006,13 @@ var XLSBRecordEnum = {
0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum }, 0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool }, 0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError }, 0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError },
0x0010: { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ }, 0x000C: { n:"BrtShortBlank", f:parse_BrtShortBlank },
0x000D: { n:"BrtShortRk", f:parse_BrtShortRk },
0x000E: { n:"BrtShortError", f:parse_BrtShortError },
0x000F: { n:"BrtShortBool", f:parse_BrtShortBool },
0x0010: { n:"BrtShortReal", f:parse_BrtShortReal },
0x0011: { n:"BrtShortSt", f:parse_BrtShortSt },
0x0012: { n:"BrtShortIsst", f:parse_BrtShortIsst },
0x0013: { n:"BrtSSTItem", f:parse_RichStr }, 0x0013: { n:"BrtSSTItem", f:parse_RichStr },
0x0014: { n:"BrtPCDIMissing" }, 0x0014: { n:"BrtPCDIMissing" },
0x0015: { n:"BrtPCDINumber" }, 0x0015: { n:"BrtPCDINumber" },
@ -18703,6 +18836,7 @@ var XLSBRecordEnum = {
}; };
var XLSBRE = evert_key(XLSBRecordEnum, 'n'); var XLSBRE = evert_key(XLSBRecordEnum, 'n');
XLSBRE["BrtFRTArchID$"] = 0x0010;
/* [MS-XLS] 2.3 Record Enumeration */ /* [MS-XLS] 2.3 Record Enumeration */
var XLSRecordEnum = { var XLSRecordEnum = {

@ -4,7 +4,7 @@
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.17.0'; XLSX.version = '0.17.1';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
var VALID_ANSI = [ 874, 932, 936, 949, 950 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950 ];
@ -5171,6 +5171,7 @@ var SYLK = (function() {
case 'C': case 'C':
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
@ -5637,6 +5638,7 @@ var PRN = (function() {
else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
sep = str.charAt(4); str = str.slice(6); sep = str.charAt(4); str = str.slice(6);
} }
else sep = guess_sep(str.slice(0,1024));
} }
else sep = guess_sep(str.slice(0,1024)); else sep = guess_sep(str.slice(0,1024));
var R = 0, C = 0, v = 0; var R = 0, C = 0, v = 0;

@ -4,7 +4,7 @@
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.17.0'; XLSX.version = '0.17.1';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
var VALID_ANSI = [ 874, 932, 936, 949, 950 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950 ];
@ -5080,6 +5080,7 @@ var SYLK = (function() {
case 'C': case 'C':
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
@ -5546,6 +5547,7 @@ var PRN = (function() {
else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
sep = str.charAt(4); str = str.slice(6); sep = str.charAt(4); str = str.slice(6);
} }
else sep = guess_sep(str.slice(0,1024));
} }
else sep = guess_sep(str.slice(0,1024)); else sep = guess_sep(str.slice(0,1024));
var R = 0, C = 0, v = 0; var R = 0, C = 0, v = 0;