forked from sheetjs/sheetjs
version bump 0.5.6: custom properties
- custom properties (h/t @hmalphettes) - new option bookProps - added minified target (using uglify-js)
This commit is contained in:
parent
0b1c878ef2
commit
2cb06e0fb8
6
Makefile
6
Makefile
@ -40,9 +40,13 @@ lint: $(TARGET)
|
||||
.PHONY: cov
|
||||
cov: misc/coverage.html
|
||||
|
||||
misc/coverage.html: xlsx.js
|
||||
misc/coverage.html: xlsx.js test.js
|
||||
mocha --require blanket -R html-cov > misc/coverage.html
|
||||
|
||||
.PHONY: coveralls
|
||||
coveralls:
|
||||
mocha --require blanket --reporter mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js
|
||||
|
||||
.PHONY: dist
|
||||
dist: xlsx.js
|
||||
uglifyjs xlsx.js -o dist/xlsx.min.js --source-map dist/xlsx.min.map --preamble "$$(head -n 1 bits/00_header.js)"
|
||||
|
@ -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 |
|
||||
| bookProps | false | If true, only parse enough to get book metadata ** |
|
||||
| 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.
|
||||
- `bookSheets` and `bookProps` combine to give both sets of information
|
||||
|
||||
The defaults are enumerated in bits/84_defaults.js
|
||||
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.5.5';
|
||||
XLSX.version = '0.5.6';
|
||||
|
@ -25,6 +25,12 @@ var parse_wb_bin = function(data) {
|
||||
case 'BrtEndBookViews': break;
|
||||
case 'BrtBeginBundleShs': break;
|
||||
case 'BrtEndBundleShs': break;
|
||||
case 'BrtBeginFnGroup': break;
|
||||
case 'BrtEndFnGroup': break;
|
||||
case 'BrtBeginExternals': break;
|
||||
case 'BrtSupSelf': break;
|
||||
case 'BrtExternSheet': break;
|
||||
case 'BrtEndExternals': break;
|
||||
case 'BrtName': break;
|
||||
case 'BrtCalcProp': break;
|
||||
case 'BrtBeginPivotCacheIDs': break;
|
||||
@ -35,7 +41,6 @@ var parse_wb_bin = function(data) {
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
case 'BrtEndBook': break;
|
||||
case '': break;
|
||||
//default: if(!pass) throw new Error("Unexpected record " + R.n);
|
||||
}
|
||||
});
|
||||
|
@ -7,6 +7,7 @@ function fixopts(opts) {
|
||||
['sheetStubs', false], /* emit empty cells */
|
||||
|
||||
['bookSheets', false], /* only try to get sheet names (no Sheets) */
|
||||
['bookProps', false], /* only try to get properties (no Sheets) */
|
||||
|
||||
['WTF', false] /* WTF mode (do not use) */
|
||||
];
|
||||
|
@ -13,7 +13,7 @@ function parseZip(zip, opts) {
|
||||
xlsb = true;
|
||||
}
|
||||
|
||||
if(!opts.bookSheets) {
|
||||
if(!opts.bookSheets && !opts.bookProps) {
|
||||
strs = {};
|
||||
if(dir.sst) strs=parse_sst(getdata(getzipfile(zip, dir.sst.replace(/^\//,''))), dir.sst, opts);
|
||||
|
||||
@ -29,17 +29,23 @@ function parseZip(zip, opts) {
|
||||
propdata += dir.extprops.length !== 0 ? getdata(getzipfile(zip, dir.extprops[0].replace(/^\//,''))) : "";
|
||||
props = propdata !== "" ? parseProps(propdata) : {};
|
||||
} catch(e) { }
|
||||
|
||||
var custprops = {};
|
||||
if (dir.custprops.length !== 0) {
|
||||
try {
|
||||
if(!opts.bookSheets || opts.bookProps) {
|
||||
if (dir.custprops.length !== 0) try {
|
||||
propdata = getdata(getzipfile(zip, dir.custprops[0].replace(/^\//,'')));
|
||||
custprops = parseCustomProps(propdata);
|
||||
} catch(e) {/*console.error(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 out = {};
|
||||
if(opts.bookSheets || opts.bookProps) {
|
||||
var sheets;
|
||||
if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;
|
||||
else if(wb.Sheets) sheets = wb.Sheets.map(function(x){ return x.name; });
|
||||
if(opts.bookProps) { out.Props = props; out.Custprops = custprops; }
|
||||
if(typeof sheets !== 'undefined') out.SheetNames = sheets;
|
||||
if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;
|
||||
}
|
||||
|
||||
var deps = {};
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.5.5",
|
||||
"version": "0.5.6",
|
||||
"author": "sheetjs",
|
||||
"description": "XLSB / XLSX / XLSM parser",
|
||||
"keywords": [ "xlsx", "xlsb", "xlsm", "office", "excel", "spreadsheet" ],
|
||||
@ -16,6 +16,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha":"",
|
||||
"uglify-js":"",
|
||||
"jasmine-node": "x"
|
||||
},
|
||||
"repository": { "type":"git", "url":"git://github.com/SheetJS/js-xlsx.git" },
|
||||
|
29
test.js
29
test.js
@ -157,13 +157,38 @@ describe('options', function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('book', function() {
|
||||
it('bookSheets should not generate sheets', function() {
|
||||
var wb = XLSX.readFile('./test_files/merge_cells.xlsx', {bookSheets:true});
|
||||
assert(typeof wb.Sheets === 'undefined');
|
||||
});
|
||||
it('bookProps should not generate sheets', function() {
|
||||
var wb = XLSX.readFile('./test_files/number_format.xlsb', {bookProps:true});
|
||||
assert(typeof wb.Sheets === 'undefined');
|
||||
});
|
||||
it('bookProps && bookSheets should not generate sheets', function() {
|
||||
var wb = XLSX.readFile('./test_files/LONumbers.xlsx', {bookProps:true, bookSheets:true});
|
||||
assert(typeof wb.Sheets === 'undefined');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe.skip('should have core properties and custom properties parsed', function() {
|
||||
describe('input formats', function() {
|
||||
it('should read binary strings', function() {
|
||||
XLSX.read(fs.readFileSync('./test_files/comments_stress_test.xlsb', 'binary'), {type: 'binary'});
|
||||
XLSX.read(fs.readFileSync('./test_files/comments_stress_test.xlsx', 'binary'), {type: 'binary'});
|
||||
});
|
||||
it('should read base64 strings', function() {
|
||||
XLSX.read(fs.readFileSync('./test_files/comments_stress_test.xlsb', 'base64'), {type: 'base64'});
|
||||
XLSX.read(fs.readFileSync('./test_files/comments_stress_test.xlsx', 'base64'), {type: 'base64'});
|
||||
});
|
||||
});
|
||||
|
||||
describe('should have core properties and custom properties parsed', function() {
|
||||
var wb;
|
||||
before(function() {
|
||||
XLSX = require('./');
|
||||
wb = XLSX.readFile('./test_files/excel-properties.xlsx', { sheetStubs: false });
|
||||
wb = XLSX.readFile('./test_files/custom_properties.xlsx');
|
||||
});
|
||||
it('Must have read the core properties', function() {
|
||||
assert.equal(wb.Props.Company, 'Vector Inc');
|
||||
|
@ -1,5 +1,6 @@
|
||||
RkNumber.xlsb
|
||||
comments_stress_test.xlsb
|
||||
custom_properties.xlsb
|
||||
formula_stress_test.xlsb
|
||||
large_strings.xlsb.pending
|
||||
merge_cells.xlsb
|
||||
@ -140,6 +141,7 @@ apachepoi_workbookProtection_workbook_windows_protected.xlsx
|
||||
apachepoi_workbookProtection_worksheet_protected.xlsx
|
||||
apachepoi_xlsx-jdbc.xlsx
|
||||
comments_stress_test.xlsx
|
||||
custom_properties.xlsx
|
||||
excel-reader-xlsx_data01.xlsx
|
||||
excel-reader-xlsx_data02.xlsx
|
||||
excel-reader-xlsx_error02.xlsx.pending
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 5a2df78bfe58c087fc604450185ee3bc4fb2c077
|
||||
Subproject commit 255a962b8f9a0f07ac75281bded02fea93e00b16
|
28
xlsx.js
28
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.5';
|
||||
XLSX.version = '0.5.6';
|
||||
var current_codepage, current_cptable, cptable;
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
if(typeof cptable === 'undefined') cptable = require('codepage');
|
||||
@ -1795,6 +1795,12 @@ var parse_wb_bin = function(data) {
|
||||
case 'BrtEndBookViews': break;
|
||||
case 'BrtBeginBundleShs': break;
|
||||
case 'BrtEndBundleShs': break;
|
||||
case 'BrtBeginFnGroup': break;
|
||||
case 'BrtEndFnGroup': break;
|
||||
case 'BrtBeginExternals': break;
|
||||
case 'BrtSupSelf': break;
|
||||
case 'BrtExternSheet': break;
|
||||
case 'BrtEndExternals': break;
|
||||
case 'BrtName': break;
|
||||
case 'BrtCalcProp': break;
|
||||
case 'BrtBeginPivotCacheIDs': break;
|
||||
@ -1805,7 +1811,6 @@ var parse_wb_bin = function(data) {
|
||||
case 'BrtFRTBegin': pass = true; break;
|
||||
case 'BrtFRTEnd': pass = false; break;
|
||||
case 'BrtEndBook': break;
|
||||
case '': break;
|
||||
//default: if(!pass) throw new Error("Unexpected record " + R.n);
|
||||
}
|
||||
});
|
||||
@ -2665,6 +2670,7 @@ function fixopts(opts) {
|
||||
['sheetStubs', false], /* emit empty cells */
|
||||
|
||||
['bookSheets', false], /* only try to get sheet names (no Sheets) */
|
||||
['bookProps', false], /* only try to get properties (no Sheets) */
|
||||
|
||||
['WTF', false] /* WTF mode (do not use) */
|
||||
];
|
||||
@ -2685,7 +2691,7 @@ function parseZip(zip, opts) {
|
||||
xlsb = true;
|
||||
}
|
||||
|
||||
if(!opts.bookSheets) {
|
||||
if(!opts.bookSheets && !opts.bookProps) {
|
||||
strs = {};
|
||||
if(dir.sst) strs=parse_sst(getdata(getzipfile(zip, dir.sst.replace(/^\//,''))), dir.sst, opts);
|
||||
|
||||
@ -2701,17 +2707,23 @@ function parseZip(zip, opts) {
|
||||
propdata += dir.extprops.length !== 0 ? getdata(getzipfile(zip, dir.extprops[0].replace(/^\//,''))) : "";
|
||||
props = propdata !== "" ? parseProps(propdata) : {};
|
||||
} catch(e) { }
|
||||
|
||||
var custprops = {};
|
||||
if (dir.custprops.length !== 0) {
|
||||
try {
|
||||
if(!opts.bookSheets || opts.bookProps) {
|
||||
if (dir.custprops.length !== 0) try {
|
||||
propdata = getdata(getzipfile(zip, dir.custprops[0].replace(/^\//,'')));
|
||||
custprops = parseCustomProps(propdata);
|
||||
} catch(e) {/*console.error(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 out = {};
|
||||
if(opts.bookSheets || opts.bookProps) {
|
||||
var sheets;
|
||||
if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;
|
||||
else if(wb.Sheets) sheets = wb.Sheets.map(function(x){ return x.name; });
|
||||
if(opts.bookProps) { out.Props = props; out.Custprops = custprops; }
|
||||
if(typeof sheets !== 'undefined') out.SheetNames = sheets;
|
||||
if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;
|
||||
}
|
||||
|
||||
var deps = {};
|
||||
|
Loading…
Reference in New Issue
Block a user