forked from sheetjs/sheetjs
version bump 0.5.5: sheet names optimization
- bookSheets option skips worksheet parsing (used by xlsx2csv) - filtered tests (by file extension) - XLSB formulae stubs
This commit is contained in:
parent
7e9f218f0f
commit
1dceeffbe9
@ -1,3 +1,4 @@
|
||||
test_files/
|
||||
tests/files/
|
||||
index.html
|
||||
misc/coverage.html
|
||||
|
6
Makefile
6
Makefile
@ -1,5 +1,6 @@
|
||||
DEPS=$(wildcard bits/*.js)
|
||||
TARGET=xlsx.js
|
||||
FMT=xlsx xlsm xlsb
|
||||
|
||||
$(TARGET): $(DEPS)
|
||||
cat $^ > $@
|
||||
@ -23,6 +24,11 @@ init:
|
||||
test mocha:
|
||||
mocha -R spec
|
||||
|
||||
TESTFMT=$(patsubst %,test_%,$(FMT))
|
||||
.PHONY: $(TESTFMT)
|
||||
$(TESTFMT): test_%:
|
||||
FMTS=$* make test
|
||||
|
||||
.PHONY: jasmine
|
||||
jasmine:
|
||||
npm run-script test-jasmine
|
||||
|
11
README.md
11
README.md
@ -49,7 +49,7 @@ For more details:
|
||||
- `index.html` is the live demo
|
||||
- `bits/90_utils.js` contains the logic for generating CSV and JSON from sheets
|
||||
|
||||
## Cell Object Description
|
||||
## Cell Object Description
|
||||
|
||||
`.SheetNames` is an ordered list of the sheets in the workbook
|
||||
|
||||
@ -65,7 +65,7 @@ that does not start with `!` corresponds to a cell (using `A-1` notation).
|
||||
- `.r` : the rich text encoding of a cell text (if applicable)
|
||||
- `.h` : an HTML rendering of the rich text (if applicable)
|
||||
- `.c` : comments associated with the cell
|
||||
- `.z` : the number format string associated with the cell (if requested)
|
||||
- `.z` : the number format string associated with the cell (if requested)
|
||||
|
||||
For dates, `.v` holds the raw date code from the sheet and `.w` holds the text
|
||||
|
||||
@ -79,12 +79,14 @@ The exported `read` and `readFile` functions accept an options argument:
|
||||
| cellHTML | true | Parse rich text and save HTML to the .h field |
|
||||
| cellNF | false | Save number format string to the .z field |
|
||||
| sheetStubs | false | Create cell objects for stub cells |
|
||||
| bookSheets | false | If true, only parse enough to get the sheet names |
|
||||
|
||||
- `cellFormula` only applies to constructing XLSB formulae. XLSX/XLSM formulae
|
||||
are stored in plaintext, but XLSB formulae are stored in a binary format.
|
||||
- Even if `cellNF` is false, formatted text (.w) will be generated
|
||||
- In some cases, sheets may be parsed even if `bookSheets` is false.
|
||||
|
||||
The defaults are enumerated in bits/84_defaults.js
|
||||
The defaults are enumerated in bits/84_defaults.js
|
||||
|
||||
## Tested Environments
|
||||
|
||||
@ -118,7 +120,7 @@ $ open -a Chromium.app http://localhost:8000/stress.html
|
||||
|
||||
## Contributing
|
||||
|
||||
Due to the precarious nature of the Open Specifications Promise, it is very important to ensure code is cleanroom. Consult CONTRIBUTING.md
|
||||
Due to the precarious nature of the Open Specifications Promise, it is very important to ensure code is cleanroom. Consult CONTRIBUTING.md
|
||||
|
||||
## XLS Support
|
||||
|
||||
@ -138,6 +140,7 @@ OSP-covered specifications:
|
||||
|
||||
- [MS-XLSX]: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format
|
||||
- [MS-XLSB]: Excel (.xlsb) Binary File Format
|
||||
- [MS-OE376]: Office Implementation Information for ECMA-376 Standards Support
|
||||
|
||||
## Badges
|
||||
|
||||
|
@ -46,10 +46,13 @@ if(!fs.existsSync(filename)) {
|
||||
|
||||
if(program.dev) X.verbose = 2;
|
||||
|
||||
var opts = {};
|
||||
if(program.listSheets) opts.bookSheets = true;
|
||||
|
||||
var wb;
|
||||
if(program.dev) wb = X.readFile(filename);
|
||||
if(program.dev) wb = X.readFile(filename, opts);
|
||||
else try {
|
||||
wb = X.readFile(filename);
|
||||
wb = X.readFile(filename, opts);
|
||||
} catch(e) {
|
||||
var msg = (program.quiet) ? "" : n + "2csv: error parsing ";
|
||||
msg += filename + ": " + e;
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.5.4';
|
||||
XLSX.version = '0.5.5';
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* [MS-XLSB] 2.1.4 Record */
|
||||
var recordhopper = function(data, cb) {
|
||||
var recordhopper = function(data, cb, opts) {
|
||||
var tmpbyte, cntbyte, length;
|
||||
prep_blob(data, data.l || 0);
|
||||
while(data.l < data.length) {
|
||||
@ -9,7 +9,7 @@ var recordhopper = function(data, cb) {
|
||||
tmpbyte = data.read_shift(1);
|
||||
length = tmpbyte & 0x7F;
|
||||
for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);
|
||||
var d = R.f(data, length);
|
||||
var d = R.f(data, length, opts);
|
||||
if(cb(d, R, RT)) return;
|
||||
}
|
||||
};
|
||||
|
5
bits/70_fbin.js
Normal file
5
bits/70_fbin.js
Normal file
@ -0,0 +1,5 @@
|
||||
/* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */
|
||||
var parse_CellParsedFormula = function(data, length) {
|
||||
var cce = data.read_shift(4);
|
||||
return parsenoop(data, length-4);
|
||||
};
|
@ -1,3 +1,4 @@
|
||||
|
||||
/* [MS-XLSB] 2.4.718 BrtRowHdr */
|
||||
var parse_BrtRowHdr = function(data, length) {
|
||||
var z = {};
|
||||
@ -18,6 +19,9 @@ var parse_BrtWsProp = function(data, length) {
|
||||
return z;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.303 BrtCellBlank */
|
||||
var parse_BrtCellBlank = parsenoop;
|
||||
|
||||
/* [MS-XLSB] 2.4.304 BrtCellBool */
|
||||
var parse_BrtCellBool = function(data, length) {
|
||||
var cell = parse_Cell(data);
|
||||
@ -53,7 +57,7 @@ var parse_BrtCellRk = function(data, length) {
|
||||
return [cell, value, 'n'];
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.311 BrtCellRk */
|
||||
/* [MS-XLSB] 2.4.314 BrtCellSt */
|
||||
var parse_BrtCellSt = function(data, length) {
|
||||
var cell = parse_Cell(data);
|
||||
var value = parse_XLWideString(data);
|
||||
@ -61,40 +65,58 @@ var parse_BrtCellSt = function(data, length) {
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.647 BrtFmlaBool */
|
||||
var parse_BrtFmlaBool = function(data, length) {
|
||||
var parse_BrtFmlaBool = function(data, length, opts) {
|
||||
var cell = parse_Cell(data);
|
||||
var value = data.read_shift(1);
|
||||
data.l += length-9;
|
||||
return [cell, value, 'b' /*, formula */];
|
||||
var o = [cell, value, 'b'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, length-9);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l += length-9;
|
||||
return o;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.648 BrtFmlaError */
|
||||
var parse_BrtFmlaError = function(data, length) {
|
||||
var parse_BrtFmlaError = function(data, length, opts) {
|
||||
var cell = parse_Cell(data);
|
||||
var fBool = data.read_shift(1);
|
||||
data.l += length-9;
|
||||
return [cell, fBool, 'e'];
|
||||
var value = data.read_shift(1);
|
||||
var o = [cell, value, 'e'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, length-9);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l += length-9;
|
||||
return o;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.649 BrtFmlaNum */
|
||||
var parse_BrtFmlaNum = function(data, length) {
|
||||
var parse_BrtFmlaNum = function(data, length, opts) {
|
||||
var cell = parse_Cell(data);
|
||||
var value = parse_Xnum(data);
|
||||
data.l += length-16;
|
||||
return [cell, value, 'n' /*, formula */];
|
||||
var o = [cell, value, 'n'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, length - 16);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l += length-16;
|
||||
return o;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.650 BrtFmlaString */
|
||||
var parse_BrtFmlaString = function(data, length) {
|
||||
var parse_BrtFmlaString = function(data, length, opts) {
|
||||
var start = data.l;
|
||||
var cell = parse_Cell(data);
|
||||
var value = parse_XLWideString(data);
|
||||
data.l = start + length;
|
||||
return [cell, value, 'str' /*, formula */];
|
||||
var o = [cell, value, 'str'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, start + length - data.l);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l = start + length;
|
||||
return o;
|
||||
};
|
||||
|
||||
var parse_BrtCellBlank = parsenoop;
|
||||
|
||||
/* [MS-XLSB] 2.1.7.61 Worksheet */
|
||||
var parse_ws_bin = function(data, opts) {
|
||||
if(!data) return data;
|
||||
@ -126,7 +148,7 @@ var parse_ws_bin = function(data, opts) {
|
||||
case 'e': p.raw = val[1]; p.v = BErr[p.raw]; break;
|
||||
case 'str': p.v = utf8read(val[1]); break;
|
||||
}
|
||||
if(val[3] && opts.cellFormula) p.f = val[3];
|
||||
if(opts.cellFormula && val.length > 3) p.f = val[3];
|
||||
if((cf = styles.CellXf[val[0].iStyleRef])) try {
|
||||
p.w = SSF.format(cf.ifmt,p.v,_ssfopts);
|
||||
if(opts.cellNF) p.z = SSF._table[cf.ifmt];
|
||||
@ -136,7 +158,6 @@ var parse_ws_bin = function(data, opts) {
|
||||
|
||||
case 'BrtCellBlank': break; // (blank cell)
|
||||
|
||||
case 'BrtFmt': break; // TODO
|
||||
case 'BrtArrFmla': break; // TODO
|
||||
case 'BrtShrFmla': break; // TODO
|
||||
case 'BrtBeginSheet': break;
|
||||
@ -163,9 +184,13 @@ var parse_ws_bin = function(data, opts) {
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
case 'BrtEndSheet': break; // TODO
|
||||
case 'BrtBeginMergeCells': break; // TODO
|
||||
case 'BrtMergeCell': break; // TODO
|
||||
case 'BrtEndMergeCells': break; // TODO
|
||||
case 'BrtLegacyDrawing': break; // TODO
|
||||
//default: if(!pass) throw new Error("Unexpected record " + R.n);
|
||||
}
|
||||
});
|
||||
}, opts);
|
||||
s["!ref"] = encode_range(ref);
|
||||
return s;
|
||||
};
|
||||
|
@ -6,6 +6,8 @@ function fixopts(opts) {
|
||||
|
||||
['sheetStubs', false], /* emit empty cells */
|
||||
|
||||
['bookSheets', false], /* only try to get sheet names (no Sheets) */
|
||||
|
||||
['WTF', false] /* WTF mode (do not use) */
|
||||
];
|
||||
defaults.forEach(function(d) { if(typeof opts[d[0]] === 'undefined') opts[d[0]] = d[1]; });
|
||||
|
@ -12,19 +12,29 @@ function parseZip(zip, opts) {
|
||||
dir.workbooks.push(binname);
|
||||
xlsb = true;
|
||||
}
|
||||
strs = {};
|
||||
if(dir.sst) strs=parse_sst(getdata(getzipfile(zip, dir.sst.replace(/^\//,''))), dir.sst, opts);
|
||||
|
||||
styles = {};
|
||||
if(dir.style) styles = parse_sty(getdata(getzipfile(zip, dir.style.replace(/^\//,''))),dir.style);
|
||||
if(!opts.bookSheets) {
|
||||
strs = {};
|
||||
if(dir.sst) strs=parse_sst(getdata(getzipfile(zip, dir.sst.replace(/^\//,''))), dir.sst, opts);
|
||||
|
||||
styles = {};
|
||||
if(dir.style) styles = parse_sty(getdata(getzipfile(zip, dir.style.replace(/^\//,''))),dir.style);
|
||||
}
|
||||
|
||||
var wb = parse_wb(getdata(getzipfile(zip, dir.workbooks[0].replace(/^\//,''))), dir.workbooks[0], opts);
|
||||
|
||||
var wb = parse_wb(getdata(getzipfile(zip, dir.workbooks[0].replace(/^\//,''))), dir.workbooks[0]);
|
||||
var props = {}, propdata = "";
|
||||
try {
|
||||
propdata = dir.coreprops.length !== 0 ? getdata(getzipfile(zip, dir.coreprops[0].replace(/^\//,''))) : "";
|
||||
propdata += dir.extprops.length !== 0 ? getdata(getzipfile(zip, dir.extprops[0].replace(/^\//,''))) : "";
|
||||
props = propdata !== "" ? parseProps(propdata) : {};
|
||||
} catch(e) { }
|
||||
|
||||
if(opts.bookSheets) {
|
||||
if(props.Worksheets && props.SheetNames.length > 0) return { SheetNames:props.SheetNames };
|
||||
else if(wb.Sheets) return { SheetNames:wb.Sheets.map(function(x) { return x.name; }) };
|
||||
}
|
||||
|
||||
var deps = {};
|
||||
if(dir.calcchain) deps=parseDeps(getdata(getzipfile(zip, dir.calcchain.replace(/^\//,''))));
|
||||
var sheets = {}, i=0;
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.5.4",
|
||||
"version": "0.5.5",
|
||||
"author": "sheetjs",
|
||||
"description": "XLSB / XLSX / XLSM parser",
|
||||
"keywords": [ "xlsx", "xlsb", "xlsm", "office", "excel", "spreadsheet" ],
|
||||
|
25
test.js
25
test.js
@ -4,6 +4,8 @@ var fs = require('fs'), assert = require('assert');
|
||||
describe('source',function(){ it('should load', function(){ XLSX = require('./'); });});
|
||||
|
||||
var ex = [".xlsb", ".xlsm", ".xlsx"];
|
||||
if(process.env.FMTS) ex=process.env.FMTS.split(":").map(function(x){return x[0]==="."?x:"."+x;});
|
||||
console.log(ex, process.env.FMTS);
|
||||
var exp = ex.map(function(x){ return x + ".pending"; });
|
||||
function test_file(x){return ex.indexOf(x.substr(-5))>=0||exp.indexOf(x.substr(-13))>=0;}
|
||||
|
||||
@ -106,4 +108,27 @@ describe('options', function() {
|
||||
assert(typeof ws[addr].h === 'undefined');
|
||||
});
|
||||
});
|
||||
it('should generate formulae by default', function() {
|
||||
var wb = XLSX.readFile('./test_files/formula_stress_test.xlsb');
|
||||
var found = false;
|
||||
wb.SheetNames.forEach(function(s) {
|
||||
var ws = wb.Sheets[s];
|
||||
console.log(ws);
|
||||
Object.keys(ws).forEach(function(addr) {
|
||||
if(addr[0] === "!" || !ws.hasOwnProperty(addr)) return;
|
||||
if(typeof ws[addr].f !== 'undefined') return found = true;
|
||||
});
|
||||
});
|
||||
assert(found);
|
||||
});
|
||||
it('should not generate formulae when requested', function() {
|
||||
var wb = XLSX.readFile('./test_files/formula_stress_test.xlsb', {cellFormula: false});
|
||||
wb.SheetNames.forEach(function(s) {
|
||||
var ws = wb.Sheets[s];
|
||||
Object.keys(ws).forEach(function(addr) {
|
||||
if(addr[0] === "!" || !ws.hasOwnProperty(addr)) return;
|
||||
assert(typeof ws[addr].f === 'undefined');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 709d865dc7f9d7173bc4b5f5c6b0c5aea945589c
|
||||
Subproject commit 5a2df78bfe58c087fc604450185ee3bc4fb2c077
|
96
xlsx.js
96
xlsx.js
@ -424,7 +424,7 @@ SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i]) SSF.loa
|
||||
make_ssf(SSF);
|
||||
var XLSX = {};
|
||||
(function(XLSX){
|
||||
XLSX.version = '0.5.4';
|
||||
XLSX.version = '0.5.5';
|
||||
var current_codepage, current_cptable, cptable;
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
if(typeof cptable === 'undefined') cptable = require('codepage');
|
||||
@ -621,7 +621,7 @@ function prep_blob(blob, pos) {
|
||||
|
||||
function parsenoop(blob, length) { blob.l += length; }
|
||||
/* [MS-XLSB] 2.1.4 Record */
|
||||
var recordhopper = function(data, cb) {
|
||||
var recordhopper = function(data, cb, opts) {
|
||||
var tmpbyte, cntbyte, length;
|
||||
prep_blob(data, data.l || 0);
|
||||
while(data.l < data.length) {
|
||||
@ -631,7 +631,7 @@ var recordhopper = function(data, cb) {
|
||||
tmpbyte = data.read_shift(1);
|
||||
length = tmpbyte & 0x7F;
|
||||
for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);
|
||||
var d = R.f(data, length);
|
||||
var d = R.f(data, length, opts);
|
||||
if(cb(d, R, RT)) return;
|
||||
}
|
||||
};
|
||||
@ -1235,6 +1235,11 @@ function insertCommentsIntoSheet(sheetName, sheet, comments) {
|
||||
});
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */
|
||||
var parse_CellParsedFormula = function(data, length) {
|
||||
var cce = data.read_shift(4);
|
||||
return parsenoop(data, length-4);
|
||||
};
|
||||
var strs = {}; // shared strings
|
||||
var _ssfopts = {}; // spreadsheet formatting options
|
||||
|
||||
@ -1325,6 +1330,7 @@ function parse_ws_xml(data, opts) {
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
/* [MS-XLSB] 2.4.718 BrtRowHdr */
|
||||
var parse_BrtRowHdr = function(data, length) {
|
||||
var z = {};
|
||||
@ -1345,6 +1351,9 @@ var parse_BrtWsProp = function(data, length) {
|
||||
return z;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.303 BrtCellBlank */
|
||||
var parse_BrtCellBlank = parsenoop;
|
||||
|
||||
/* [MS-XLSB] 2.4.304 BrtCellBool */
|
||||
var parse_BrtCellBool = function(data, length) {
|
||||
var cell = parse_Cell(data);
|
||||
@ -1380,7 +1389,7 @@ var parse_BrtCellRk = function(data, length) {
|
||||
return [cell, value, 'n'];
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.311 BrtCellRk */
|
||||
/* [MS-XLSB] 2.4.314 BrtCellSt */
|
||||
var parse_BrtCellSt = function(data, length) {
|
||||
var cell = parse_Cell(data);
|
||||
var value = parse_XLWideString(data);
|
||||
@ -1388,40 +1397,58 @@ var parse_BrtCellSt = function(data, length) {
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.647 BrtFmlaBool */
|
||||
var parse_BrtFmlaBool = function(data, length) {
|
||||
var parse_BrtFmlaBool = function(data, length, opts) {
|
||||
var cell = parse_Cell(data);
|
||||
var value = data.read_shift(1);
|
||||
data.l += length-9;
|
||||
return [cell, value, 'b' /*, formula */];
|
||||
var o = [cell, value, 'b'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, length-9);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l += length-9;
|
||||
return o;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.648 BrtFmlaError */
|
||||
var parse_BrtFmlaError = function(data, length) {
|
||||
var parse_BrtFmlaError = function(data, length, opts) {
|
||||
var cell = parse_Cell(data);
|
||||
var fBool = data.read_shift(1);
|
||||
data.l += length-9;
|
||||
return [cell, fBool, 'e'];
|
||||
var value = data.read_shift(1);
|
||||
var o = [cell, value, 'e'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, length-9);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l += length-9;
|
||||
return o;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.649 BrtFmlaNum */
|
||||
var parse_BrtFmlaNum = function(data, length) {
|
||||
var parse_BrtFmlaNum = function(data, length, opts) {
|
||||
var cell = parse_Cell(data);
|
||||
var value = parse_Xnum(data);
|
||||
data.l += length-16;
|
||||
return [cell, value, 'n' /*, formula */];
|
||||
var o = [cell, value, 'n'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, length - 16);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l += length-16;
|
||||
return o;
|
||||
};
|
||||
|
||||
/* [MS-XLSB] 2.4.650 BrtFmlaString */
|
||||
var parse_BrtFmlaString = function(data, length) {
|
||||
var parse_BrtFmlaString = function(data, length, opts) {
|
||||
var start = data.l;
|
||||
var cell = parse_Cell(data);
|
||||
var value = parse_XLWideString(data);
|
||||
data.l = start + length;
|
||||
return [cell, value, 'str' /*, formula */];
|
||||
var o = [cell, value, 'str'];
|
||||
if(opts.cellFormula) {
|
||||
var formula = parse_CellParsedFormula(data, start + length - data.l);
|
||||
o[3] = ""; /* TODO */
|
||||
}
|
||||
else data.l = start + length;
|
||||
return o;
|
||||
};
|
||||
|
||||
var parse_BrtCellBlank = parsenoop;
|
||||
|
||||
/* [MS-XLSB] 2.1.7.61 Worksheet */
|
||||
var parse_ws_bin = function(data, opts) {
|
||||
if(!data) return data;
|
||||
@ -1453,7 +1480,7 @@ var parse_ws_bin = function(data, opts) {
|
||||
case 'e': p.raw = val[1]; p.v = BErr[p.raw]; break;
|
||||
case 'str': p.v = utf8read(val[1]); break;
|
||||
}
|
||||
if(val[3] && opts.cellFormula) p.f = val[3];
|
||||
if(opts.cellFormula && val.length > 3) p.f = val[3];
|
||||
if((cf = styles.CellXf[val[0].iStyleRef])) try {
|
||||
p.w = SSF.format(cf.ifmt,p.v,_ssfopts);
|
||||
if(opts.cellNF) p.z = SSF._table[cf.ifmt];
|
||||
@ -1463,7 +1490,6 @@ var parse_ws_bin = function(data, opts) {
|
||||
|
||||
case 'BrtCellBlank': break; // (blank cell)
|
||||
|
||||
case 'BrtFmt': break; // TODO
|
||||
case 'BrtArrFmla': break; // TODO
|
||||
case 'BrtShrFmla': break; // TODO
|
||||
case 'BrtBeginSheet': break;
|
||||
@ -1490,9 +1516,13 @@ var parse_ws_bin = function(data, opts) {
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
case 'BrtEndSheet': break; // TODO
|
||||
case 'BrtBeginMergeCells': break; // TODO
|
||||
case 'BrtMergeCell': break; // TODO
|
||||
case 'BrtEndMergeCells': break; // TODO
|
||||
case 'BrtLegacyDrawing': break; // TODO
|
||||
//default: if(!pass) throw new Error("Unexpected record " + R.n);
|
||||
}
|
||||
});
|
||||
}, opts);
|
||||
s["!ref"] = encode_range(ref);
|
||||
return s;
|
||||
};
|
||||
@ -2593,6 +2623,8 @@ function fixopts(opts) {
|
||||
|
||||
['sheetStubs', false], /* emit empty cells */
|
||||
|
||||
['bookSheets', false], /* only try to get sheet names (no Sheets) */
|
||||
|
||||
['WTF', false] /* WTF mode (do not use) */
|
||||
];
|
||||
defaults.forEach(function(d) { if(typeof opts[d[0]] === 'undefined') opts[d[0]] = d[1]; });
|
||||
@ -2611,19 +2643,29 @@ function parseZip(zip, opts) {
|
||||
dir.workbooks.push(binname);
|
||||
xlsb = true;
|
||||
}
|
||||
strs = {};
|
||||
if(dir.sst) strs=parse_sst(getdata(getzipfile(zip, dir.sst.replace(/^\//,''))), dir.sst, opts);
|
||||
|
||||
styles = {};
|
||||
if(dir.style) styles = parse_sty(getdata(getzipfile(zip, dir.style.replace(/^\//,''))),dir.style);
|
||||
if(!opts.bookSheets) {
|
||||
strs = {};
|
||||
if(dir.sst) strs=parse_sst(getdata(getzipfile(zip, dir.sst.replace(/^\//,''))), dir.sst, opts);
|
||||
|
||||
styles = {};
|
||||
if(dir.style) styles = parse_sty(getdata(getzipfile(zip, dir.style.replace(/^\//,''))),dir.style);
|
||||
}
|
||||
|
||||
var wb = parse_wb(getdata(getzipfile(zip, dir.workbooks[0].replace(/^\//,''))), dir.workbooks[0], opts);
|
||||
|
||||
var wb = parse_wb(getdata(getzipfile(zip, dir.workbooks[0].replace(/^\//,''))), dir.workbooks[0]);
|
||||
var props = {}, propdata = "";
|
||||
try {
|
||||
propdata = dir.coreprops.length !== 0 ? getdata(getzipfile(zip, dir.coreprops[0].replace(/^\//,''))) : "";
|
||||
propdata += dir.extprops.length !== 0 ? getdata(getzipfile(zip, dir.extprops[0].replace(/^\//,''))) : "";
|
||||
props = propdata !== "" ? parseProps(propdata) : {};
|
||||
} catch(e) { }
|
||||
|
||||
if(opts.bookSheets) {
|
||||
if(props.Worksheets && props.SheetNames.length > 0) return { SheetNames:props.SheetNames };
|
||||
else if(wb.Sheets) return { SheetNames:wb.Sheets.map(function(x) { return x.name; }) };
|
||||
}
|
||||
|
||||
var deps = {};
|
||||
if(dir.calcchain) deps=parseDeps(getdata(getzipfile(zip, dir.calcchain.replace(/^\//,''))));
|
||||
var sheets = {}, i=0;
|
||||
|
Loading…
Reference in New Issue
Block a user