make stream utils available to Node ESM
- sheet_to_csv blankrows/strip (fixes #2274 h/t @dmongit) - sheet_to_json fix dedupe (see #2460 h/t @giuliohome) - mini build browser tests
This commit is contained in:
parent
a32b30414b
commit
c6a86cfe98
@ -238,6 +238,17 @@ function write_vt(s, xlsx/*:?boolean*/)/*:string*/ {
|
||||
throw new Error("Unable to serialize " + s);
|
||||
}
|
||||
|
||||
function xlml_normalize(d)/*:string*/ {
|
||||
if(has_buf &&/*::typeof Buffer !== "undefined" && d != null && d instanceof Buffer &&*/ Buffer.isBuffer(d)) return d.toString('utf8');
|
||||
if(typeof d === 'string') return d;
|
||||
/* duktape */
|
||||
if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
|
||||
throw new Error("Bad input format: expected Buffer or string");
|
||||
}
|
||||
/* UOS uses CJK in tags */
|
||||
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
|
||||
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
|
||||
|
||||
var XMLNS = ({
|
||||
'dc': 'http://purl.org/dc/elements/1.1/',
|
||||
'dcterms': 'http://purl.org/dc/terms/',
|
||||
|
@ -162,18 +162,7 @@ function xlml_clean_comment(comment/*:any*/) {
|
||||
comment.v = comment.w = comment.ixfe = undefined;
|
||||
}
|
||||
|
||||
function xlml_normalize(d)/*:string*/ {
|
||||
if(has_buf &&/*::typeof Buffer !== "undefined" && d != null && d instanceof Buffer &&*/ Buffer.isBuffer(d)) return d.toString('utf8');
|
||||
if(typeof d === 'string') return d;
|
||||
/* duktape */
|
||||
if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
|
||||
throw new Error("Bad input format: expected Buffer or string");
|
||||
}
|
||||
|
||||
/* TODO: Everything */
|
||||
/* UOS uses CJK in tags */
|
||||
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
|
||||
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
|
||||
function parse_xlml_xml(d, _opts)/*:Workbook*/ {
|
||||
var opts = _opts || {};
|
||||
make_ssf(SSF);
|
||||
|
@ -59,7 +59,7 @@ var HTML_ = (function() {
|
||||
return ws;
|
||||
}
|
||||
function html_to_book(str/*:string*/, opts)/*:Workbook*/ {
|
||||
var mtch = str.match(/<table.*?>[\s\S]*?<\/table>/gi);
|
||||
var mtch = str.match(/<table[\s\S]*?>[\s\S]*?<\/table>/gi);
|
||||
if(!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find <table>");
|
||||
if(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
|
||||
var wb = utils.book_new();
|
||||
|
@ -77,7 +77,7 @@ function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {
|
||||
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);
|
||||
for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) { vv = v + "_" + (++counter); CC = -1; }
|
||||
hdr[C] = vv;
|
||||
}
|
||||
}
|
||||
@ -132,7 +132,7 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ {
|
||||
row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
|
||||
if(row == null) { continue; }
|
||||
if(o.strip) row = row.replace(endregex,"");
|
||||
out.push((w++ ? RS : "") + row);
|
||||
if(row || (o.blankrows !== false)) out.push((w++ ? RS : "") + row);
|
||||
}
|
||||
delete o.dense;
|
||||
return out.join("");
|
||||
|
228
bits/97_node.js
228
bits/97_node.js
@ -1,124 +1,120 @@
|
||||
if(has_buf && typeof require != 'undefined') (function() {
|
||||
var strmod = require('stream');
|
||||
if(!strmod) return;
|
||||
var Readable = strmod.Readable;
|
||||
if(!Readable) return;
|
||||
var _Readable;
|
||||
function set_readable(R) { _Readable = R; }
|
||||
|
||||
var write_csv_stream = function(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
|
||||
var stream = Readable();
|
||||
var o = opts == null ? {} : opts;
|
||||
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
|
||||
var r = safe_decode_range(sheet["!ref"]);
|
||||
var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
|
||||
var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
|
||||
var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
|
||||
var row/*:?string*/ = "", cols/*:Array<string>*/ = [];
|
||||
o.dense = Array.isArray(sheet);
|
||||
var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo/*:Array<RowInfo>*/ = o.skipHidden && sheet["!rows"] || [];
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
|
||||
var R = r.s.r;
|
||||
var BOM = false, w = 0;
|
||||
stream._read = function() {
|
||||
if(!BOM) { BOM = true; return stream.push("\uFEFF"); }
|
||||
while(R <= r.e.r) {
|
||||
++R;
|
||||
if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
|
||||
if(row != null) {
|
||||
if(o.strip) row = row.replace(endregex,"");
|
||||
return stream.push((w++ ? RS : "") + row);
|
||||
}
|
||||
}
|
||||
return stream.push(null);
|
||||
};
|
||||
return stream;
|
||||
};
|
||||
|
||||
var write_html_stream = function(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/) {
|
||||
var stream = Readable();
|
||||
|
||||
var o = opts || {};
|
||||
var header = o.header != null ? o.header : HTML_.BEGIN;
|
||||
var footer = o.footer != null ? o.footer : HTML_.END;
|
||||
stream.push(header);
|
||||
var r = decode_range(ws['!ref']);
|
||||
o.dense = Array.isArray(ws);
|
||||
stream.push(HTML_._preamble(ws, r, o));
|
||||
var R = r.s.r;
|
||||
var end = false;
|
||||
stream._read = function() {
|
||||
if(R > r.e.r) {
|
||||
if(!end) { end = true; stream.push("</table>" + footer); }
|
||||
return stream.push(null);
|
||||
}
|
||||
while(R <= r.e.r) {
|
||||
stream.push(HTML_._row(ws, r, R, o));
|
||||
++R;
|
||||
break;
|
||||
}
|
||||
};
|
||||
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;
|
||||
function write_csv_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {
|
||||
var stream = _Readable();
|
||||
var o = opts == null ? {} : opts;
|
||||
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
|
||||
var r = safe_decode_range(sheet["!ref"]);
|
||||
var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
|
||||
var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
|
||||
var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
|
||||
var row/*:?string*/ = "", cols/*:Array<string>*/ = [];
|
||||
o.dense = Array.isArray(sheet);
|
||||
var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo/*:Array<RowInfo>*/ = o.skipHidden && sheet["!rows"] || [];
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
|
||||
var R = r.s.r;
|
||||
var BOM = false, w = 0;
|
||||
stream._read = function() {
|
||||
if(!BOM) { BOM = true; return stream.push("\uFEFF"); }
|
||||
while(R <= r.e.r) {
|
||||
++R;
|
||||
if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
|
||||
if(row != null) {
|
||||
if(o.strip) row = row.replace(endregex,"");
|
||||
if(row || (o.blankrows !== false)) return stream.push((w++ ? RS : "") + row);
|
||||
}
|
||||
}
|
||||
R = r.s.r + offset;
|
||||
stream._read = function() {
|
||||
while(R <= r.e.r) {
|
||||
//if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
|
||||
++R;
|
||||
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
|
||||
stream.push(row.row);
|
||||
return;
|
||||
}
|
||||
}
|
||||
return stream.push(null);
|
||||
};
|
||||
return stream;
|
||||
}
|
||||
|
||||
function write_html_stream(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/) {
|
||||
var stream = _Readable();
|
||||
|
||||
var o = opts || {};
|
||||
var header = o.header != null ? o.header : HTML_.BEGIN;
|
||||
var footer = o.footer != null ? o.footer : HTML_.END;
|
||||
stream.push(header);
|
||||
var r = decode_range(ws['!ref']);
|
||||
o.dense = Array.isArray(ws);
|
||||
stream.push(HTML_._preamble(ws, r, o));
|
||||
var R = r.s.r;
|
||||
var end = false;
|
||||
stream._read = function() {
|
||||
if(R > r.e.r) {
|
||||
if(!end) { end = true; stream.push("</table>" + footer); }
|
||||
return stream.push(null);
|
||||
};
|
||||
return stream;
|
||||
}
|
||||
while(R <= r.e.r) {
|
||||
stream.push(HTML_._row(ws, r, R, o));
|
||||
++R;
|
||||
break;
|
||||
}
|
||||
};
|
||||
return stream;
|
||||
}
|
||||
|
||||
XLSX.stream = {
|
||||
to_json: write_json_stream,
|
||||
to_html: write_html_stream,
|
||||
to_csv: write_csv_stream
|
||||
function write_json_stream(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() {
|
||||
while(R <= r.e.r) {
|
||||
//if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
|
||||
++R;
|
||||
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
|
||||
stream.push(row.row);
|
||||
return;
|
||||
}
|
||||
}
|
||||
return stream.push(null);
|
||||
};
|
||||
})();
|
||||
return stream;
|
||||
};
|
||||
|
||||
var __stream = {
|
||||
to_json: write_json_stream,
|
||||
to_html: write_html_stream,
|
||||
to_csv: write_csv_stream,
|
||||
set_readable: set_readable
|
||||
};
|
||||
|
@ -11,4 +11,9 @@ XLSX.utils = utils;
|
||||
XLSX.writeXLSX = writeSyncXLSX;
|
||||
XLSX.writeFileXLSX = writeFileSyncXLSX;
|
||||
XLSX.SSF = SSF;
|
||||
if(typeof __stream !== "undefined") XLSX.stream = __stream;
|
||||
if(typeof CFB !== "undefined") XLSX.CFB = CFB;
|
||||
if(typeof require !== "undefined") {
|
||||
var strmod = require('stream');
|
||||
if((strmod||{}).Readable) set_readable(strmod.Readable);
|
||||
}
|
||||
|
30
dist/xlsx.core.min.js
generated
vendored
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
2
dist/xlsx.core.min.map
generated
vendored
File diff suppressed because one or more lines are too long
267
dist/xlsx.extendscript.js
generated
vendored
267
dist/xlsx.extendscript.js
generated
vendored
@ -3830,6 +3830,17 @@ function write_vt(s, xlsx) {
|
||||
throw new Error("Unable to serialize " + s);
|
||||
}
|
||||
|
||||
function xlml_normalize(d) {
|
||||
if(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');
|
||||
if(typeof d === 'string') return d;
|
||||
/* duktape */
|
||||
if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
|
||||
throw new Error("Bad input format: expected Buffer or string");
|
||||
}
|
||||
/* UOS uses CJK in tags */
|
||||
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
|
||||
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
|
||||
|
||||
var XMLNS = ({
|
||||
'dc': 'http://purl.org/dc/elements/1.1/',
|
||||
'dcterms': 'http://purl.org/dc/terms/',
|
||||
@ -17196,18 +17207,7 @@ function xlml_clean_comment(comment) {
|
||||
comment.v = comment.w = comment.ixfe = undefined;
|
||||
}
|
||||
|
||||
function xlml_normalize(d) {
|
||||
if(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');
|
||||
if(typeof d === 'string') return d;
|
||||
/* duktape */
|
||||
if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
|
||||
throw new Error("Bad input format: expected Buffer or string");
|
||||
}
|
||||
|
||||
/* TODO: Everything */
|
||||
/* UOS uses CJK in tags */
|
||||
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
|
||||
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
|
||||
function parse_xlml_xml(d, _opts) {
|
||||
var opts = _opts || {};
|
||||
make_ssf(SSF);
|
||||
@ -21033,7 +21033,7 @@ var HTML_ = (function() {
|
||||
return ws;
|
||||
}
|
||||
function html_to_book(str, opts) {
|
||||
var mtch = str.match(/<table.*?>[\s\S]*?<\/table>/gi);
|
||||
var mtch = str.match(/<table[\s\S]*?>[\s\S]*?<\/table>/gi);
|
||||
if(!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find <table>");
|
||||
if(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
|
||||
var wb = utils.book_new();
|
||||
@ -23739,7 +23739,7 @@ function sheet_to_json(sheet, opts) {
|
||||
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);
|
||||
for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) { vv = v + "_" + (++counter); CC = -1; }
|
||||
hdr[C] = vv;
|
||||
}
|
||||
}
|
||||
@ -23788,12 +23788,13 @@ function sheet_to_csv(sheet, opts) {
|
||||
var colinfo = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo = o.skipHidden && sheet["!rows"] || [];
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
|
||||
var w = 0;
|
||||
for(var R = r.s.r; R <= r.e.r; ++R) {
|
||||
if ((rowinfo[R]||{}).hidden) continue;
|
||||
row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
|
||||
if(row == null) { continue; }
|
||||
if(o.strip) row = row.replace(endregex,"");
|
||||
out.push(row + RS);
|
||||
if(row || (o.blankrows !== false)) out.push((w++ ? RS : "") + row);
|
||||
}
|
||||
delete o.dense;
|
||||
return out.join("");
|
||||
@ -24048,131 +24049,126 @@ utils.sheet_set_array_formula = function(ws, range, formula, dynamic) {
|
||||
return utils;
|
||||
})(utils);
|
||||
|
||||
if(has_buf && typeof require != 'undefined') (function() {
|
||||
var strmod = undefined;
|
||||
if(!strmod) return;
|
||||
var Readable = strmod.Readable;
|
||||
if(!Readable) return;
|
||||
var _Readable;
|
||||
function set_readable(R) { _Readable = R; }
|
||||
|
||||
var write_csv_stream = function(sheet, opts) {
|
||||
var stream = Readable();
|
||||
var o = opts == null ? {} : opts;
|
||||
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
|
||||
var r = safe_decode_range(sheet["!ref"]);
|
||||
var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
|
||||
var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
|
||||
var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
|
||||
var row = "", cols = [];
|
||||
o.dense = Array.isArray(sheet);
|
||||
var colinfo = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo = o.skipHidden && sheet["!rows"] || [];
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
|
||||
var R = r.s.r;
|
||||
var BOM = false;
|
||||
stream._read = function() {
|
||||
if(!BOM) { BOM = true; return stream.push("\uFEFF"); }
|
||||
while(R <= r.e.r) {
|
||||
++R;
|
||||
if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
|
||||
if(row != null) {
|
||||
if(o.strip) row = row.replace(endregex,"");
|
||||
stream.push(row + RS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(R > r.e.r) return stream.push(null);
|
||||
};
|
||||
return stream;
|
||||
};
|
||||
|
||||
var write_html_stream = function(ws, opts) {
|
||||
var stream = Readable();
|
||||
|
||||
var o = opts || {};
|
||||
var header = o.header != null ? o.header : HTML_.BEGIN;
|
||||
var footer = o.footer != null ? o.footer : HTML_.END;
|
||||
stream.push(header);
|
||||
var r = decode_range(ws['!ref']);
|
||||
o.dense = Array.isArray(ws);
|
||||
stream.push(HTML_._preamble(ws, r, o));
|
||||
var R = r.s.r;
|
||||
var end = false;
|
||||
stream._read = function() {
|
||||
if(R > r.e.r) {
|
||||
if(!end) { end = true; stream.push("</table>" + footer); }
|
||||
return stream.push(null);
|
||||
}
|
||||
while(R <= r.e.r) {
|
||||
stream.push(HTML_._row(ws, r, R, o));
|
||||
++R;
|
||||
break;
|
||||
}
|
||||
};
|
||||
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;
|
||||
function write_csv_stream(sheet, opts) {
|
||||
var stream = _Readable();
|
||||
var o = opts == null ? {} : opts;
|
||||
if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
|
||||
var r = safe_decode_range(sheet["!ref"]);
|
||||
var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
|
||||
var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
|
||||
var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
|
||||
var row = "", cols = [];
|
||||
o.dense = Array.isArray(sheet);
|
||||
var colinfo = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo = o.skipHidden && sheet["!rows"] || [];
|
||||
for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
|
||||
var R = r.s.r;
|
||||
var BOM = false, w = 0;
|
||||
stream._read = function() {
|
||||
if(!BOM) { BOM = true; return stream.push("\uFEFF"); }
|
||||
while(R <= r.e.r) {
|
||||
++R;
|
||||
if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
|
||||
if(row != null) {
|
||||
if(o.strip) row = row.replace(endregex,"");
|
||||
if(row || (o.blankrows !== false)) return stream.push((w++ ? RS : "") + row);
|
||||
}
|
||||
}
|
||||
R = r.s.r + offset;
|
||||
stream._read = function() {
|
||||
if(R > r.e.r) return stream.push(null);
|
||||
while(R <= r.e.r) {
|
||||
//if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
|
||||
++R;
|
||||
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
|
||||
stream.push(row.row);
|
||||
break;
|
||||
}
|
||||
return stream.push(null);
|
||||
};
|
||||
return stream;
|
||||
}
|
||||
|
||||
function write_html_stream(ws, opts) {
|
||||
var stream = _Readable();
|
||||
|
||||
var o = opts || {};
|
||||
var header = o.header != null ? o.header : HTML_.BEGIN;
|
||||
var footer = o.footer != null ? o.footer : HTML_.END;
|
||||
stream.push(header);
|
||||
var r = decode_range(ws['!ref']);
|
||||
o.dense = Array.isArray(ws);
|
||||
stream.push(HTML_._preamble(ws, r, o));
|
||||
var R = r.s.r;
|
||||
var end = false;
|
||||
stream._read = function() {
|
||||
if(R > r.e.r) {
|
||||
if(!end) { end = true; stream.push("</table>" + footer); }
|
||||
return stream.push(null);
|
||||
}
|
||||
while(R <= r.e.r) {
|
||||
stream.push(HTML_._row(ws, r, R, o));
|
||||
++R;
|
||||
break;
|
||||
}
|
||||
};
|
||||
return stream;
|
||||
}
|
||||
|
||||
function write_json_stream(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() {
|
||||
while(R <= r.e.r) {
|
||||
//if ((rowinfo[R-1]||{}).hidden) continue;
|
||||
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
|
||||
++R;
|
||||
if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
|
||||
stream.push(row.row);
|
||||
return;
|
||||
}
|
||||
};
|
||||
return stream;
|
||||
}
|
||||
return stream.push(null);
|
||||
};
|
||||
return stream;
|
||||
};
|
||||
|
||||
XLSX.stream = {
|
||||
to_json: write_json_stream,
|
||||
to_html: write_html_stream,
|
||||
to_csv: write_csv_stream
|
||||
};
|
||||
})();
|
||||
|
||||
var __stream = {
|
||||
to_json: write_json_stream,
|
||||
to_html: write_html_stream,
|
||||
to_csv: write_csv_stream,
|
||||
set_readable: set_readable
|
||||
};
|
||||
if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;
|
||||
XLSX.parse_zip = parse_zip;
|
||||
XLSX.read = readSync; //xlsread
|
||||
@ -24186,7 +24182,12 @@ XLSX.utils = utils;
|
||||
XLSX.writeXLSX = writeSyncXLSX;
|
||||
XLSX.writeFileXLSX = writeFileSyncXLSX;
|
||||
XLSX.SSF = SSF;
|
||||
if(typeof __stream !== "undefined") XLSX.stream = __stream;
|
||||
if(typeof CFB !== "undefined") XLSX.CFB = CFB;
|
||||
if(typeof require !== "undefined") {
|
||||
var strmod = undefined;
|
||||
if((strmod||{}).Readable) set_readable(strmod.Readable);
|
||||
}
|
||||
}
|
||||
/*global define */
|
||||
if(typeof exports !== 'undefined') make_xlsx_lib(exports);
|
||||
|
30
dist/xlsx.full.min.js
generated
vendored
30
dist/xlsx.full.min.js
generated
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.full.min.map
generated
vendored
2
dist/xlsx.full.min.map
generated
vendored
File diff suppressed because one or more lines are too long
16
dist/xlsx.mini.min.js
generated
vendored
16
dist/xlsx.mini.min.js
generated
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.mini.min.map
generated
vendored
2
dist/xlsx.mini.min.map
generated
vendored
File diff suppressed because one or more lines are too long
@ -114,6 +114,10 @@ import * as XLSX from 'xlsx/xlsx.mjs';
|
||||
import * as fs from 'fs';
|
||||
XLSX.set_fs(fs);
|
||||
|
||||
/* load 'stream' for stream support */
|
||||
import { Readable } from 'stream';
|
||||
XLSX.stream.set_readable(Readable);
|
||||
|
||||
/* load the codepage support library for extended support with older formats */
|
||||
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
|
||||
XLSX.set_cptable(cpexcel);
|
||||
|
@ -224,8 +224,8 @@ The [included demos](demos/) cover mobile apps and other special deployments.
|
||||
### Streaming Write
|
||||
|
||||
The streaming write functions are available in the `XLSX.stream` object. They
|
||||
take the same arguments as the normal write functions but return a Readable
|
||||
Stream. They are only exposed in NodeJS.
|
||||
take the same arguments as the normal write functions but return a NodeJS
|
||||
Readable Stream.
|
||||
|
||||
- `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`.
|
||||
|
@ -438,8 +438,11 @@ takes an options argument:
|
||||
| array of strings | Use specified strings as keys in row objects |
|
||||
| (default) | Read and disambiguate first row as keys |
|
||||
|
||||
If header is not `1`, the row object will contain the non-enumerable property
|
||||
`__rowNum__` that represents the row of the sheet corresponding to the entry.
|
||||
- If header is not `1`, the row object will contain the non-enumerable property
|
||||
`__rowNum__` that represents the row of the sheet corresponding to the entry.
|
||||
- If header is an array, the keys will not be disambiguated. This can lead to
|
||||
unexpected results if the array values are not unique!
|
||||
|
||||
|
||||
<details>
|
||||
<summary><b>Examples</b> (click to show)</summary>
|
||||
|
@ -12,6 +12,7 @@ export {
|
||||
writeSyncXLSX as writeXLSX,
|
||||
writeFileSyncXLSX as writeFileXLSX,
|
||||
utils,
|
||||
__stream as stream,
|
||||
SSF,
|
||||
CFB
|
||||
};
|
||||
|
@ -77,4 +77,5 @@ bits/87_read.js
|
||||
bits/88_write.js
|
||||
bits/90_utils.js
|
||||
bits/95_api.js
|
||||
bits/97_node.js
|
||||
misc/98_esmxport.js
|
||||
|
15
test.js
15
test.js
@ -1837,6 +1837,14 @@ describe('json output', function() {
|
||||
assert.equal(json[i].S_1, 7 + i);
|
||||
}
|
||||
});
|
||||
it('should handle collisions in disambiguation', function() {
|
||||
var _data = [["a_1","a","a"],[1,2,3]];
|
||||
var _ws = X.utils.aoa_to_sheet(_data);
|
||||
var json = X.utils.sheet_to_json(_ws);
|
||||
assert.equal(json[0].a, 2);
|
||||
assert.equal(json[0].a_1, 1);
|
||||
assert.equal(json[0].a_2, 3);
|
||||
});
|
||||
it('should handle raw data if requested', function() {
|
||||
var _ws = X.utils.aoa_to_sheet(data, {cellDates:true});
|
||||
var json = X.utils.sheet_to_json(_ws, {header:1, raw:true});
|
||||
@ -2087,6 +2095,13 @@ describe('CSV', function() {
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,");
|
||||
delete ws["!cols"];
|
||||
});
|
||||
it('should properly handle blankrows and strip options', function() {
|
||||
var _ws = X.utils.aoa_to_sheet([[""],[],["", ""]]);
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {}), ",\n,\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {strip: true}), "\n\n");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false}), ",\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false, strip: true}), "");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
41
test.mjs
generated
41
test.mjs
generated
@ -1442,8 +1442,8 @@ describe('write features', function() {
|
||||
var wb = X.utils.book_new();
|
||||
X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[1,2],[3,4]]), "Sheet1");
|
||||
X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[5,6],[7,8]]), "Sheet2");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4\n");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8\n");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8");
|
||||
assert.throws(function() { X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet3"}); });
|
||||
});
|
||||
});
|
||||
@ -1823,6 +1823,14 @@ describe('json output', function() {
|
||||
assert.equal(json[i].S_1, 7 + i);
|
||||
}
|
||||
});
|
||||
it('should handle collisions in disambiguation', function() {
|
||||
var _data = [["a_1","a","a"],[1,2,3]];
|
||||
var _ws = X.utils.aoa_to_sheet(_data);
|
||||
var json = X.utils.sheet_to_json(_ws);
|
||||
assert.equal(json[0].a, 2);
|
||||
assert.equal(json[0].a_1, 1);
|
||||
assert.equal(json[0].a_2, 3);
|
||||
});
|
||||
it('should handle raw data if requested', function() {
|
||||
var _ws = X.utils.aoa_to_sheet(data, {cellDates:true});
|
||||
var json = X.utils.sheet_to_json(_ws, {header:1, raw:true});
|
||||
@ -2016,7 +2024,7 @@ describe('CSV', function() {
|
||||
if(typeof before != 'undefined') before(bef);
|
||||
else it('before', bef);
|
||||
it('should generate csv', function() {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(ws));
|
||||
});
|
||||
it('should handle FS', function() {
|
||||
@ -2028,18 +2036,18 @@ describe('CSV', function() {
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {RS:";"}).replace(/[;]/g,"\n"), X.utils.sheet_to_csv(ws));
|
||||
});
|
||||
it('should handle dateNF', function() {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,";
|
||||
var _ws = X.utils.aoa_to_sheet(data, {cellDates:true});
|
||||
delete get_cell(_ws,"C3").w;
|
||||
delete get_cell(_ws,"C3").z;
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(_ws, {dateNF:"YYYYMMDD"}));
|
||||
});
|
||||
it('should handle strip', function() {
|
||||
var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux\n";
|
||||
var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux";
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(ws, {strip:true}));
|
||||
});
|
||||
it('should handle blankrows', function() {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,";
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(ws, {blankrows:false}));
|
||||
});
|
||||
it('should handle various line endings', function() {
|
||||
@ -2052,27 +2060,34 @@ describe('CSV', function() {
|
||||
});
|
||||
});
|
||||
it('should handle skipHidden for rows if requested', function() {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
|
||||
delete ws["!rows"];
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
|
||||
ws["!rows"] = [null,{hidden:true},null,null];
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,");
|
||||
delete ws["!rows"];
|
||||
});
|
||||
it('should handle skipHidden for columns if requested', function() {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
|
||||
delete ws["!cols"];
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
|
||||
ws["!cols"] = [null,{hidden:true},null,null];
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,");
|
||||
ws["!cols"] = [{hidden:true},null,null,null];
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,");
|
||||
delete ws["!cols"];
|
||||
});
|
||||
it('should properly handle blankrows and strip options', function() {
|
||||
var _ws = X.utils.aoa_to_sheet([[""],[],["", ""]]);
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {}), ",\n,\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {strip: true}), "\n\n");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false}), ",\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false, strip: true}), "");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@ -2249,11 +2264,11 @@ describe('HTML', function() {
|
||||
var html = "<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr></tbody><tfoot><tr><th>4</th><th>6</th></tr></tfoot></table>";
|
||||
it('HTML string', function() {
|
||||
var ws = X.read(html, {type:'string'}).Sheets.Sheet1;
|
||||
assert.equal(X.utils.sheet_to_csv(ws), "A,B\n1,2\n3,4\n4,6\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws), "A,B\n1,2\n3,4\n4,6");
|
||||
});
|
||||
if(domtest) it('DOM', function() {
|
||||
var ws = X.utils.table_to_sheet(get_dom_element(html));
|
||||
assert.equal(X.utils.sheet_to_csv(ws), "A,B\n1,2\n3,4\n4,6\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws), "A,B\n1,2\n3,4\n4,6");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
39
test.ts
39
test.ts
@ -1401,8 +1401,8 @@ Deno.test('write features', async function(t) {
|
||||
var wb = X.utils.book_new();
|
||||
X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[1,2],[3,4]]), "Sheet1");
|
||||
X.utils.book_append_sheet(wb, X.utils.aoa_to_sheet([[5,6],[7,8]]), "Sheet2");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4\n");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8\n");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet1"}), "1,2\n3,4");
|
||||
assert.equal(X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet2"}), "5,6\n7,8");
|
||||
assert.throws(function() { X.write(wb, {type:"string", bookType:"csv", sheet:"Sheet3"}); });
|
||||
});
|
||||
});
|
||||
@ -1778,6 +1778,14 @@ Deno.test('json output', async function(t) {
|
||||
assert.equal(json[i].S_1, 7 + i);
|
||||
}
|
||||
});
|
||||
await t.step('should handle collisions in disambiguation', async function(t) {
|
||||
var _data = [["a_1","a","a"],[1,2,3]];
|
||||
var _ws = X.utils.aoa_to_sheet(_data);
|
||||
var json: any = X.utils.sheet_to_json(_ws);
|
||||
assert.equal(json[0].a, 2);
|
||||
assert.equal(json[0].a_1, 1);
|
||||
assert.equal(json[0].a_2, 3);
|
||||
});
|
||||
await t.step('should handle raw data if requested', async function(t) {
|
||||
var _ws = X.utils.aoa_to_sheet(data, {cellDates:true});
|
||||
var json: Array<Array<any>> = X.utils.sheet_to_json(_ws, {header:1, raw:true});
|
||||
@ -1966,7 +1974,7 @@ Deno.test('CSV', async function(t) {
|
||||
];
|
||||
var ws = X.utils.aoa_to_sheet(data);
|
||||
await t.step('should generate csv', async function(t) {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(ws));
|
||||
});
|
||||
await t.step('should handle FS', async function(t) {
|
||||
@ -1978,18 +1986,18 @@ Deno.test('CSV', async function(t) {
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {RS:";"}).replace(/[;]/g,"\n"), X.utils.sheet_to_csv(ws));
|
||||
});
|
||||
await t.step('should handle dateNF', async function(t) {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,20140219,0.3\n,,,\nbaz,,qux,";
|
||||
var _ws = X.utils.aoa_to_sheet(data, {cellDates:true});
|
||||
delete get_cell(_ws,"C3").w;
|
||||
delete get_cell(_ws,"C3").z;
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(_ws, {dateNF:"YYYYMMDD"}));
|
||||
});
|
||||
await t.step('should handle strip', async function(t) {
|
||||
var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux\n";
|
||||
var baseline = "1,2,3\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n\nbaz,,qux";
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(ws, {strip:true}));
|
||||
});
|
||||
await t.step('should handle blankrows', async function(t) {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\nbaz,,qux,";
|
||||
assert.equal(baseline, X.utils.sheet_to_csv(ws, {blankrows:false}));
|
||||
});
|
||||
await t.step('should handle various line endings', async function(t) {
|
||||
@ -2002,27 +2010,34 @@ Deno.test('CSV', async function(t) {
|
||||
});
|
||||
});
|
||||
await t.step('should handle skipHidden for rows if requested', async function(t) {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
|
||||
delete ws["!rows"];
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
|
||||
ws["!rows"] = ([,{hidden:true},,] as any);
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,2,3,\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,");
|
||||
delete ws["!rows"];
|
||||
});
|
||||
await t.step('should handle skipHidden for columns if requested', async function(t) {
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,\n";
|
||||
var baseline = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/19/14,0.3\n,,,\nbaz,,qux,";
|
||||
delete ws["!cols"];
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), baseline);
|
||||
ws["!cols"] = ([,{hidden:true},,] as any);
|
||||
assert.equal(X.utils.sheet_to_csv(ws), baseline);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "1,3,\nTRUE,,sheetjs\nfoo,2/19/14,0.3\n,,\nbaz,qux,");
|
||||
ws["!cols"] = ([{hidden:true},,,] as any);
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,");
|
||||
delete ws["!cols"];
|
||||
});
|
||||
await t.step('should properly handle blankrows and strip options', async function(t) {
|
||||
var _ws = X.utils.aoa_to_sheet([[""],[],["", ""]]);
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {}), ",\n,\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {strip: true}), "\n\n");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false}), ",\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false, strip: true}), "");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@ -2108,7 +2123,7 @@ Deno.test('HTML', async function(t) {
|
||||
var html = "<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr></tbody><tfoot><tr><th>4</th><th>6</th></tr></tfoot></table>";
|
||||
await t.step('HTML string', async function(t) {
|
||||
var ws = X.read(html, {type:'string'}).Sheets.Sheet1;
|
||||
assert.equal(X.utils.sheet_to_csv(ws), "A,B\n1,2\n3,4\n4,6\n");
|
||||
assert.equal(X.utils.sheet_to_csv(ws), "A,B\n1,2\n3,4\n4,6");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
15
tests/core.js
generated
15
tests/core.js
generated
@ -1837,6 +1837,14 @@ describe('json output', function() {
|
||||
assert.equal(json[i].S_1, 7 + i);
|
||||
}
|
||||
});
|
||||
it('should handle collisions in disambiguation', function() {
|
||||
var _data = [["a_1","a","a"],[1,2,3]];
|
||||
var _ws = X.utils.aoa_to_sheet(_data);
|
||||
var json = X.utils.sheet_to_json(_ws);
|
||||
assert.equal(json[0].a, 2);
|
||||
assert.equal(json[0].a_1, 1);
|
||||
assert.equal(json[0].a_2, 3);
|
||||
});
|
||||
it('should handle raw data if requested', function() {
|
||||
var _ws = X.utils.aoa_to_sheet(data, {cellDates:true});
|
||||
var json = X.utils.sheet_to_json(_ws, {header:1, raw:true});
|
||||
@ -2087,6 +2095,13 @@ describe('CSV', function() {
|
||||
assert.equal(X.utils.sheet_to_csv(ws, {skipHidden:true}), "2,3,\nFALSE,,sheetjs\nbar,2/19/14,0.3\n,,\n,qux,");
|
||||
delete ws["!cols"];
|
||||
});
|
||||
it('should properly handle blankrows and strip options', function() {
|
||||
var _ws = X.utils.aoa_to_sheet([[""],[],["", ""]]);
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {}), ",\n,\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {strip: true}), "\n\n");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false}), ",\n,");
|
||||
assert.equal(X.utils.sheet_to_csv(_ws, {blankrows: false, strip: true}), "");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
56
tests/mini.html
Normal file
56
tests/mini.html
Normal file
@ -0,0 +1,56 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>JS-XLSX Core Test Runner</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="mocha.css" />
|
||||
<link rel="icon" type="image/png" href="//oss.sheetjs.com/assets/img/logo.png" />
|
||||
<style>
|
||||
#t { font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; font-weight: bold; }
|
||||
#tt{ font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; }
|
||||
th { font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; font-weight: bold; text-align: left; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="t"><a href="http://sheetjs.com">JS-XLSX Browser-based Parsing Tests</a></h1>
|
||||
<table id="tt">
|
||||
<tr>
|
||||
<th>File Formats</th>
|
||||
<td><a href="http://github.com/SheetJS/js-xlsx">Library Source</a></td>
|
||||
<td><a href="http://SheetJS.github.io/js-xls">Interactive Demo</a></td>
|
||||
<td><a href="http://npm.im/xlsx">"xlsx" on npm</a></td>
|
||||
<td><a href="https://travis-ci.org/SheetJS/js-xlsx">node CI status</a></td>
|
||||
</tr>
|
||||
<tr><td colspan="5">Tests compiled from <a href="http://github.com/SheetJS/test_files">test_files repo</a> and are located at /test_files<br /></td></tr>
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-36810333-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
<script src="shim.js"></script>
|
||||
<script src="base64.js"></script>
|
||||
<script src="fs_.js"></script>
|
||||
<script src="fixtures.js"></script>
|
||||
<script src="xlsx.mini.min.js"></script>
|
||||
<div id="mocha"></div>
|
||||
<script src="mocha.js"></script>
|
||||
<script>
|
||||
window.initMochaPhantomJS && window.initMochaPhantomJS();
|
||||
mocha.setup({ui:'bdd', timeout:15000});
|
||||
</script>
|
||||
<script src="mini.js"></script>
|
||||
<script>
|
||||
if(typeof mochaSaucePlease !== "undefined") mochaSaucePlease();
|
||||
else if(window.mochaPhantomJS) mochaPhantomJS.run();
|
||||
else typeof mocha_sauce !== 'undefined' ? mocha_sauce() : mocha.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
2449
tests/mini.js
Normal file
2449
tests/mini.js
Normal file
File diff suppressed because it is too large
Load Diff
1
tests/xlsx.mini.min.js
vendored
Symbolic link
1
tests/xlsx.mini.min.js
vendored
Symbolic link
@ -0,0 +1 @@
|
||||
../dist/xlsx.mini.min.js
|
2
types/index.d.ts
vendored
2
types/index.d.ts
vendored
@ -868,4 +868,6 @@ export interface StreamUtils {
|
||||
to_html(sheet: WorkSheet, opts?: Sheet2HTMLOpts): any;
|
||||
/** JSON object stream, generate one row at a time */
|
||||
to_json(sheet: WorkSheet, opts?: Sheet2JSONOpts): any;
|
||||
/** Set `Readable` (internal) */
|
||||
set_readable(Readable: any): void;
|
||||
}
|
||||
|
267
xlsx.flow.js
267
xlsx.flow.js
@ -3755,6 +3755,17 @@ function write_vt(s, xlsx/*:?boolean*/)/*:string*/ {
|
||||
throw new Error("Unable to serialize " + s);
|
||||
}
|
||||
|
||||
function xlml_normalize(d)/*:string*/ {
|
||||
if(has_buf &&/*::typeof Buffer !== "undefined" && d != null && d instanceof Buffer &&*/ Buffer.isBuffer(d)) return d.toString('utf8');
|
||||
if(typeof d === 'string') return d;
|
||||
/* duktape */
|
||||
if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
|
||||
throw new Error("Bad input format: expected Buffer or string");
|
||||
}
|
||||
/* UOS uses CJK in tags */
|
||||
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
|
||||
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
|
||||
|
||||
var XMLNS = ({
|
||||
'dc': 'http://purl.org/dc/elements/1.1/',
|
||||
'dcterms': 'http://purl.org/dc/terms/',
|
||||
@ -17146,18 +17157,7 @@ function xlml_clean_comment(comment/*:any*/) {
|
||||
comment.v = comment.w = comment.ixfe = undefined;
|
||||
}
|
||||
|
||||
function xlml_normalize(d)/*:string*/ {
|
||||
if(has_buf &&/*::typeof Buffer !== "undefined" && d != null && d instanceof Buffer &&*/ Buffer.isBuffer(d)) return d.toString('utf8');
|
||||
if(typeof d === 'string') return d;
|
||||
/* duktape */
|
||||
if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
|
||||
throw new Error("Bad input format: expected Buffer or string");
|
||||
}
|
||||
|
||||
/* TODO: Everything */
|
||||
/* UOS uses CJK in tags */
|
||||
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
|
||||