version bump 0.13.2: Buffer issues

- node 4.x buffer fix (fixes  h/t @gabyidong)
- dependencies: CFB 1.0.8, codepage 1.14.0
- json object stream
This commit is contained in:
SheetJS 2018-07-08 23:46:11 -04:00
parent b6fd433a42
commit a9b8588e6c
29 changed files with 788 additions and 341 deletions

@ -28,6 +28,9 @@ matrix:
env: TZ="America/Anchorage" FMTS=misc env: TZ="America/Anchorage" FMTS=misc
- node_js: "4" - node_js: "4"
env: TZ="America/Barbados" FMTS=misc env: TZ="America/Barbados" FMTS=misc
# see GH issue #1150
- node_js: "4.4.7"
env: TZ="Asia/Tokyo" FMTS=misc
- node_js: "0.12" - node_js: "0.12"
env: TZ="America/Cayman" FMTS=misc env: TZ="America/Cayman" FMTS=misc
- node_js: "0.10" - node_js: "0.10"

@ -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.
## 0.13.2 (2018-07-08)
* Buffer.from shim replaced, will not be defined in node `<=0.12`
## 0.13.0 (2018-06-01) ## 0.13.0 (2018-06-01)
* Library reshaped to support AMD out of the box * Library reshaped to support AMD out of the box

@ -792,6 +792,7 @@ Stream. They are only exposed in NodeJS.
- `XLSX.stream.to_csv` is the streaming version of `XLSX.utils.sheet_to_csv`. - `XLSX.stream.to_csv` is the streaming version of `XLSX.utils.sheet_to_csv`.
- `XLSX.stream.to_html` is the streaming version of `XLSX.utils.sheet_to_html`. - `XLSX.stream.to_html` is the streaming version of `XLSX.utils.sheet_to_html`.
- `XLSX.stream.to_json` is the streaming version of `XLSX.utils.sheet_to_json`.
<details> <details>
<summary><b>nodejs convert to CSV and write file</b> (click to show)</summary> <summary><b>nodejs convert to CSV and write file</b> (click to show)</summary>
@ -804,6 +805,22 @@ stream.pipe(fs.createWriteStream(output_file_name));
</details> </details>
<details>
<summary><b>nodejs write JSON stream to screen</b> (click to show)</summary>
```js
/* to_json returns an object-mode stream */
var stream = XLSX.stream.to_json(worksheet, {raw:true});
/* the following stream converts JS objects to text via JSON.stringify */
var conv = new Transform({writableObjectMode:true});
conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };
stream.pipe(conv); conv.pipe(process.stdout);
```
</details>
<https://github.com/sheetjs/sheetaki> pipes write streams to nodejs response. <https://github.com/sheetjs/sheetaki> pipes write streams to nodejs response.
## Interface ## Interface

@ -1 +1 @@
XLSX.version = '0.13.1'; XLSX.version = '0.13.2';

@ -1,8 +1,11 @@
var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node); var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node);
var Buffer_from = /*::(*/function(){}/*:: :any)*/;
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
@ -14,7 +17,8 @@ function new_raw_buf(len/*:number*/) {
} }
var s2a = function s2a(s/*:string*/)/*:any*/ { var s2a = function s2a(s/*:string*/)/*:any*/ {
if(has_buf) return Buffer.from(s, "binary"); // $FlowIgnore
if(has_buf) return Buffer_from(s, "binary");
return s.split("").map(function(x/*:string*/)/*:number*/{ return x.charCodeAt(0) & 0xff; }); return s.split("").map(function(x/*:string*/)/*:number*/{ return x.charCodeAt(0) & 0xff; });
}; };

@ -38,7 +38,7 @@ type CFBFiles = {[n:string]:CFBEntry};
/* [MS-CFB] v20171201 */ /* [MS-CFB] v20171201 */
var CFB = (function _CFB(){ var CFB = (function _CFB(){
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/; var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
exports.version = '1.0.7'; exports.version = '1.0.8';
/* [MS-CFB] 2.6.4 */ /* [MS-CFB] 2.6.4 */
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ { function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
var L = l.split("/"), R = r.split("/"); var L = l.split("/"), R = r.split("/");

@ -152,10 +152,12 @@ if(has_buf) {
}; };
var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3"; var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb; if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
var utf8readc = function utf8readc(data) { return Buffer.from(data, 'binary').toString('utf8'); }; // $FlowIgnore
var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc; if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
utf8write = function(data) { return Buffer.from(data, 'utf8').toString("binary"); }; // $FlowIgnore
utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
} }
// matches <foo>...</foo> extracts content // matches <foo>...</foo> extracts content

@ -46,7 +46,8 @@ function write_string_type(out/*:string*/, opts/*:WriteOpts*/, bom/*:?string*/)/
case "string": return out; case "string": return out;
case "file": return write_dl(opts.file, o, 'utf8'); case "file": return write_dl(opts.file, o, 'utf8');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(o, 'utf8'); // $FlowIgnore
if(has_buf) return Buffer_from(o, 'utf8');
else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); }); else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -60,7 +61,8 @@ function write_stxt_type(out/*:string*/, opts/*:WriteOpts*/)/*:any*/ {
case "string": return out; /* override in sheet_to_txt */ case "string": return out; /* override in sheet_to_txt */
case "file": return write_dl(opts.file, out, 'binary'); case "file": return write_dl(opts.file, out, 'binary');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(out, 'binary'); // $FlowIgnore
if(has_buf) return Buffer_from(out, 'binary');
else return out.split("").map(function(c) { return c.charCodeAt(0); }); else return out.split("").map(function(c) { return c.charCodeAt(0); });
} }
} }

