forked from sheetjs/sheetjs
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);
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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);
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
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}), "");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -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");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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}), "");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -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>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1 @@
|
|||
../dist/xlsx.mini.min.js
|
|
@ -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;
|
||||
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
|
||||
function parse_xlml_xml(d, _opts)/*:Workbook*/ {
|
||||
var opts = _opts || {};
|
||||
make_ssf(SSF);
|
||||
|
@ -20994,7 +20994,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();
|
||||
|
@ -23711,7 +23711,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;
|
||||
}
|
||||
}
|
||||
|
@ -23760,12 +23760,13 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ {
|
|||
var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo/*:Array<ColInfo>*/ = 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("");
|
||||
|
@ -24020,131 +24021,126 @@ utils.sheet_set_array_formula = function(ws/*:Worksheet*/, range, formula/*:stri
|
|||
return utils;
|
||||
})(utils);
|
||||
|
||||
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;
|
||||
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/*: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() {
|
||||
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/*: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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
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
|
||||
|
@ -24158,7 +24154,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 = require('stream');
|
||||
if((strmod||{}).Readable) set_readable(strmod.Readable);
|
||||
}
|
||||
}
|
||||
/*global define */
|
||||
/*:: declare var define:any; */
|
||||
|
|
|
@ -3674,6 +3674,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/',
|
||||
|
@ -17040,18 +17051,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);
|
||||
|
@ -20877,7 +20877,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();
|
||||
|
@ -23583,7 +23583,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;
|
||||
}
|
||||
}
|
||||
|
@ -23632,12 +23632,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("");
|
||||
|
@ -23892,131 +23893,126 @@ utils.sheet_set_array_formula = function(ws, range, formula, dynamic) {
|
|||
return utils;
|
||||
})(utils);
|
||||
|
||||
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, 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
|
||||
|
@ -24030,7 +24026,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 = require('stream');
|
||||
if((strmod||{}).Readable) set_readable(strmod.Readable);
|
||||
}
|
||||
}
|
||||
/*global define */
|
||||
if(typeof exports !== 'undefined') make_xlsx_lib(exports);
|
||||
|
|
|
@ -3733,6 +3733,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/',
|
||||
|
@ -9189,7 +9200,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();
|
||||
|
@ -11239,7 +11250,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;
|
||||
}
|
||||
}
|
||||
|
@ -11288,12 +11299,13 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ {
|
|||
var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo/*:Array<ColInfo>*/ = 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("");
|
||||
|
@ -11561,7 +11573,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 = require('stream');
|
||||
if((strmod||{}).Readable) set_readable(strmod.Readable);
|
||||
}
|
||||
}
|
||||
/*global define */
|
||||
/*:: declare var define:any; */
|
||||
|
|
23
xlsx.mini.js
23
xlsx.mini.js
|
@ -3653,6 +3653,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/',
|
||||
|
@ -9095,7 +9106,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();
|
||||
|
@ -11134,7 +11145,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;
|
||||
}
|
||||
}
|
||||
|
@ -11183,12 +11194,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("");
|
||||
|
@ -11456,7 +11468,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 = require('stream');
|
||||
if((strmod||{}).Readable) set_readable(strmod.Readable);
|
||||
}
|
||||
}
|
||||
/*global define */
|
||||
if(typeof exports !== 'undefined') make_xlsx_lib(exports);
|
||||
|
|
|
@ -3752,6 +3752,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/',
|
||||
|
@ -17143,18 +17154,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);
|
||||
|
@ -20991,7 +20991,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();
|
||||
|
@ -23708,7 +23708,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;
|
||||
}
|
||||
}
|
||||
|
@ -23757,12 +23757,13 @@ function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ {
|
|||
var colinfo/*:Array<ColInfo>*/ = o.skipHidden && sheet["!cols"] || [];
|
||||
var rowinfo/*:Array<ColInfo>*/ = 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("");
|
||||
|
@ -24017,6 +24018,126 @@ utils.sheet_set_array_formula = function(ws/*:Worksheet*/, range, formula/*:stri
|
|||
return utils;
|
||||
})(utils);
|
||||
|
||||
var _Readable;
|
||||
function set_readable(R) { _Readable = R; }
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
while(R <= r.e.r) {
|
||||
stream.push(HTML_._row(ws, r, R, o));
|
||||
++R;
|
||||
break;
|
||||
}
|
||||
};
|
||||
return 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
|
||||
};
|
||||
export const version = XLSX.version;
|
||||
export {
|
||||
parse_xlscfb,
|
||||
|
@ -24031,6 +24152,7 @@ export {
|
|||
writeSyncXLSX as writeXLSX,
|
||||
writeFileSyncXLSX as writeFileXLSX,
|
||||
utils,
|
||||
__stream as stream,
|
||||
SSF,
|
||||
CFB
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue