version bump 0.11.9
- CLI `--book` convert all worksheets (fixes #701 h/t @pmelisko) - Detect ";"-DSV with no "\t" or "," (fixes #875 h/t @sh977218) - editable HTML uses spans for IE6+ compat (fixes #851 h/t @elogicmedia) - XLSB formula structure parallels XLS (fixes #680 h/t @bstiel)
This commit is contained in:
parent
687dcc80b9
commit
7c7f4a69d4
69
bin/xlsx.njs
69
bin/xlsx.njs
@ -46,6 +46,7 @@ program
|
||||
.option('--sst', 'generate shared string table for XLS* formats')
|
||||
.option('--compress', 'use compression when writing XLSX/M/B and ODS')
|
||||
.option('--read', 'read but do not generate output')
|
||||
.option('--book', 'for single-sheet formats, emit a file per worksheet')
|
||||
.option('--all', 'parse everything; write as much as possible')
|
||||
.option('--dev', 'development mode')
|
||||
.option('--sparse', 'sparse mode')
|
||||
@ -84,7 +85,6 @@ if(!filename) {
|
||||
console.error(n + ": must specify a filename");
|
||||
process.exit(1);
|
||||
}
|
||||
/*:: if(filename) { */
|
||||
if(!fs.existsSync(filename)) {
|
||||
console.error(n + ": " + filename + ": No such file or directory");
|
||||
process.exit(2);
|
||||
@ -112,6 +112,9 @@ if(seen) {
|
||||
} else if(program.formulae) opts.cellFormula = true;
|
||||
else opts.cellFormula = false;
|
||||
|
||||
var wopts = ({WTF:opts.WTF, bookSST:program.sst}/*:any*/);
|
||||
if(program.compress) wopts.compression = true;
|
||||
|
||||
if(program.all) {
|
||||
opts.cellFormula = true;
|
||||
opts.bookVBA = true;
|
||||
@ -120,6 +123,7 @@ if(program.all) {
|
||||
opts.cellStyles = true;
|
||||
opts.sheetStubs = true;
|
||||
opts.cellDates = true;
|
||||
wopts.cellStyles = true;
|
||||
}
|
||||
if(program.sparse) opts.dense = false; else opts.dense = true;
|
||||
|
||||
@ -135,16 +139,13 @@ if(program.dev) {
|
||||
process.exit(3);
|
||||
}
|
||||
if(program.read) process.exit(0);
|
||||
|
||||
/*:: if(wb) { */
|
||||
if(!wb) { console.error(n + ": error parsing " + filename + ": empty workbook"); process.exit(0); }
|
||||
/*:: if(!wb) throw new Error("unreachable"); */
|
||||
if(program.listSheets) {
|
||||
console.log((wb.SheetNames||[]).join("\n"));
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
var wopts = ({WTF:opts.WTF, bookSST:program.sst}/*:any*/);
|
||||
if(program.compress) wopts.compression = true;
|
||||
|
||||
/* full workbook formats */
|
||||
workbook_formats.forEach(function(m) { if(program[m[0]] || isfmt(m[0])) {
|
||||
wopts.bookType = m[1];
|
||||
@ -176,6 +177,7 @@ try {
|
||||
process.exit(4);
|
||||
}
|
||||
|
||||
if(!program.quiet && !program.book) console.error(target_sheet);
|
||||
|
||||
/* single worksheet file formats */
|
||||
[
|
||||
@ -190,27 +192,44 @@ try {
|
||||
['dbf', '.dbf'],
|
||||
['dif', '.dif']
|
||||
].forEach(function(m) { if(program[m[0]] || isfmt(m[1])) {
|
||||
wopts.bookType = m[0];
|
||||
X.writeFile(wb, program.output || sheetname || ((filename || "") + m[1]), wopts);
|
||||
process.exit(0);
|
||||
wopts.bookType = m[0];
|
||||
if(program.book) {
|
||||
wb.SheetNames.forEach(function(n, i) {
|
||||
wopts.sheet = n;
|
||||
X.writeFile(wb, (program.output || sheetname || filename || "") + m[1] + "." + i, wopts);
|
||||
});
|
||||
} else X.writeFile(wb, program.output || sheetname || ((filename || "") + m[1]), wopts);
|
||||
process.exit(0);
|
||||
} });
|
||||
|
||||
var oo = "", strm = false;
|
||||
if(!program.quiet) console.error(target_sheet);
|
||||
if(program.formulae) oo = X.utils.sheet_to_formulae(ws).join("\n");
|
||||
else if(program.json) oo = JSON.stringify(X.utils.sheet_to_json(ws));
|
||||
else if(program.rawJs) oo = JSON.stringify(X.utils.sheet_to_json(ws,{raw:true}));
|
||||
else if(program.arrays) oo = JSON.stringify(X.utils.sheet_to_json(ws,{raw:true, header:1}));
|
||||
else {
|
||||
strm = true;
|
||||
var stream = X.stream.to_csv(ws, {FS:program.fieldSep, RS:program.rowSep});
|
||||
if(program.output) stream.pipe(fs.createWriteStream(program.output));
|
||||
else stream.pipe(process.stdout);
|
||||
function outit(o, fn) { if(fn) fs.writeFileSync(fn, o); else console.log(o); }
|
||||
|
||||
function doit(cb) {
|
||||
if(program.book) wb.SheetNames.forEach(function(n, i) {
|
||||
outit(cb(wb.Sheets[n]), (program.output || sheetname || filename) + "." + i);
|
||||
});
|
||||
else outit(cb(ws), program.output);
|
||||
}
|
||||
|
||||
if(!strm) {
|
||||
if(program.output) fs.writeFileSync(program.output, oo);
|
||||
else console.log(oo);
|
||||
var jso = {};
|
||||
switch(true) {
|
||||
case program.formulae:
|
||||
doit(function(ws) { return X.utils.sheet_to_formulae(ws).join("\n"); });
|
||||
break;
|
||||
|
||||
case program.arrays: jso.header = 1;
|
||||
/* falls through */
|
||||
case program.rawJs: jso.raw = true;
|
||||
/* falls through */
|
||||
case program.json:
|
||||
doit(function(ws) { return JSON.stringify(X.utils.sheet_to_json(ws,jso)); });
|
||||
break;
|
||||
|
||||
default:
|
||||
if(!program.book) {
|
||||
var stream = X.stream.to_csv(ws, {FS:program.fieldSep, RS:program.rowSep});
|
||||
if(program.output) stream.pipe(fs.createWriteStream(program.output));
|
||||
else stream.pipe(process.stdout);
|
||||
} else doit(function(ws) { return X.utils.sheet_to_csv(ws,{FS:program.fieldSep, RS:program.rowSep}); });
|
||||
break;
|
||||
}
|
||||
/*:: } */
|
||||
/*:: } */
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.11.8';
|
||||
XLSX.version = '0.11.9';
|
||||
|
@ -20,7 +20,7 @@ function recordhopper(data, cb/*:RecordHopperCB*/, opts/*:?any*/) {
|
||||
|
||||
/* control buffer usage for fixed-length buffers */
|
||||
function buf_array()/*:BufArray*/ {
|
||||
var bufs = [], blksz = 2048;
|
||||
var bufs = [], blksz = has_buf ? 256 : 2048;
|
||||
var newblk = function ba_newblk(sz) {
|
||||
var o/*:Block*/ = (new_buf(sz)/*:any*/);
|
||||
prep_blob(o, 0);
|
||||
|
@ -714,7 +714,7 @@ var PRN = (function() {
|
||||
|
||||
function prn_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ {
|
||||
if(str.substr(0,4) == "sep=") return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
|
||||
}
|
||||
|
||||
|
@ -691,12 +691,43 @@ var PtgBinOp = {
|
||||
PtgSub: "-"
|
||||
};
|
||||
function formula_quote_sheet_name(sname/*:string*/)/*:string*/ {
|
||||
if(!sname) return "";
|
||||
if(!sname) throw new Error("empty sheet name");
|
||||
if(sname.indexOf(" ") > -1) return "'" + sname + "'";
|
||||
return sname;
|
||||
}
|
||||
function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ {
|
||||
return supbooks.SheetNames[ixti];
|
||||
if(!supbooks) return "SH33TJSERR0";
|
||||
if(!supbooks.XTI) return "SH33TJSERR6";
|
||||
var XTI = supbooks.XTI[ixti];
|
||||
if(opts.biff > 8 && !supbooks.XTI[ixti]) return supbooks.SheetNames[ixti];
|
||||
if(opts.biff < 8) {
|
||||
if(ixti > 10000) ixti-= 65536;
|
||||
if(ixti < 0) ixti = -ixti;
|
||||
return ixti == 0 ? "" : supbooks.XTI[ixti - 1];
|
||||
}
|
||||
if(!XTI) return "SH33TJSERR1";
|
||||
var o = "";
|
||||
if(opts.biff > 8) switch(supbooks[XTI[0]][0]) {
|
||||
case 0x0165: /* 'BrtSupSelf' */
|
||||
o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]];
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
if(opts.SID != null) return supbooks.SheetNames[opts.SID];
|
||||
return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
/* falls through */
|
||||
default: return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
}
|
||||
switch(supbooks[XTI[0]][0][0]) {
|
||||
case 0x0401:
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks.SheetNames[XTI[1]] || "SH33TJSERR3");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x3A01: return "SH33TJSERR8";
|
||||
default:
|
||||
if(!supbooks[XTI[0]][0][3]) return "SH33TJSERR2";
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]];
|
||||
}
|
||||
}
|
||||
function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ {
|
||||
return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts));
|
||||
@ -818,7 +849,8 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
|
||||
break;
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
//sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
sname = get_ixti(supbooks, ixti, opts);
|
||||
stack.push(sname + "!" + encode_range_xls((r/*:any*/), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
@ -845,7 +877,6 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
|
||||
if(bookidx < 0) bookidx = -bookidx;
|
||||
if(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];
|
||||
} else {
|
||||
var pnxname = supbooks.SheetNames[bookidx];
|
||||
var o = "";
|
||||
if(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}
|
||||
else if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){
|
||||
|
@ -402,12 +402,14 @@ function parse_ws_bin(data, _opts, rels, wb, themes, styles)/*:Worksheet*/ {
|
||||
|
||||
var array_formulae = [];
|
||||
var shared_formulae = {};
|
||||
var supbooks = ([[]]/*:any*/);
|
||||
var supbooks = opts.supbooks || ([[]]/*:any*/);
|
||||
supbooks.sharedf = shared_formulae;
|
||||
supbooks.arrayf = array_formulae;
|
||||
supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
if(!opts.supbooks) {
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
}
|
||||
|
||||
var colinfo = [], rowinfo = [];
|
||||
var defwidth = 0, defheight = 0; // twips / MDW respectively
|
||||
|
@ -91,8 +91,9 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
opts.biff = 12;
|
||||
|
||||
var Names = [];
|
||||
var supbooks = ([]/*:any*/);
|
||||
var supbooks = ([[]]/*:any*/);
|
||||
supbooks.SheetNames = [];
|
||||
supbooks.XTI = [];
|
||||
|
||||
recordhopper(data, function hopper_wb(val, R_n, RT) {
|
||||
switch(RT) {
|
||||
@ -104,7 +105,9 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
wb.WBProps = val; break;
|
||||
|
||||
case 0x0027: /* 'BrtName' */
|
||||
if(val.Sheet != null) opts.SID = val.Sheet;
|
||||
val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
|
||||
delete opts.SID;
|
||||
delete val.Ptg;
|
||||
Names.push(val);
|
||||
break;
|
||||
@ -114,7 +117,15 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
case 0x029B: /* 'BrtSupAddin' */
|
||||
if(!supbooks[0].length) supbooks[0] = [RT, val];
|
||||
else supbooks.push([RT, val]);
|
||||
supbooks[supbooks.length - 1].XTI = [];
|
||||
break;
|
||||
case 0x016A: /* 'BrtExternSheet' */
|
||||
if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }
|
||||
supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
|
||||
supbooks.XTI = supbooks.XTI.concat(val);
|
||||
break;
|
||||
case 0x0169: /* 'BrtPlaceholderName' */
|
||||
break;
|
||||
|
||||
@ -169,6 +180,7 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
// $FlowIgnore
|
||||
wb.Names = Names;
|
||||
|
||||
(wb/*:any*/).supbooks = supbooks;
|
||||
return wb;
|
||||
}
|
||||
|
||||
|
@ -151,7 +151,7 @@ function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, a
|
||||
});
|
||||
cell.s = S;
|
||||
}
|
||||
cell.ixfe = cell.StyleID !== undefined ? cell.StyleID : 'Default';
|
||||
if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;
|
||||
}
|
||||
|
||||
function xlml_clean_comment(comment/*:any*/) {
|
||||
|
@ -869,7 +869,7 @@ else/*:: if(cfb instanceof CFBContainer) */ {
|
||||
/* Quattro Pro 9 */
|
||||
else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
|
||||
else throw new Error("Cannot find Workbook stream");
|
||||
if(options.bookVBA && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
}
|
||||
|
||||
var props = {};
|
||||
|
@ -66,7 +66,7 @@ var HTML_ = (function() {
|
||||
function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {
|
||||
var M = (ws['!merges'] ||[]);
|
||||
var oo = [];
|
||||
var nullcell = "<td" + (o.editable ? ' contenteditable="true"' : "" ) + "></td>";
|
||||
var nullcell = "<td>" + (o.editable ? '<span contenteditable="true"></span>' : "" ) + "</td>";
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) {
|
||||
var RS = 0, CS = 0;
|
||||
for(var j = 0; j < M.length; ++j) {
|
||||
@ -84,7 +84,7 @@ var HTML_ = (function() {
|
||||
var sp = {};
|
||||
if(RS > 1) sp.rowspan = RS;
|
||||
if(CS > 1) sp.colspan = CS;
|
||||
if(o.editable) sp.contenteditable = "true";
|
||||
if(o.editable) w = '<span contenteditable="true">' + w + '</span>'
|
||||
sp.id = "sjs-" + coord;
|
||||
oo.push(writextag('td', w, sp));
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ var XLSX = require('../../'); // test against development version
|
||||
//var XLSX = require('xlsx'); // use in production
|
||||
/*jshint browser:true */
|
||||
/*global require */
|
||||
var X = require('xlsx');
|
||||
var X = XLSX;
|
||||
var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
|
28
dist/xlsx.core.min.js
vendored
28
dist/xlsx.core.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.core.min.map
vendored
2
dist/xlsx.core.min.map
vendored
File diff suppressed because one or more lines are too long
20
dist/xlsx.full.min.js
vendored
20
dist/xlsx.full.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.full.min.map
vendored
2
dist/xlsx.full.min.map
vendored
File diff suppressed because one or more lines are too long
75
dist/xlsx.js
vendored
75
dist/xlsx.js
vendored
@ -4,7 +4,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.11.8';
|
||||
XLSX.version = '0.11.9';
|
||||
var current_codepage = 1200;
|
||||
/*global cptable:true */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -2430,7 +2430,7 @@ function recordhopper(data, cb, opts) {
|
||||
|
||||
/* control buffer usage for fixed-length buffers */
|
||||
function buf_array() {
|
||||
var bufs = [], blksz = 2048;
|
||||
var bufs = [], blksz = has_buf ? 256 : 2048;
|
||||
var newblk = function ba_newblk(sz) {
|
||||
var o = (new_buf(sz));
|
||||
prep_blob(o, 0);
|
||||
@ -6122,7 +6122,7 @@ var PRN = (function() {
|
||||
|
||||
function prn_to_sheet_str(str, opts) {
|
||||
if(str.substr(0,4) == "sep=") return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
|
||||
}
|
||||
|
||||
@ -9545,12 +9545,43 @@ var PtgBinOp = {
|
||||
PtgSub: "-"
|
||||
};
|
||||
function formula_quote_sheet_name(sname) {
|
||||
if(!sname) return "";
|
||||
if(!sname) throw new Error("empty sheet name");
|
||||
if(sname.indexOf(" ") > -1) return "'" + sname + "'";
|
||||
return sname;
|
||||
}
|
||||
function get_ixti_raw(supbooks, ixti, opts) {
|
||||
return supbooks.SheetNames[ixti];
|
||||
if(!supbooks) return "SH33TJSERR0";
|
||||
if(!supbooks.XTI) return "SH33TJSERR6";
|
||||
var XTI = supbooks.XTI[ixti];
|
||||
if(opts.biff > 8 && !supbooks.XTI[ixti]) return supbooks.SheetNames[ixti];
|
||||
if(opts.biff < 8) {
|
||||
if(ixti > 10000) ixti-= 65536;
|
||||
if(ixti < 0) ixti = -ixti;
|
||||
return ixti == 0 ? "" : supbooks.XTI[ixti - 1];
|
||||
}
|
||||
if(!XTI) return "SH33TJSERR1";
|
||||
var o = "";
|
||||
if(opts.biff > 8) switch(supbooks[XTI[0]][0]) {
|
||||
case 0x0165: /* 'BrtSupSelf' */
|
||||
o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]];
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
if(opts.SID != null) return supbooks.SheetNames[opts.SID];
|
||||
return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
/* falls through */
|
||||
default: return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
}
|
||||
switch(supbooks[XTI[0]][0][0]) {
|
||||
case 0x0401:
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks.SheetNames[XTI[1]] || "SH33TJSERR3");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x3A01: return "SH33TJSERR8";
|
||||
default:
|
||||
if(!supbooks[XTI[0]][0][3]) return "SH33TJSERR2";
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]];
|
||||
}
|
||||
}
|
||||
function get_ixti(supbooks, ixti, opts) {
|
||||
return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts));
|
||||
@ -9672,7 +9703,8 @@ function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
|
||||
break;
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = f[1][1]; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
//sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
sname = get_ixti(supbooks, ixti, opts);
|
||||
stack.push(sname + "!" + encode_range_xls((r), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
@ -9699,7 +9731,6 @@ function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
|
||||
if(bookidx < 0) bookidx = -bookidx;
|
||||
if(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];
|
||||
} else {
|
||||
var pnxname = supbooks.SheetNames[bookidx];
|
||||
var o = "";
|
||||
if(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}
|
||||
else if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){
|
||||
@ -12259,12 +12290,14 @@ function parse_ws_bin(data, _opts, rels, wb, themes, styles) {
|
||||
|
||||
var array_formulae = [];
|
||||
var shared_formulae = {};
|
||||
var supbooks = ([[]]);
|
||||
var supbooks = opts.supbooks || ([[]]);
|
||||
supbooks.sharedf = shared_formulae;
|
||||
supbooks.arrayf = array_formulae;
|
||||
supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
if(!opts.supbooks) {
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
}
|
||||
|
||||
var colinfo = [], rowinfo = [];
|
||||
var defwidth = 0, defheight = 0; // twips / MDW respectively
|
||||
@ -13264,8 +13297,9 @@ function parse_wb_bin(data, opts) {
|
||||
opts.biff = 12;
|
||||
|
||||
var Names = [];
|
||||
var supbooks = ([]);
|
||||
var supbooks = ([[]]);
|
||||
supbooks.SheetNames = [];
|
||||
supbooks.XTI = [];
|
||||
|
||||
recordhopper(data, function hopper_wb(val, R_n, RT) {
|
||||
switch(RT) {
|
||||
@ -13277,7 +13311,9 @@ function parse_wb_bin(data, opts) {
|
||||
wb.WBProps = val; break;
|
||||
|
||||
case 0x0027: /* 'BrtName' */
|
||||
if(val.Sheet != null) opts.SID = val.Sheet;
|
||||
val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
|
||||
delete opts.SID;
|
||||
delete val.Ptg;
|
||||
Names.push(val);
|
||||
break;
|
||||
@ -13287,7 +13323,15 @@ function parse_wb_bin(data, opts) {
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
case 0x029B: /* 'BrtSupAddin' */
|
||||
if(!supbooks[0].length) supbooks[0] = [RT, val];
|
||||
else supbooks.push([RT, val]);
|
||||
supbooks[supbooks.length - 1].XTI = [];
|
||||
break;
|
||||
case 0x016A: /* 'BrtExternSheet' */
|
||||
if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }
|
||||
supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
|
||||
supbooks.XTI = supbooks.XTI.concat(val);
|
||||
break;
|
||||
case 0x0169: /* 'BrtPlaceholderName' */
|
||||
break;
|
||||
|
||||
@ -13342,6 +13386,7 @@ function parse_wb_bin(data, opts) {
|
||||
// $FlowIgnore
|
||||
wb.Names = Names;
|
||||
|
||||
(wb).supbooks = supbooks;
|
||||
return wb;
|
||||
}
|
||||
|
||||
@ -13682,7 +13727,7 @@ function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o
|
||||
});
|
||||
cell.s = S;
|
||||
}
|
||||
cell.ixfe = cell.StyleID !== undefined ? cell.StyleID : 'Default';
|
||||
if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;
|
||||
}
|
||||
|
||||
function xlml_clean_comment(comment) {
|
||||
@ -15482,7 +15527,7 @@ else {
|
||||
/* Quattro Pro 9 */
|
||||
else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
|
||||
else throw new Error("Cannot find Workbook stream");
|
||||
if(options.bookVBA && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
}
|
||||
|
||||
var props = {};
|
||||
@ -17058,7 +17103,7 @@ var HTML_ = (function() {
|
||||
function make_html_row(ws, r, R, o) {
|
||||
var M = (ws['!merges'] ||[]);
|
||||
var oo = [];
|
||||
var nullcell = "<td" + (o.editable ? ' contenteditable="true"' : "" ) + "></td>";
|
||||
var nullcell = "<td>" + (o.editable ? '<span contenteditable="true"></span>' : "" ) + "</td>";
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) {
|
||||
var RS = 0, CS = 0;
|
||||
for(var j = 0; j < M.length; ++j) {
|
||||
@ -17076,7 +17121,7 @@ var HTML_ = (function() {
|
||||
var sp = {};
|
||||
if(RS > 1) sp.rowspan = RS;
|
||||
if(CS > 1) sp.colspan = CS;
|
||||
if(o.editable) sp.contenteditable = "true";
|
||||
if(o.editable) w = '<span contenteditable="true">' + w + '</span>'
|
||||
sp.id = "sjs-" + coord;
|
||||
oo.push(writextag('td', w, sp));
|
||||
}
|
||||
|
24
dist/xlsx.min.js
vendored
24
dist/xlsx.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.min.map
vendored
2
dist/xlsx.min.map
vendored
File diff suppressed because one or more lines are too long
49
package.json
49
package.json
@ -1,9 +1,22 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.11.8",
|
||||
"version": "0.11.9",
|
||||
"author": "sheetjs",
|
||||
"description": "SheetJS Spreadsheet data parser and writer",
|
||||
"keywords": [ "excel", "xls", "xlsx", "xlsb", "xlsm", "ods", "csv", "dbf", "dif", "sylk", "office", "spreadsheet" ],
|
||||
"keywords": [
|
||||
"excel",
|
||||
"xls",
|
||||
"xlsx",
|
||||
"xlsb",
|
||||
"xlsm",
|
||||
"ods",
|
||||
"csv",
|
||||
"dbf",
|
||||
"dif",
|
||||
"sylk",
|
||||
"office",
|
||||
"spreadsheet"
|
||||
],
|
||||
"bin": {
|
||||
"xlsx": "./bin/xlsx.njs"
|
||||
},
|
||||
@ -17,13 +30,13 @@
|
||||
"fs": false
|
||||
},
|
||||
"dependencies": {
|
||||
"exit-on-epipe": "~1.0.1",
|
||||
"ssf": "~0.10.1",
|
||||
"codepage": "~1.11.0",
|
||||
"cfb": "~1.0.0",
|
||||
"crc-32": "~1.1.1",
|
||||
"adler-32": "~1.1.0",
|
||||
"commander": "~2.11.0"
|
||||
"cfb": "~1.0.0",
|
||||
"codepage": "~1.11.0",
|
||||
"commander": "~2.11.0",
|
||||
"crc-32": "~1.1.1",
|
||||
"exit-on-epipe": "~1.0.1",
|
||||
"ssf": "~0.10.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "~2.5.3",
|
||||
@ -35,7 +48,10 @@
|
||||
"dtslint": "^0.1.2",
|
||||
"typescript": "2.2.0"
|
||||
},
|
||||
"repository": { "type":"git", "url":"git://github.com/SheetJS/js-xlsx.git" },
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/SheetJS/js-xlsx.git"
|
||||
},
|
||||
"scripts": {
|
||||
"pretest": "git submodule init && git submodule update",
|
||||
"test": "make travis",
|
||||
@ -48,9 +64,18 @@
|
||||
"pattern": "xlsx.js"
|
||||
}
|
||||
},
|
||||
"alex": { "allow": ["wtf", "holes"] },
|
||||
"alex": {
|
||||
"allow": [
|
||||
"wtf",
|
||||
"holes"
|
||||
]
|
||||
},
|
||||
"homepage": "http://sheetjs.com/opensource",
|
||||
"bugs": { "url": "https://github.com/SheetJS/js-xlsx/issues" },
|
||||
"bugs": {
|
||||
"url": "https://github.com/SheetJS/js-xlsx/issues"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"engines": { "node": ">=0.8" }
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
}
|
||||
|
75
xlsx.flow.js
75
xlsx.flow.js
@ -4,7 +4,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.11.8';
|
||||
XLSX.version = '0.11.9';
|
||||
var current_codepage = 1200;
|
||||
/*:: declare var cptable:any; */
|
||||
/*global cptable:true */
|
||||
@ -2507,7 +2507,7 @@ function recordhopper(data, cb/*:RecordHopperCB*/, opts/*:?any*/) {
|
||||
|
||||
/* control buffer usage for fixed-length buffers */
|
||||
function buf_array()/*:BufArray*/ {
|
||||
var bufs = [], blksz = 2048;
|
||||
var bufs = [], blksz = has_buf ? 256 : 2048;
|
||||
var newblk = function ba_newblk(sz) {
|
||||
var o/*:Block*/ = (new_buf(sz)/*:any*/);
|
||||
prep_blob(o, 0);
|
||||
@ -6207,7 +6207,7 @@ var PRN = (function() {
|
||||
|
||||
function prn_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ {
|
||||
if(str.substr(0,4) == "sep=") return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
|
||||
}
|
||||
|
||||
@ -9634,12 +9634,43 @@ var PtgBinOp = {
|
||||
PtgSub: "-"
|
||||
};
|
||||
function formula_quote_sheet_name(sname/*:string*/)/*:string*/ {
|
||||
if(!sname) return "";
|
||||
if(!sname) throw new Error("empty sheet name");
|
||||
if(sname.indexOf(" ") > -1) return "'" + sname + "'";
|
||||
return sname;
|
||||
}
|
||||
function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ {
|
||||
return supbooks.SheetNames[ixti];
|
||||
if(!supbooks) return "SH33TJSERR0";
|
||||
if(!supbooks.XTI) return "SH33TJSERR6";
|
||||
var XTI = supbooks.XTI[ixti];
|
||||
if(opts.biff > 8 && !supbooks.XTI[ixti]) return supbooks.SheetNames[ixti];
|
||||
if(opts.biff < 8) {
|
||||
if(ixti > 10000) ixti-= 65536;
|
||||
if(ixti < 0) ixti = -ixti;
|
||||
return ixti == 0 ? "" : supbooks.XTI[ixti - 1];
|
||||
}
|
||||
if(!XTI) return "SH33TJSERR1";
|
||||
var o = "";
|
||||
if(opts.biff > 8) switch(supbooks[XTI[0]][0]) {
|
||||
case 0x0165: /* 'BrtSupSelf' */
|
||||
o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]];
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
if(opts.SID != null) return supbooks.SheetNames[opts.SID];
|
||||
return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
/* falls through */
|
||||
default: return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
}
|
||||
switch(supbooks[XTI[0]][0][0]) {
|
||||
case 0x0401:
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks.SheetNames[XTI[1]] || "SH33TJSERR3");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x3A01: return "SH33TJSERR8";
|
||||
default:
|
||||
if(!supbooks[XTI[0]][0][3]) return "SH33TJSERR2";
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]];
|
||||
}
|
||||
}
|
||||
function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ {
|
||||
return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts));
|
||||
@ -9761,7 +9792,8 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
|
||||
break;
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
//sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
sname = get_ixti(supbooks, ixti, opts);
|
||||
stack.push(sname + "!" + encode_range_xls((r/*:any*/), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
@ -9788,7 +9820,6 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
|
||||
if(bookidx < 0) bookidx = -bookidx;
|
||||
if(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];
|
||||
} else {
|
||||
var pnxname = supbooks.SheetNames[bookidx];
|
||||
var o = "";
|
||||
if(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}
|
||||
else if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){
|
||||
@ -12349,12 +12380,14 @@ function parse_ws_bin(data, _opts, rels, wb, themes, styles)/*:Worksheet*/ {
|
||||
|
||||
var array_formulae = [];
|
||||
var shared_formulae = {};
|
||||
var supbooks = ([[]]/*:any*/);
|
||||
var supbooks = opts.supbooks || ([[]]/*:any*/);
|
||||
supbooks.sharedf = shared_formulae;
|
||||
supbooks.arrayf = array_formulae;
|
||||
supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
if(!opts.supbooks) {
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
}
|
||||
|
||||
var colinfo = [], rowinfo = [];
|
||||
var defwidth = 0, defheight = 0; // twips / MDW respectively
|
||||
@ -13355,8 +13388,9 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
opts.biff = 12;
|
||||
|
||||
var Names = [];
|
||||
var supbooks = ([]/*:any*/);
|
||||
var supbooks = ([[]]/*:any*/);
|
||||
supbooks.SheetNames = [];
|
||||
supbooks.XTI = [];
|
||||
|
||||
recordhopper(data, function hopper_wb(val, R_n, RT) {
|
||||
switch(RT) {
|
||||
@ -13368,7 +13402,9 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
wb.WBProps = val; break;
|
||||
|
||||
case 0x0027: /* 'BrtName' */
|
||||
if(val.Sheet != null) opts.SID = val.Sheet;
|
||||
val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
|
||||
delete opts.SID;
|
||||
delete val.Ptg;
|
||||
Names.push(val);
|
||||
break;
|
||||
@ -13378,7 +13414,15 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
case 0x029B: /* 'BrtSupAddin' */
|
||||
if(!supbooks[0].length) supbooks[0] = [RT, val];
|
||||
else supbooks.push([RT, val]);
|
||||
supbooks[supbooks.length - 1].XTI = [];
|
||||
break;
|
||||
case 0x016A: /* 'BrtExternSheet' */
|
||||
if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }
|
||||
supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
|
||||
supbooks.XTI = supbooks.XTI.concat(val);
|
||||
break;
|
||||
case 0x0169: /* 'BrtPlaceholderName' */
|
||||
break;
|
||||
|
||||
@ -13433,6 +13477,7 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
|
||||
// $FlowIgnore
|
||||
wb.Names = Names;
|
||||
|
||||
(wb/*:any*/).supbooks = supbooks;
|
||||
return wb;
|
||||
}
|
||||
|
||||
@ -13775,7 +13820,7 @@ function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, a
|
||||
});
|
||||
cell.s = S;
|
||||
}
|
||||
cell.ixfe = cell.StyleID !== undefined ? cell.StyleID : 'Default';
|
||||
if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;
|
||||
}
|
||||
|
||||
function xlml_clean_comment(comment/*:any*/) {
|
||||
@ -15582,7 +15627,7 @@ else/*:: if(cfb instanceof CFBContainer) */ {
|
||||
/* Quattro Pro 9 */
|
||||
else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
|
||||
else throw new Error("Cannot find Workbook stream");
|
||||
if(options.bookVBA && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
}
|
||||
|
||||
var props = {};
|
||||
@ -17158,7 +17203,7 @@ var HTML_ = (function() {
|
||||
function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {
|
||||
var M = (ws['!merges'] ||[]);
|
||||
var oo = [];
|
||||
var nullcell = "<td" + (o.editable ? ' contenteditable="true"' : "" ) + "></td>";
|
||||
var nullcell = "<td>" + (o.editable ? '<span contenteditable="true"></span>' : "" ) + "</td>";
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) {
|
||||
var RS = 0, CS = 0;
|
||||
for(var j = 0; j < M.length; ++j) {
|
||||
@ -17176,7 +17221,7 @@ var HTML_ = (function() {
|
||||
var sp = {};
|
||||
if(RS > 1) sp.rowspan = RS;
|
||||
if(CS > 1) sp.colspan = CS;
|
||||
if(o.editable) sp.contenteditable = "true";
|
||||
if(o.editable) w = '<span contenteditable="true">' + w + '</span>'
|
||||
sp.id = "sjs-" + coord;
|
||||
oo.push(writextag('td', w, sp));
|
||||
}
|
||||
|
75
xlsx.js
75
xlsx.js
@ -4,7 +4,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.11.8';
|
||||
XLSX.version = '0.11.9';
|
||||
var current_codepage = 1200;
|
||||
/*global cptable:true */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -2430,7 +2430,7 @@ function recordhopper(data, cb, opts) {
|
||||
|
||||
/* control buffer usage for fixed-length buffers */
|
||||
function buf_array() {
|
||||
var bufs = [], blksz = 2048;
|
||||
var bufs = [], blksz = has_buf ? 256 : 2048;
|
||||
var newblk = function ba_newblk(sz) {
|
||||
var o = (new_buf(sz));
|
||||
prep_blob(o, 0);
|
||||
@ -6122,7 +6122,7 @@ var PRN = (function() {
|
||||
|
||||
function prn_to_sheet_str(str, opts) {
|
||||
if(str.substr(0,4) == "sep=") return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts);
|
||||
return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
|
||||
}
|
||||
|
||||
@ -9545,12 +9545,43 @@ var PtgBinOp = {
|
||||
PtgSub: "-"
|
||||
};
|
||||
function formula_quote_sheet_name(sname) {
|
||||
if(!sname) return "";
|
||||
if(!sname) throw new Error("empty sheet name");
|
||||
if(sname.indexOf(" ") > -1) return "'" + sname + "'";
|
||||
return sname;
|
||||
}
|
||||
function get_ixti_raw(supbooks, ixti, opts) {
|
||||
return supbooks.SheetNames[ixti];
|
||||
if(!supbooks) return "SH33TJSERR0";
|
||||
if(!supbooks.XTI) return "SH33TJSERR6";
|
||||
var XTI = supbooks.XTI[ixti];
|
||||
if(opts.biff > 8 && !supbooks.XTI[ixti]) return supbooks.SheetNames[ixti];
|
||||
if(opts.biff < 8) {
|
||||
if(ixti > 10000) ixti-= 65536;
|
||||
if(ixti < 0) ixti = -ixti;
|
||||
return ixti == 0 ? "" : supbooks.XTI[ixti - 1];
|
||||
}
|
||||
if(!XTI) return "SH33TJSERR1";
|
||||
var o = "";
|
||||
if(opts.biff > 8) switch(supbooks[XTI[0]][0]) {
|
||||
case 0x0165: /* 'BrtSupSelf' */
|
||||
o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]];
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
if(opts.SID != null) return supbooks.SheetNames[opts.SID];
|
||||
return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
/* falls through */
|
||||
default: return "SH33TJSERR" + supbooks[XTI[0]][0];
|
||||
}
|
||||
switch(supbooks[XTI[0]][0][0]) {
|
||||
case 0x0401:
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks.SheetNames[XTI[1]] || "SH33TJSERR3");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
|
||||
case 0x3A01: return "SH33TJSERR8";
|
||||
default:
|
||||
if(!supbooks[XTI[0]][0][3]) return "SH33TJSERR2";
|
||||
o = XTI[1] == -1 ? "#REF" : (supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4");
|
||||
return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]];
|
||||
}
|
||||
}
|
||||
function get_ixti(supbooks, ixti, opts) {
|
||||
return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts));
|
||||
@ -9672,7 +9703,8 @@ function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
|
||||
break;
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = f[1][1]; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
//sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
sname = get_ixti(supbooks, ixti, opts);
|
||||
stack.push(sname + "!" + encode_range_xls((r), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
@ -9699,7 +9731,6 @@ function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
|
||||
if(bookidx < 0) bookidx = -bookidx;
|
||||
if(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];
|
||||
} else {
|
||||
var pnxname = supbooks.SheetNames[bookidx];
|
||||
var o = "";
|
||||
if(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}
|
||||
else if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){
|
||||
@ -12259,12 +12290,14 @@ function parse_ws_bin(data, _opts, rels, wb, themes, styles) {
|
||||
|
||||
var array_formulae = [];
|
||||
var shared_formulae = {};
|
||||
var supbooks = ([[]]);
|
||||
var supbooks = opts.supbooks || ([[]]);
|
||||
supbooks.sharedf = shared_formulae;
|
||||
supbooks.arrayf = array_formulae;
|
||||
supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
if(!opts.supbooks) {
|
||||
opts.supbooks = supbooks;
|
||||
for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
|
||||
}
|
||||
|
||||
var colinfo = [], rowinfo = [];
|
||||
var defwidth = 0, defheight = 0; // twips / MDW respectively
|
||||
@ -13264,8 +13297,9 @@ function parse_wb_bin(data, opts) {
|
||||
opts.biff = 12;
|
||||
|
||||
var Names = [];
|
||||
var supbooks = ([]);
|
||||
var supbooks = ([[]]);
|
||||
supbooks.SheetNames = [];
|
||||
supbooks.XTI = [];
|
||||
|
||||
recordhopper(data, function hopper_wb(val, R_n, RT) {
|
||||
switch(RT) {
|
||||
@ -13277,7 +13311,9 @@ function parse_wb_bin(data, opts) {
|
||||
wb.WBProps = val; break;
|
||||
|
||||
case 0x0027: /* 'BrtName' */
|
||||
if(val.Sheet != null) opts.SID = val.Sheet;
|
||||
val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
|
||||
delete opts.SID;
|
||||
delete val.Ptg;
|
||||
Names.push(val);
|
||||
break;
|
||||
@ -13287,7 +13323,15 @@ function parse_wb_bin(data, opts) {
|
||||
case 0x0166: /* 'BrtSupSame' */
|
||||
case 0x0163: /* 'BrtSupBookSrc' */
|
||||
case 0x029B: /* 'BrtSupAddin' */
|
||||
if(!supbooks[0].length) supbooks[0] = [RT, val];
|
||||
else supbooks.push([RT, val]);
|
||||
supbooks[supbooks.length - 1].XTI = [];
|
||||
break;
|
||||
case 0x016A: /* 'BrtExternSheet' */
|
||||
if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }
|
||||
supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
|
||||
supbooks.XTI = supbooks.XTI.concat(val);
|
||||
break;
|
||||
case 0x0169: /* 'BrtPlaceholderName' */
|
||||
break;
|
||||
|
||||
@ -13342,6 +13386,7 @@ function parse_wb_bin(data, opts) {
|
||||
// $FlowIgnore
|
||||
wb.Names = Names;
|
||||
|
||||
(wb).supbooks = supbooks;
|
||||
return wb;
|
||||
}
|
||||
|
||||
@ -13682,7 +13727,7 @@ function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o
|
||||
});
|
||||
cell.s = S;
|
||||
}
|
||||
cell.ixfe = cell.StyleID !== undefined ? cell.StyleID : 'Default';
|
||||
if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;
|
||||
}
|
||||
|
||||
function xlml_clean_comment(comment) {
|
||||
@ -15482,7 +15527,7 @@ else {
|
||||
/* Quattro Pro 9 */
|
||||
else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
|
||||
else throw new Error("Cannot find Workbook stream");
|
||||
if(options.bookVBA && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
|
||||
}
|
||||
|
||||
var props = {};
|
||||
@ -17058,7 +17103,7 @@ var HTML_ = (function() {
|
||||
function make_html_row(ws, r, R, o) {
|
||||
var M = (ws['!merges'] ||[]);
|
||||
var oo = [];
|
||||
var nullcell = "<td" + (o.editable ? ' contenteditable="true"' : "" ) + "></td>";
|
||||
var nullcell = "<td>" + (o.editable ? '<span contenteditable="true"></span>' : "" ) + "</td>";
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) {
|
||||
var RS = 0, CS = 0;
|
||||
for(var j = 0; j < M.length; ++j) {
|
||||
@ -17076,7 +17121,7 @@ var HTML_ = (function() {
|
||||
var sp = {};
|
||||
if(RS > 1) sp.rowspan = RS;
|
||||
if(CS > 1) sp.colspan = CS;
|
||||
if(o.editable) sp.contenteditable = "true";
|
||||
if(o.editable) w = '<span contenteditable="true">' + w + '</span>'
|
||||
sp.id = "sjs-" + coord;
|
||||
oo.push(writextag('td', w, sp));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user