@ -1,10 +1,52 @@
/*::
type MJRObject = {
row: any;
isempty: boolean;
};
*/
function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, header/*:number*/, hdr/*:Array<any>*/, dense/*:boolean*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ {
var rr = encode_row(R);
var defval = o.defval, raw = o.raw;
var isempty = true;
var row/*:any*/ = (header === 1) ? [] : {};
if(header !== 1) {
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
var v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
return { row: row, isempty: isempty };
}
function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) { function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
if(sheet == null || sheet["!ref"] == null) return []; if(sheet == null || sheet["!ref"] == null) return [];
var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array<any>*/ = [], isempty = true, v=0, vv=""; var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array<any>*/ = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}}; var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {}; var o = opts || {};
var raw = o.raw;
var defval = o.defval;
var range = o.range != null ? o.range : sheet["!ref"]; var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1; if(o.header === 1) header = 1;
else if(o.header === "A") header = 2; else if(o.header === "A") header = 2;
@ -37,42 +79,9 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
hdr[C] = vv; hdr[C] = vv;
} }
} }
var row/*:any*/ = (header === 1) ? [] : {};
for (R = r.s.r + offset; R <= r.e.r; ++R) { for (R = r.s.r + offset; R <= r.e.r; ++R) {
rr = encode_row(R); var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
isempty = true; if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
if(header === 1) row = [];
else {
row = {};
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (C = r.s.c; C <= r.e.c; ++C) {
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
if((isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row;
} }
out.length = outi; out.length = outi;
return out; return out;

@ -59,7 +59,62 @@ if(has_buf && typeof require != 'undefined') (function() {
return stream; return stream;
}; };
var write_json_stream = function(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
var stream = Readable({objectMode:true});
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array<any>*/ = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {};
var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1;
else if(o.header === "A") header = 2;
else if(Array.isArray(o.header)) header = 3;
switch(typeof range) {
case 'string': r = safe_decode_range(range); break;
case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
default: r = range;
}
if(header > 0) offset = 0;
var rr = encode_row(r.s.r);
var cols/*:Array<string>*/ = [];
var counter = 0;
var dense = Array.isArray(sheet);
var R = r.s.r, C = 0, CC = 0;
if(dense && !sheet[R]) sheet[R] = [];
for(C = r.s.c; C <= r.e.c; ++C) {
cols[C] = encode_col(C);
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
switch(header) {
case 1: hdr[C] = C - r.s.c; break;
case 2: hdr[C] = cols[C]; break;
case 3: hdr[C] = o.header[C - r.s.c]; break;
default:
if(val == null) val = {w: "__EMPTY", t: "s"};
vv = v = format_cell(val, null, o);
counter = 0;
for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
hdr[C] = vv;
}
}
R = r.s.r + offset;
stream._read = function() {
if(R > r.e.r) return stream.push(null);
while(R <= r.e.r) {
++R;
//if ((rowinfo[R-1]||{}).hidden) continue;
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
stream.push(row.row);
break;
}
}
};
return stream;
};
XLSX.stream = { XLSX.stream = {
to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream to_csv: write_csv_stream
}; };

14
dist/cpexcel.js generated vendored

@ -1,6 +1,6 @@
/* cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */ /* cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */
/*jshint -W100 */ /*jshint -W100 */
var cptable = {version:"1.13.0"}; var cptable = {version:"1.14.0"};
cptable[437] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); cptable[437] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
cptable[620] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖÜ¢Ł¥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); cptable[620] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖÜ¢Ł¥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
cptable[737] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })(); cptable[737] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
@ -1017,9 +1017,11 @@ if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODE
var cca = function cca(x) { return x.charCodeAt(0); }; var cca = function cca(x) { return x.charCodeAt(0); };
var has_buf = (typeof Buffer !== 'undefined'); var has_buf = (typeof Buffer !== 'undefined');
var Buffer_from = function(){};
if(has_buf) { if(has_buf) {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); }; if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };
@ -1292,7 +1294,7 @@ if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODE
} }
else if((M=magic[cp])) switch(M) { else if((M=magic[cp])) switch(M) {
case "utf8": case "utf8":
if(has_buf && isstr) { out = Buffer.from(data, M); j = out.length; break; } if(has_buf && isstr) { out = Buffer_from(data, M); j = out.length; break; }
for(i = 0; i < len; ++i, ++j) { for(i = 0; i < len; ++i, ++j) {
w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0); w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
if(w <= 0x007F) out[j] = w; if(w <= 0x007F) out[j] = w;
@ -1314,7 +1316,7 @@ if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODE
} }
break; break;
case "ascii": case "ascii":
if(has_buf && typeof data === "string") { out = Buffer.from(data, M); j = out.length; break; } if(has_buf && typeof data === "string") { out = Buffer_from(data, M); j = out.length; break; }
for(i = 0; i < len; ++i, ++j) { for(i = 0; i < len; ++i, ++j) {
w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0); w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
if(w <= 0x007F) out[j] = w; if(w <= 0x007F) out[j] = w;
@ -1322,7 +1324,7 @@ if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODE
} }
break; break;
case "utf16le": case "utf16le":
if(has_buf && typeof data === "string") { out = Buffer.from(data, M); j = out.length; break; } if(has_buf && typeof data === "string") { out = Buffer_from(data, M); j = out.length; break; }
for(i = 0; i < len; ++i) { for(i = 0; i < len; ++i) {
w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0); w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
out[j++] = w&255; out[j++] = w&255;

8
dist/jszip.js generated vendored

@ -600,14 +600,16 @@ module.exports = function(data, options) {
},{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){ },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
(function (Buffer){ (function (Buffer){
'use strict'; 'use strict';
var Buffer_from = /*::(*/function(){}/*:: :any)*/;
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
module.exports = function(data, encoding){ module.exports = function(data, encoding){
return typeof data == 'number' ? Buffer.alloc(data) : Buffer.from(data, encoding); return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding);
}; };
module.exports.test = function(b){ module.exports.test = function(b){
return Buffer.isBuffer(b); return Buffer.isBuffer(b);

30
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

190
dist/xlsx.extendscript.js generated vendored

@ -757,14 +757,16 @@ module.exports = function(data, options) {
},{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){ },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
(function (Buffer){ (function (Buffer){
'use strict'; 'use strict';
var Buffer_from = /*::(*/function(){}/*:: :any)*/;
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
module.exports = function(data, encoding){ module.exports = function(data, encoding){
return typeof data == 'number' ? Buffer.alloc(data) : Buffer.from(data, encoding); return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding);
}; };
module.exports.test = function(b){ module.exports.test = function(b){
return Buffer.isBuffer(b); return Buffer.isBuffer(b);
@ -9158,7 +9160,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.13.1'; XLSX.version = '0.13.2';
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') {
@ -9281,9 +9283,12 @@ var Base64 = (function make_b64(){
})(); })();
var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node); var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node);
var Buffer_from = function(){};
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
@ -9295,7 +9300,8 @@ function new_raw_buf(len) {
} }
var s2a = function s2a(s) { var s2a = function s2a(s) {
if(has_buf) return Buffer.from(s, "binary"); // $FlowIgnore
if(has_buf) return Buffer_from(s, "binary");
return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; }); return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; });
}; };
@ -10287,7 +10293,7 @@ var DO_NOT_EXPORT_CFB = true;
/* [MS-CFB] v20171201 */ /* [MS-CFB] v20171201 */
var CFB = (function _CFB(){ var CFB = (function _CFB(){
var exports = {}; var exports = {};
exports.version = '1.0.7'; exports.version = '1.0.8';
/* [MS-CFB] 2.6.4 */ /* [MS-CFB] 2.6.4 */
function namecmp(l, r) { function namecmp(l, r) {
var L = l.split("/"), R = r.split("/"); var L = l.split("/"), R = r.split("/");
@ -11427,10 +11433,12 @@ if(has_buf) {
}; };
var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3"; var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb; if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
var utf8readc = function utf8readc(data) { return Buffer.from(data, 'binary').toString('utf8'); }; // $FlowIgnore
var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc; if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
utf8write = function(data) { return Buffer.from(data, 'utf8').toString("binary"); }; // $FlowIgnore
utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
} }
// matches <foo>...</foo> extracts content // matches <foo>...</foo> extracts content
@ -28774,7 +28782,8 @@ function write_string_type(out, opts, bom) {
case "string": return out; case "string": return out;
case "file": return write_dl(opts.file, o, 'utf8'); case "file": return write_dl(opts.file, o, 'utf8');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(o, 'utf8'); // $FlowIgnore
if(has_buf) return Buffer_from(o, 'utf8');
else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); }); else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -28788,7 +28797,8 @@ function write_stxt_type(out, opts) {
case "string": return out; /* override in sheet_to_txt */ case "string": return out; /* override in sheet_to_txt */
case "file": return write_dl(opts.file, out, 'binary'); case "file": return write_dl(opts.file, out, 'binary');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(out, 'binary'); // $FlowIgnore
if(has_buf) return Buffer_from(out, 'binary');
else return out.split("").map(function(c) { return c.charCodeAt(0); }); else return out.split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -28875,13 +28885,49 @@ function writeFileAsync(filename, wb, opts, cb) {
var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts); var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts);
return _fs.writeFile(filename, writeSync(wb, o), _cb); return _fs.writeFile(filename, writeSync(wb, o), _cb);
} }
function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
var rr = encode_row(R);
var defval = o.defval, raw = o.raw;
var isempty = true;
var row = (header === 1) ? [] : {};
if(header !== 1) {
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
var v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
return { row: row, isempty: isempty };
}
function sheet_to_json(sheet, opts) { function sheet_to_json(sheet, opts) {
if(sheet == null || sheet["!ref"] == null) return []; if(sheet == null || sheet["!ref"] == null) return [];
var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], isempty = true, v=0, vv=""; var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}}; var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {}; var o = opts || {};
var raw = o.raw;
var defval = o.defval;
var range = o.range != null ? o.range : sheet["!ref"]; var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1; if(o.header === 1) header = 1;
else if(o.header === "A") header = 2; else if(o.header === "A") header = 2;
@ -28914,42 +28960,9 @@ function sheet_to_json(sheet, opts) {
hdr[C] = vv; hdr[C] = vv;
} }
} }
var row = (header === 1) ? [] : {};
for (R = r.s.r + offset; R <= r.e.r; ++R) { for (R = r.s.r + offset; R <= r.e.r; ++R) {
rr = encode_row(R); var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
isempty = true; if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
if(header === 1) row = [];
else {
row = {};
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (C = r.s.c; C <= r.e.c; ++C) {
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
if((isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row;
} }
out.length = outi; out.length = outi;
return out; return out;
@ -29073,16 +29086,20 @@ function sheet_add_json(_ws, js, opts) {
var v = JS[k]; var v = JS[k];
var t = 'z'; var t = 'z';
var z = ""; var z = "";
if(typeof v == 'number') t = 'n'; if(v && typeof v === 'object' && !(v instanceof Date)){
else if(typeof v == 'boolean') t = 'b'; ws[encode_cell({c:_C + C,r:_R + R + offset})] = v;
else if(typeof v == 'string') t = 's'; } else {
else if(v instanceof Date) { if(typeof v == 'number') t = 'n';
t = 'd'; else if(typeof v == 'boolean') t = 'b';
if(!o.cellDates) { t = 'n'; v = datenum(v); } else if(typeof v == 'string') t = 's';
z = o.dateNF || SSF._table[14]; else if(v instanceof Date) {
t = 'd';
if(!o.cellDates) { t = 'n'; v = datenum(v); }
z = o.dateNF || SSF._table[14];
}
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v});
if(z) cell.z = z;
} }
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v});
if(z) cell.z = z;
}); });
}); });
range.e.c = Math.max(range.e.c, _C + hdr.length - 1); range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
@ -29293,7 +29310,62 @@ if(has_buf && typeof require != 'undefined') (function() {
return stream; return stream;
}; };
var write_json_stream = function(sheet, opts) {
var stream = Readable({objectMode:true});
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {};
var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1;
else if(o.header === "A") header = 2;
else if(Array.isArray(o.header)) header = 3;
switch(typeof range) {
case 'string': r = safe_decode_range(range); break;
case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
default: r = range;
}
if(header > 0) offset = 0;
var rr = encode_row(r.s.r);
var cols = [];
var counter = 0;
var dense = Array.isArray(sheet);
var R = r.s.r, C = 0, CC = 0;
if(dense && !sheet[R]) sheet[R] = [];
for(C = r.s.c; C <= r.e.c; ++C) {
cols[C] = encode_col(C);
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
switch(header) {
case 1: hdr[C] = C - r.s.c; break;
case 2: hdr[C] = cols[C]; break;
case 3: hdr[C] = o.header[C - r.s.c]; break;
default:
if(val == null) val = {w: "__EMPTY", t: "s"};
vv = v = format_cell(val, null, o);
counter = 0;
for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
hdr[C] = vv;
}
}
R = r.s.r + offset;
stream._read = function() {
if(R > r.e.r) return stream.push(null);
while(R <= r.e.r) {
++R;
//if ((rowinfo[R-1]||{}).hidden) continue;
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
stream.push(row.row);
break;
}
}
};
return stream;
};
XLSX.stream = { XLSX.stream = {
to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream to_csv: write_csv_stream
}; };

34
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

182
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.13.1'; XLSX.version = '0.13.2';
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') {
@ -127,9 +127,12 @@ var Base64 = (function make_b64(){
})(); })();
var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node); var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node);
var Buffer_from = function(){};
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
@ -141,7 +144,8 @@ function new_raw_buf(len) {
} }
var s2a = function s2a(s) { var s2a = function s2a(s) {
if(has_buf) return Buffer.from(s, "binary"); // $FlowIgnore
if(has_buf) return Buffer_from(s, "binary");
return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; }); return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; });
}; };
@ -1133,7 +1137,7 @@ var DO_NOT_EXPORT_CFB = true;
/* [MS-CFB] v20171201 */ /* [MS-CFB] v20171201 */
var CFB = (function _CFB(){ var CFB = (function _CFB(){
var exports = {}; var exports = {};
exports.version = '1.0.7'; exports.version = '1.0.8';
/* [MS-CFB] 2.6.4 */ /* [MS-CFB] 2.6.4 */
function namecmp(l, r) { function namecmp(l, r) {
var L = l.split("/"), R = r.split("/"); var L = l.split("/"), R = r.split("/");
@ -2273,10 +2277,12 @@ if(has_buf) {
}; };
var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3"; var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb; if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
var utf8readc = function utf8readc(data) { return Buffer.from(data, 'binary').toString('utf8'); }; // $FlowIgnore
var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc; if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
utf8write = function(data) { return Buffer.from(data, 'utf8').toString("binary"); }; // $FlowIgnore
utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
} }
// matches <foo>...</foo> extracts content // matches <foo>...</foo> extracts content
@ -19620,7 +19626,8 @@ function write_string_type(out, opts, bom) {
case "string": return out; case "string": return out;
case "file": return write_dl(opts.file, o, 'utf8'); case "file": return write_dl(opts.file, o, 'utf8');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(o, 'utf8'); // $FlowIgnore
if(has_buf) return Buffer_from(o, 'utf8');
else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); }); else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -19634,7 +19641,8 @@ function write_stxt_type(out, opts) {
case "string": return out; /* override in sheet_to_txt */ case "string": return out; /* override in sheet_to_txt */
case "file": return write_dl(opts.file, out, 'binary'); case "file": return write_dl(opts.file, out, 'binary');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(out, 'binary'); // $FlowIgnore
if(has_buf) return Buffer_from(out, 'binary');
else return out.split("").map(function(c) { return c.charCodeAt(0); }); else return out.split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -19721,13 +19729,49 @@ function writeFileAsync(filename, wb, opts, cb) {
var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts); var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts);
return _fs.writeFile(filename, writeSync(wb, o), _cb); return _fs.writeFile(filename, writeSync(wb, o), _cb);
} }
function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
var rr = encode_row(R);
var defval = o.defval, raw = o.raw;
var isempty = true;
var row = (header === 1) ? [] : {};
if(header !== 1) {
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
var v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
return { row: row, isempty: isempty };
}
function sheet_to_json(sheet, opts) { function sheet_to_json(sheet, opts) {
if(sheet == null || sheet["!ref"] == null) return []; if(sheet == null || sheet["!ref"] == null) return [];
var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], isempty = true, v=0, vv=""; var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}}; var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {}; var o = opts || {};
var raw = o.raw;
var defval = o.defval;
var range = o.range != null ? o.range : sheet["!ref"]; var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1; if(o.header === 1) header = 1;
else if(o.header === "A") header = 2; else if(o.header === "A") header = 2;
@ -19760,42 +19804,9 @@ function sheet_to_json(sheet, opts) {
hdr[C] = vv; hdr[C] = vv;
} }
} }
var row = (header === 1) ? [] : {};
for (R = r.s.r + offset; R <= r.e.r; ++R) { for (R = r.s.r + offset; R <= r.e.r; ++R) {
rr = encode_row(R); var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
isempty = true; if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
if(header === 1) row = [];
else {
row = {};
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (C = r.s.c; C <= r.e.c; ++C) {
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
if((isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row;
} }
out.length = outi; out.length = outi;
return out; return out;
@ -19919,16 +19930,20 @@ function sheet_add_json(_ws, js, opts) {
var v = JS[k]; var v = JS[k];
var t = 'z'; var t = 'z';
var z = ""; var z = "";
if(typeof v == 'number') t = 'n'; if(v && typeof v === 'object' && !(v instanceof Date)){
else if(typeof v == 'boolean') t = 'b'; ws[encode_cell({c:_C + C,r:_R + R + offset})] = v;
else if(typeof v == 'string') t = 's'; } else {
else if(v instanceof Date) { if(typeof v == 'number') t = 'n';
t = 'd'; else if(typeof v == 'boolean') t = 'b';
if(!o.cellDates) { t = 'n'; v = datenum(v); } else if(typeof v == 'string') t = 's';
z = o.dateNF || SSF._table[14]; else if(v instanceof Date) {
t = 'd';
if(!o.cellDates) { t = 'n'; v = datenum(v); }
z = o.dateNF || SSF._table[14];
}
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v});
if(z) cell.z = z;
} }
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v});
if(z) cell.z = z;
}); });
}); });
range.e.c = Math.max(range.e.c, _C + hdr.length - 1); range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
@ -20139,7 +20154,62 @@ if(has_buf && typeof require != 'undefined') (function() {
return stream; return stream;
}; };
var write_json_stream = function(sheet, opts) {
var stream = Readable({objectMode:true});
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {};
var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1;
else if(o.header === "A") header = 2;
else if(Array.isArray(o.header)) header = 3;
switch(typeof range) {
case 'string': r = safe_decode_range(range); break;
case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
default: r = range;
}
if(header > 0) offset = 0;
var rr = encode_row(r.s.r);
var cols = [];
var counter = 0;
var dense = Array.isArray(sheet);
var R = r.s.r, C = 0, CC = 0;
if(dense && !sheet[R]) sheet[R] = [];
for(C = r.s.c; C <= r.e.c; ++C) {
cols[C] = encode_col(C);
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
switch(header) {
case 1: hdr[C] = C - r.s.c; break;
case 2: hdr[C] = cols[C]; break;
case 3: hdr[C] = o.header[C - r.s.c]; break;
default:
if(val == null) val = {w: "__EMPTY", t: "s"};
vv = v = format_cell(val, null, o);
counter = 0;
for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
hdr[C] = vv;
}
}
R = r.s.r + offset;
stream._read = function() {
if(R > r.e.r) return stream.push(null);
while(R <= r.e.r) {
++R;
//if ((rowinfo[R-1]||{}).hidden) continue;
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
stream.push(row.row);
break;
}
}
};
return stream;
};
XLSX.stream = { XLSX.stream = {
to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream to_csv: write_csv_stream
}; };

26
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

@ -6,6 +6,7 @@ Stream. They are only exposed in NodeJS.
- `XLSX.stream.to_csv` is the streaming version of `XLSX.utils.sheet_to_csv`. - `XLSX.stream.to_csv` is the streaming version of `XLSX.utils.sheet_to_csv`.
- `XLSX.stream.to_html` is the streaming version of `XLSX.utils.sheet_to_html`. - `XLSX.stream.to_html` is the streaming version of `XLSX.utils.sheet_to_html`.
- `XLSX.stream.to_json` is the streaming version of `XLSX.utils.sheet_to_json`.
<details> <details>
<summary><b>nodejs convert to CSV and write file</b> (click to show)</summary> <summary><b>nodejs convert to CSV and write file</b> (click to show)</summary>
@ -18,5 +19,21 @@ stream.pipe(fs.createWriteStream(output_file_name));
</details> </details>
<details>
<summary><b>nodejs write JSON stream to screen</b> (click to show)</summary>
```js
/* to_json returns an object-mode stream */
var stream = XLSX.stream.to_json(worksheet, {raw:true});
/* the following stream converts JS objects to text via JSON.stringify */
var conv = new Transform({writableObjectMode:true});
conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };
stream.pipe(conv); conv.pipe(process.stdout);
```
</details>
<https://github.com/sheetjs/sheetaki> pipes write streams to nodejs response. <https://github.com/sheetjs/sheetaki> pipes write streams to nodejs response.

@ -600,14 +600,16 @@ module.exports = function(data, options) {
},{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){ },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
(function (Buffer){ (function (Buffer){
'use strict'; 'use strict';
var Buffer_from = /*::(*/function(){}/*:: :any)*/;
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
module.exports = function(data, encoding){ module.exports = function(data, encoding){
return typeof data == 'number' ? Buffer.alloc(data) : Buffer.from(data, encoding); return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding);
}; };
module.exports.test = function(b){ module.exports.test = function(b){
return Buffer.isBuffer(b); return Buffer.isBuffer(b);

@ -720,6 +720,7 @@ Stream. They are only exposed in NodeJS.
- `XLSX.stream.to_csv` is the streaming version of `XLSX.utils.sheet_to_csv`. - `XLSX.stream.to_csv` is the streaming version of `XLSX.utils.sheet_to_csv`.
- `XLSX.stream.to_html` is the streaming version of `XLSX.utils.sheet_to_html`. - `XLSX.stream.to_html` is the streaming version of `XLSX.utils.sheet_to_html`.
- `XLSX.stream.to_json` is the streaming version of `XLSX.utils.sheet_to_json`.
```js ```js
@ -729,6 +730,19 @@ stream.pipe(fs.createWriteStream(output_file_name));
``` ```
```js
/* to_json returns an object-mode stream */
var stream = XLSX.stream.to_json(worksheet, {raw:true});
/* the following stream converts JS objects to text via JSON.stringify */
var conv = new Transform({writableObjectMode:true});
conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };
stream.pipe(conv); conv.pipe(process.stdout);
```
<https://github.com/sheetjs/sheetaki> pipes write streams to nodejs response. <https://github.com/sheetjs/sheetaki> pipes write streams to nodejs response.
## Interface ## Interface

@ -1,6 +1,6 @@
{ {
"name": "xlsx", "name": "xlsx",
"version": "0.13.1", "version": "0.13.2",
"author": "sheetjs", "author": "sheetjs",
"description": "SheetJS Spreadsheet data parser and writer", "description": "SheetJS Spreadsheet data parser and writer",
"keywords": [ "keywords": [
@ -31,8 +31,8 @@
}, },
"dependencies": { "dependencies": {
"adler-32": "~1.2.0", "adler-32": "~1.2.0",
"cfb": "~1.0.7", "cfb": "~1.0.8",
"codepage": "~1.13.0", "codepage": "~1.14.0",
"commander": "~2.15.1", "commander": "~2.15.1",
"crc-32": "~1.2.0", "crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1", "exit-on-epipe": "~1.0.1",

16
test.js

@ -23,6 +23,16 @@ var browser = typeof document !== 'undefined';
// $FlowIgnore // $FlowIgnore
if(!browser) try { require('./shim'); } catch(e) { } if(!browser) try { require('./shim'); } catch(e) { }
var Buffer_from = /*::(*/function(){}/*:: :any)*/;
if(typeof Buffer !== 'undefined') {
var nbfs = !Buffer.from;
if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
}
var opts = ({cellNF: true}/*:any*/); var opts = ({cellNF: true}/*:any*/);
var TYPE = browser ? "binary" : "buffer"; var TYPE = browser ? "binary" : "buffer";
opts.type = TYPE; opts.type = TYPE;
@ -1996,8 +2006,10 @@ describe('sylk', function() {
assert.equal(get_cell(X.read(str, {type:"string"}).Sheets.Sheet1, "A1").v, A1); assert.equal(get_cell(X.read(str, {type:"string"}).Sheets.Sheet1, "A1").v, A1);
assert.equal(get_cell(X.read(str.replace(//, "\x96"), {type:"binary", codepage:1252}).Sheets.Sheet1, "A1").v, A1); assert.equal(get_cell(X.read(str.replace(//, "\x96"), {type:"binary", codepage:1252}).Sheets.Sheet1, "A1").v, A1);
if(typeof Buffer !== 'undefined' && !browser) { if(typeof Buffer !== 'undefined' && !browser) {
assert.equal(get_cell(X.read(Buffer.from(str), {type:"buffer", codepage:65001}).Sheets.Sheet1, "A1").v, A1); // $FlowIgnore
assert.equal(get_cell(X.read(Buffer.from(str.replace(//, "\x96"), "binary"), {type:"buffer", codepage:1252}).Sheets.Sheet1, "A1").v, A1); assert.equal(get_cell(X.read(Buffer_from(str), {type:"buffer", codepage:65001}).Sheets.Sheet1, "A1").v, A1);
// $FlowIgnore
assert.equal(get_cell(X.read(Buffer_from(str.replace(//, "\x96"), "binary"), {type:"buffer", codepage:1252}).Sheets.Sheet1, "A1").v, A1);
} }
} : null); } : null);
}); });

16
tests/core.js generated

@ -23,6 +23,16 @@ var browser = typeof document !== 'undefined';
// $FlowIgnore // $FlowIgnore
if(!browser) try { require('./shim'); } catch(e) { } if(!browser) try { require('./shim'); } catch(e) { }
var Buffer_from = /*::(*/function(){}/*:: :any)*/;
if(typeof Buffer !== 'undefined') {
var nbfs = !Buffer.from;
if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
}
var opts = ({cellNF: true}/*:any*/); var opts = ({cellNF: true}/*:any*/);
var TYPE = browser ? "binary" : "buffer"; var TYPE = browser ? "binary" : "buffer";
opts.type = TYPE; opts.type = TYPE;
@ -1996,8 +2006,10 @@ describe('sylk', function() {
assert.equal(get_cell(X.read(str, {type:"string"}).Sheets.Sheet1, "A1").v, A1); assert.equal(get_cell(X.read(str, {type:"string"}).Sheets.Sheet1, "A1").v, A1);
assert.equal(get_cell(X.read(str.replace(//, "\x96"), {type:"binary", codepage:1252}).Sheets.Sheet1, "A1").v, A1); assert.equal(get_cell(X.read(str.replace(//, "\x96"), {type:"binary", codepage:1252}).Sheets.Sheet1, "A1").v, A1);
if(typeof Buffer !== 'undefined' && !browser) { if(typeof Buffer !== 'undefined' && !browser) {
assert.equal(get_cell(X.read(Buffer.from(str), {type:"buffer", codepage:65001}).Sheets.Sheet1, "A1").v, A1); // $FlowIgnore
assert.equal(get_cell(X.read(Buffer.from(str.replace(//, "\x96"), "binary"), {type:"buffer", codepage:1252}).Sheets.Sheet1, "A1").v, A1); assert.equal(get_cell(X.read(Buffer_from(str), {type:"buffer", codepage:65001}).Sheets.Sheet1, "A1").v, A1);
// $FlowIgnore
assert.equal(get_cell(X.read(Buffer_from(str.replace(//, "\x96"), "binary"), {type:"buffer", codepage:1252}).Sheets.Sheet1, "A1").v, A1);
} }
} : null); } : null);
}); });

2
types/index.d.ts vendored

@ -799,4 +799,6 @@ export interface StreamUtils {
to_csv(sheet: WorkSheet, opts?: Sheet2CSVOpts): any; to_csv(sheet: WorkSheet, opts?: Sheet2CSVOpts): any;
/** HTML output stream, generate one line at a time */ /** HTML output stream, generate one line at a time */
to_html(sheet: WorkSheet, opts?: Sheet2HTMLOpts): any; to_html(sheet: WorkSheet, opts?: Sheet2HTMLOpts): any;
/** JSON object stream, generate one row at a time */
to_json(sheet: WorkSheet, opts?: Sheet2JSONOpts): any;
} }

@ -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.13.1'; XLSX.version = '0.13.2';
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 */
@ -128,9 +128,12 @@ var Base64 = (function make_b64(){
})(); })();
var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node); var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node);
var Buffer_from = /*::(*/function(){}/*:: :any)*/;
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
@ -142,7 +145,8 @@ function new_raw_buf(len/*:number*/) {
} }
var s2a = function s2a(s/*:string*/)/*:any*/ { var s2a = function s2a(s/*:string*/)/*:any*/ {
if(has_buf) return Buffer.from(s, "binary"); // $FlowIgnore
if(has_buf) return Buffer_from(s, "binary");
return s.split("").map(function(x/*:string*/)/*:number*/{ return x.charCodeAt(0) & 0xff; }); return s.split("").map(function(x/*:string*/)/*:number*/{ return x.charCodeAt(0) & 0xff; });
}; };
@ -1197,7 +1201,7 @@ type CFBFiles = {[n:string]:CFBEntry};
/* [MS-CFB] v20171201 */ /* [MS-CFB] v20171201 */
var CFB = (function _CFB(){ var CFB = (function _CFB(){
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/; var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
exports.version = '1.0.7'; exports.version = '1.0.8';
/* [MS-CFB] 2.6.4 */ /* [MS-CFB] 2.6.4 */
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ { function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
var L = l.split("/"), R = r.split("/"); var L = l.split("/"), R = r.split("/");
@ -2351,10 +2355,12 @@ if(has_buf) {
}; };
var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3"; var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb; if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
var utf8readc = function utf8readc(data) { return Buffer.from(data, 'binary').toString('utf8'); }; // $FlowIgnore
var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc; if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
utf8write = function(data) { return Buffer.from(data, 'utf8').toString("binary"); }; // $FlowIgnore
utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
} }
// matches <foo>...</foo> extracts content // matches <foo>...</foo> extracts content
@ -19740,7 +19746,8 @@ function write_string_type(out/*:string*/, opts/*:WriteOpts*/, bom/*:?string*/)/
case "string": return out; case "string": return out;
case "file": return write_dl(opts.file, o, 'utf8'); case "file": return write_dl(opts.file, o, 'utf8');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(o, 'utf8'); // $FlowIgnore
if(has_buf) return Buffer_from(o, 'utf8');
else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); }); else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -19754,7 +19761,8 @@ function write_stxt_type(out/*:string*/, opts/*:WriteOpts*/)/*:any*/ {
case "string": return out; /* override in sheet_to_txt */ case "string": return out; /* override in sheet_to_txt */
case "file": return write_dl(opts.file, out, 'binary'); case "file": return write_dl(opts.file, out, 'binary');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(out, 'binary'); // $FlowIgnore
if(has_buf) return Buffer_from(out, 'binary');
else return out.split("").map(function(c) { return c.charCodeAt(0); }); else return out.split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -19841,13 +19849,55 @@ function writeFileAsync(filename/*:string*/, wb/*:Workbook*/, opts/*:?WriteFileO
var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts/*:any*/); var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts/*:any*/);
return _fs.writeFile(filename, writeSync(wb, o), _cb); return _fs.writeFile(filename, writeSync(wb, o), _cb);
} }
/*::
type MJRObject = {
row: any;
isempty: boolean;
};
*/
function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array<string>*/, header/*:number*/, hdr/*:Array<any>*/, dense/*:boolean*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ {
var rr = encode_row(R);
var defval = o.defval, raw = o.raw;
var isempty = true;
var row/*:any*/ = (header === 1) ? [] : {};
if(header !== 1) {
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
var v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
return { row: row, isempty: isempty };
}
function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) { function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
if(sheet == null || sheet["!ref"] == null) return []; if(sheet == null || sheet["!ref"] == null) return [];
var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array<any>*/ = [], isempty = true, v=0, vv=""; var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array<any>*/ = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}}; var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {}; var o = opts || {};
var raw = o.raw;
var defval = o.defval;
var range = o.range != null ? o.range : sheet["!ref"]; var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1; if(o.header === 1) header = 1;
else if(o.header === "A") header = 2; else if(o.header === "A") header = 2;
@ -19880,42 +19930,9 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
hdr[C] = vv; hdr[C] = vv;
} }
} }
var row/*:any*/ = (header === 1) ? [] : {};
for (R = r.s.r + offset; R <= r.e.r; ++R) { for (R = r.s.r + offset; R <= r.e.r; ++R) {
rr = encode_row(R); var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
isempty = true; if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
if(header === 1) row = [];
else {
row = {};
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (C = r.s.c; C <= r.e.c; ++C) {
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
if((isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row;
} }
out.length = outi; out.length = outi;
return out; return out;
@ -20039,16 +20056,20 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet
var v = JS[k]; var v = JS[k];
var t = 'z'; var t = 'z';
var z = ""; var z = "";
if(typeof v == 'number') t = 'n'; if(v && typeof v === 'object' && !(v instanceof Date)){
else if(typeof v == 'boolean') t = 'b'; ws[encode_cell({c:_C + C,r:_R + R + offset})] = v;
else if(typeof v == 'string') t = 's'; } else {
else if(v instanceof Date) { if(typeof v == 'number') t = 'n';
t = 'd'; else if(typeof v == 'boolean') t = 'b';
if(!o.cellDates) { t = 'n'; v = datenum(v); } else if(typeof v == 'string') t = 's';
z = o.dateNF || SSF._table[14]; else if(v instanceof Date) {
t = 'd';
if(!o.cellDates) { t = 'n'; v = datenum(v); }
z = o.dateNF || SSF._table[14];
}
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v}/*:any*/);
if(z) cell.z = z;
} }
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v}/*:any*/);
if(z) cell.z = z;
}); });
}); });
range.e.c = Math.max(range.e.c, _C + hdr.length - 1); range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
@ -20259,7 +20280,62 @@ if(has_buf && typeof require != 'undefined') (function() {
return stream; return stream;
}; };
var write_json_stream = function(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
var stream = Readable({objectMode:true});
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array<any>*/ = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {};
var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1;
else if(o.header === "A") header = 2;
else if(Array.isArray(o.header)) header = 3;
switch(typeof range) {
case 'string': r = safe_decode_range(range); break;
case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
default: r = range;
}
if(header > 0) offset = 0;
var rr = encode_row(r.s.r);
var cols/*:Array<string>*/ = [];
var counter = 0;
var dense = Array.isArray(sheet);
var R = r.s.r, C = 0, CC = 0;
if(dense && !sheet[R]) sheet[R] = [];
for(C = r.s.c; C <= r.e.c; ++C) {
cols[C] = encode_col(C);
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
switch(header) {
case 1: hdr[C] = C - r.s.c; break;
case 2: hdr[C] = cols[C]; break;
case 3: hdr[C] = o.header[C - r.s.c]; break;
default:
if(val == null) val = {w: "__EMPTY", t: "s"};
vv = v = format_cell(val, null, o);
counter = 0;
for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
hdr[C] = vv;
}
}
R = r.s.r + offset;
stream._read = function() {
if(R > r.e.r) return stream.push(null);
while(R <= r.e.r) {
++R;
//if ((rowinfo[R-1]||{}).hidden) continue;
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
stream.push(row.row);
break;
}
}
};
return stream;
};
XLSX.stream = { XLSX.stream = {
to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream to_csv: write_csv_stream
}; };

182
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.13.1'; XLSX.version = '0.13.2';
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') {
@ -127,9 +127,12 @@ var Base64 = (function make_b64(){
})(); })();
var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node); var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && process.versions.node);
var Buffer_from = function(){};
if(typeof Buffer !== 'undefined') { if(typeof Buffer !== 'undefined') {
// $FlowIgnore var nbfs = !Buffer.from;
if(!Buffer.from) Buffer.from = function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); }; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
// $FlowIgnore // $FlowIgnore
if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); }; if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
} }
@ -141,7 +144,8 @@ function new_raw_buf(len) {
} }
var s2a = function s2a(s) { var s2a = function s2a(s) {
if(has_buf) return Buffer.from(s, "binary"); // $FlowIgnore
if(has_buf) return Buffer_from(s, "binary");
return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; }); return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; });
}; };
@ -1133,7 +1137,7 @@ var DO_NOT_EXPORT_CFB = true;
/* [MS-CFB] v20171201 */ /* [MS-CFB] v20171201 */
var CFB = (function _CFB(){ var CFB = (function _CFB(){
var exports = {}; var exports = {};
exports.version = '1.0.7'; exports.version = '1.0.8';
/* [MS-CFB] 2.6.4 */ /* [MS-CFB] 2.6.4 */
function namecmp(l, r) { function namecmp(l, r) {
var L = l.split("/"), R = r.split("/"); var L = l.split("/"), R = r.split("/");
@ -2273,10 +2277,12 @@ if(has_buf) {
}; };
var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3"; var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb; if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
var utf8readc = function utf8readc(data) { return Buffer.from(data, 'binary').toString('utf8'); }; // $FlowIgnore
var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc; if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
utf8write = function(data) { return Buffer.from(data, 'utf8').toString("binary"); }; // $FlowIgnore
utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
} }
// matches <foo>...</foo> extracts content // matches <foo>...</foo> extracts content
@ -19620,7 +19626,8 @@ function write_string_type(out, opts, bom) {
case "string": return out; case "string": return out;
case "file": return write_dl(opts.file, o, 'utf8'); case "file": return write_dl(opts.file, o, 'utf8');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(o, 'utf8'); // $FlowIgnore
if(has_buf) return Buffer_from(o, 'utf8');
else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); }); else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -19634,7 +19641,8 @@ function write_stxt_type(out, opts) {
case "string": return out; /* override in sheet_to_txt */ case "string": return out; /* override in sheet_to_txt */
case "file": return write_dl(opts.file, out, 'binary'); case "file": return write_dl(opts.file, out, 'binary');
case "buffer": { case "buffer": {
if(has_buf) return Buffer.from(out, 'binary'); // $FlowIgnore
if(has_buf) return Buffer_from(out, 'binary');
else return out.split("").map(function(c) { return c.charCodeAt(0); }); else return out.split("").map(function(c) { return c.charCodeAt(0); });
} }
} }
@ -19721,13 +19729,49 @@ function writeFileAsync(filename, wb, opts, cb) {
var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts); var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts);
return _fs.writeFile(filename, writeSync(wb, o), _cb); return _fs.writeFile(filename, writeSync(wb, o), _cb);
} }
function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
var rr = encode_row(R);
var defval = o.defval, raw = o.raw;
var isempty = true;
var row = (header === 1) ? [] : {};
if(header !== 1) {
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
var v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
return { row: row, isempty: isempty };
}
function sheet_to_json(sheet, opts) { function sheet_to_json(sheet, opts) {
if(sheet == null || sheet["!ref"] == null) return []; if(sheet == null || sheet["!ref"] == null) return [];
var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], isempty = true, v=0, vv=""; var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}}; var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {}; var o = opts || {};
var raw = o.raw;
var defval = o.defval;
var range = o.range != null ? o.range : sheet["!ref"]; var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1; if(o.header === 1) header = 1;
else if(o.header === "A") header = 2; else if(o.header === "A") header = 2;
@ -19760,42 +19804,9 @@ function sheet_to_json(sheet, opts) {
hdr[C] = vv; hdr[C] = vv;
} }
} }
var row = (header === 1) ? [] : {};
for (R = r.s.r + offset; R <= r.e.r; ++R) { for (R = r.s.r + offset; R <= r.e.r; ++R) {
rr = encode_row(R); var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
isempty = true; if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
if(header === 1) row = [];
else {
row = {};
if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
else row.__rowNum__ = R;
}
if(!dense || sheet[R]) for (C = r.s.c; C <= r.e.c; ++C) {
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
if(val === undefined || val.t === undefined) {
if(defval === undefined) continue;
if(hdr[C] != null) { row[hdr[C]] = defval; }
continue;
}
v = val.v;
switch(val.t){
case 'z': if(v == null) break; continue;
case 'e': v = void 0; break;
case 's': case 'd': case 'b': case 'n': break;
default: throw new Error('unrecognized type ' + val.t);
}
if(hdr[C] != null) {
if(v == null) {
if(defval !== undefined) row[hdr[C]] = defval;
else if(raw && v === null) row[hdr[C]] = null;
else continue;
} else {
row[hdr[C]] = raw ? v : format_cell(val,v,o);
}
if(v != null) isempty = false;
}
}
if((isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row;
} }
out.length = outi; out.length = outi;
return out; return out;
@ -19919,16 +19930,20 @@ function sheet_add_json(_ws, js, opts) {
var v = JS[k]; var v = JS[k];
var t = 'z'; var t = 'z';
var z = ""; var z = "";
if(typeof v == 'number') t = 'n'; if(v && typeof v === 'object' && !(v instanceof Date)){
else if(typeof v == 'boolean') t = 'b'; ws[encode_cell({c:_C + C,r:_R + R + offset})] = v;
else if(typeof v == 'string') t = 's'; } else {
else if(v instanceof Date) { if(typeof v == 'number') t = 'n';
t = 'd'; else if(typeof v == 'boolean') t = 'b';
if(!o.cellDates) { t = 'n'; v = datenum(v); } else if(typeof v == 'string') t = 's';
z = o.dateNF || SSF._table[14]; else if(v instanceof Date) {
t = 'd';
if(!o.cellDates) { t = 'n'; v = datenum(v); }
z = o.dateNF || SSF._table[14];
}
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v});
if(z) cell.z = z;
} }
ws[encode_cell({c:_C + C,r:_R + R + offset})] = cell = ({t:t, v:v});
if(z) cell.z = z;
}); });
}); });
range.e.c = Math.max(range.e.c, _C + hdr.length - 1); range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
@ -20139,7 +20154,62 @@ if(has_buf && typeof require != 'undefined') (function() {
return stream; return stream;
}; };
var write_json_stream = function(sheet, opts) {
var stream = Readable({objectMode:true});
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
var r = {s:{r:0,c:0},e:{r:0,c:0}};
var o = opts || {};
var range = o.range != null ? o.range : sheet["!ref"];
if(o.header === 1) header = 1;
else if(o.header === "A") header = 2;
else if(Array.isArray(o.header)) header = 3;
switch(typeof range) {
case 'string': r = safe_decode_range(range); break;
case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
default: r = range;
}
if(header > 0) offset = 0;
var rr = encode_row(r.s.r);
var cols = [];
var counter = 0;
var dense = Array.isArray(sheet);
var R = r.s.r, C = 0, CC = 0;
if(dense && !sheet[R]) sheet[R] = [];
for(C = r.s.c; C <= r.e.c; ++C) {
cols[C] = encode_col(C);
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
switch(header) {
case 1: hdr[C] = C - r.s.c; break;
case 2: hdr[C] = cols[C]; break;
case 3: hdr[C] = o.header[C - r.s.c]; break;
default:
if(val == null) val = {w: "__EMPTY", t: "s"};
vv = v = format_cell(val, null, o);
counter = 0;
for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
hdr[C] = vv;
}
}
R = r.s.r + offset;
stream._read = function() {
if(R > r.e.r) return stream.push(null);
while(R <= r.e.r) {
++R;
//if ((rowinfo[R-1]||{}).hidden) continue;
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
stream.push(row.row);
break;
}
}
};
return stream;
};
XLSX.stream = { XLSX.stream = {
to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream to_csv: write_csv_stream
}; };