forked from sheetjs/sheetjs
version bump 0.11.3: "array" type
- phased out Array map invocations (fixes #620 h/t @dullin) - "array" type supports Uint8Array - Headless browser examples - blank cells are omitted or stubbed (fixes #779 h/t @domxa) - removed transferrables from demo
This commit is contained in:
parent
2ea9c95839
commit
635310b639
@ -15,8 +15,6 @@
|
||||
|
||||
.*/xlsx.js
|
||||
.*/xlsxworker.js
|
||||
.*/xlsxworker1.js
|
||||
.*/xlsxworker2.js
|
||||
.*/jszip.js
|
||||
.*/tests/.*
|
||||
.*/demos/.*
|
||||
@ -24,8 +22,6 @@
|
||||
#.*/xlsx.flow.js
|
||||
[include]
|
||||
xlsxworker.flow.js
|
||||
xlsxworker1.flow.js
|
||||
xlsxworker2.flow.js
|
||||
xlsx.flow.js
|
||||
.*/bin/.*.njs
|
||||
.*/demo/browser.flow.js
|
||||
|
2
Makefile
2
Makefile
@ -12,7 +12,7 @@ DEPS=$(sort $(wildcard bits/*.js))
|
||||
TARGET=$(LIB).js
|
||||
FLOWTARGET=$(LIB).flow.js
|
||||
FLOWAUX=$(patsubst %.js,%.flow.js,$(AUXTARGETS))
|
||||
AUXSCPTS=xlsxworker1.js xlsxworker2.js xlsxworker.js
|
||||
AUXSCPTS=xlsxworker.js
|
||||
FLOWTGTS=$(TARGET) $(AUXTARGETS) $(AUXSCPTS)
|
||||
UGLIFYOPTS=--support-ie8 -m
|
||||
CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar
|
||||
|
@ -182,7 +182,7 @@ The `demos` directory includes sample projects for:
|
||||
|
||||
**JS Platforms and Integrations**
|
||||
- [`Adobe ExtendScript`](demos/extendscript/)
|
||||
- [`phantomjs`](demos/phantomjs/)
|
||||
- [`Headless Browsers`](demos/headless/)
|
||||
- [`canvas-datagrid`](demos/datagrid/)
|
||||
- [`Other JS engines`](demos/altjs/)
|
||||
|
||||
@ -1430,7 +1430,7 @@ tells the library how to parse the data argument:
|
||||
| `type` | expected input |
|
||||
|------------|-----------------------------------------------------------------|
|
||||
| `"base64"` | string: base64 encoding of the file |
|
||||
| `"binary"` | string: binary string (`n`-th byte is `data.charCodeAt(n)`) |
|
||||
| `"binary"` | string: binary string (`n`-th byte is `data.charCodeAt(n)`) |
|
||||
| `"buffer"` | nodejs Buffer |
|
||||
| `"array"` | array: array of 8-bit unsigned int (`n`-th byte is `data[n]`) |
|
||||
| `"file"` | string: filename that will be read and processed (nodejs only) |
|
||||
@ -1456,7 +1456,7 @@ file but Excel will know how to handle it. This library applies similar logic:
|
||||
| `0xEF` | UTF8 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0xFF` | UTF16 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x00` | Record Stream | Lotus WK\* or Quattro Pro or plaintext |
|
||||
| `0x0A` | Plaintext | RTF or plaintext |
|
||||
| `0x7B` | Plaintext | RTF or plaintext |
|
||||
| `0x0A` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x0D` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x20` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.11.2';
|
||||
XLSX.version = '0.11.3';
|
||||
|
@ -28,8 +28,8 @@ var __toBuffer, ___toBuffer;
|
||||
__toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };
|
||||
var __utf16le, ___utf16le;
|
||||
__utf16le = ___utf16le = function utf16le_(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(""); };
|
||||
var __hexlify, ___hexlify;
|
||||
__hexlify = ___hexlify = function hexlify_(b,s,l) { return b.slice(s,(s+l)).map(function(x){return (x<16?"0":"") + x.toString(16);}).join(""); };
|
||||
var __hexlify = function(b/*:RawBytes|CFBlob*/,s/*:number*/,l/*:number*/)/*:string*/ { var ss/*:Array<string>*/=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
|
||||
var ___hexlify = __hexlify;
|
||||
var __utf8, ___utf8;
|
||||
__utf8 = ___utf8 = function(b,s,e) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
|
||||
var __lpstr, ___lpstr;
|
||||
@ -68,11 +68,11 @@ if(typeof cptable !== 'undefined') {
|
||||
__8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : "";};
|
||||
}
|
||||
|
||||
var __readUInt8 = function(b, idx) { return b[idx]; };
|
||||
var __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };
|
||||
var __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };
|
||||
var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };
|
||||
var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
|
||||
var __readUInt8 = function(b, idx/*:number*/)/*:number*/ { return b[idx]; };
|
||||
var __readUInt16LE = function(b, idx/*:number*/)/*:number*/ { return b[idx+1]*(1<<8)+b[idx]; };
|
||||
var __readInt16LE = function(b, idx/*:number*/)/*:number*/ { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };
|
||||
var __readUInt32LE = function(b, idx/*:number*/)/*:number*/ { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };
|
||||
var __readInt32LE = function(b, idx/*:number*/)/*:number*/ { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
|
||||
|
||||
var ___unhexlify = function(s) { return s.match(/../g).map(function(x) { return parseInt(x,16);}); };
|
||||
var __unhexlify = typeof Buffer !== "undefined" ? function(s) { return Buffer.isBuffer(s) ? new Buffer(s, 'hex') : ___unhexlify(s); } : ___unhexlify;
|
||||
|
@ -518,8 +518,8 @@ var PRN = (function() {
|
||||
if((cc=str.charCodeAt(end)) == 0x22) instr = !instr;
|
||||
else if(!instr) cnt[cc] = (cnt[cc]||0)+1;
|
||||
}
|
||||
if(cnt[0x2C] > cnt[0x09]) return ",";
|
||||
return ",";
|
||||
if((cnt[0x2C]||0) >= (cnt[0x09]||0)) return ",";
|
||||
return "\t";
|
||||
}
|
||||
|
||||
function dsv_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ {
|
||||
|
@ -1,3 +1,23 @@
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_xml(data, name, opts) {
|
||||
var d = [];
|
||||
if(!data) return d;
|
||||
var l = 0, i = 1;
|
||||
(data.match(tagregex)||[]).forEach(function(x) {
|
||||
var y = parsexmltag(x);
|
||||
switch(y[0]) {
|
||||
case '<?xml': break;
|
||||
/* 18.6.2 calcChain CT_CalcChain 1 */
|
||||
case '<calcChain': case '<calcChain>': case '</calcChain>': break;
|
||||
/* 18.6.1 c CT_CalcCell 1 */
|
||||
case '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;
|
||||
}
|
||||
});
|
||||
return d;
|
||||
}
|
||||
|
||||
function write_cc_xml(data, opts) { }
|
||||
|
||||
/* [MS-XLSB] 2.6.4.1 */
|
||||
function parse_BrtCalcChainItem$(data, length) {
|
||||
var out = {};
|
||||
@ -13,7 +33,7 @@ function parse_BrtCalcChainItem$(data, length) {
|
||||
}
|
||||
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_bin(data, opts) {
|
||||
function parse_cc_bin(data, name, opts) {
|
||||
var out = [];
|
||||
var pass = false;
|
||||
recordhopper(data, function hopper_cc(val, R_n, RT) {
|
@ -1,19 +0,0 @@
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_xml(data, opts) {
|
||||
var d = [];
|
||||
if(!data) return d;
|
||||
var l = 0, i = 1;
|
||||
(data.match(tagregex)||[]).forEach(function(x) {
|
||||
var y = parsexmltag(x);
|
||||
switch(y[0]) {
|
||||
case '<?xml': break;
|
||||
/* 18.6.2 calcChain CT_CalcChain 1 */
|
||||
case '<calcChain': case '<calcChain>': case '</calcChain>': break;
|
||||
/* 18.6.1 c CT_CalcCell 1 */
|
||||
case '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;
|
||||
}
|
||||
});
|
||||
return d;
|
||||
}
|
||||
|
||||
function write_cc_xml(data, opts) { }
|
51
bits/53_externlink.js
Normal file
51
bits/53_externlink.js
Normal file
@ -0,0 +1,51 @@
|
||||
/* 18.14 Supplementary Workbook Data */
|
||||
function parse_xlink_xml(data, name/*:string*/, _opts) {
|
||||
var opts = _opts || {};
|
||||
//if(opts.WTF) throw "XLSX External Link";
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.1.7.25 External Link */
|
||||
function parse_xlink_bin(data, name/*:string*/, _opts) {
|
||||
if(!data) return data;
|
||||
var opts = _opts || {};
|
||||
|
||||
var pass = false, end = false;
|
||||
|
||||
recordhopper(data, function xlink_parse(val, R_n, RT) {
|
||||
if(end) return;
|
||||
switch(RT) {
|
||||
case 0x0167: /* 'BrtSupTabs' */
|
||||
case 0x016B: /* 'BrtExternTableStart' */
|
||||
case 0x016C: /* 'BrtExternTableEnd' */
|
||||
case 0x016E: /* 'BrtExternRowHdr' */
|
||||
case 0x016F: /* 'BrtExternCellBlank' */
|
||||
case 0x0170: /* 'BrtExternCellReal' */
|
||||
case 0x0171: /* 'BrtExternCellBool' */
|
||||
case 0x0172: /* 'BrtExternCellError' */
|
||||
case 0x0173: /* 'BrtExternCellString' */
|
||||
case 0x01D8: /* 'BrtExternValueMeta' */
|
||||
case 0x0241: /* 'BrtSupNameStart' */
|
||||
case 0x0242: /* 'BrtSupNameValueStart' */
|
||||
case 0x0243: /* 'BrtSupNameValueEnd' */
|
||||
case 0x0244: /* 'BrtSupNameNum' */
|
||||
case 0x0245: /* 'BrtSupNameErr' */
|
||||
case 0x0246: /* 'BrtSupNameSt' */
|
||||
case 0x0247: /* 'BrtSupNameNil' */
|
||||
case 0x0248: /* 'BrtSupNameBool' */
|
||||
case 0x0249: /* 'BrtSupNameFmla' */
|
||||
case 0x024A: /* 'BrtSupNameBits' */
|
||||
case 0x024B: /* 'BrtSupNameEnd' */
|
||||
break;
|
||||
|
||||
case 0x0023: /* 'BrtFRTBegin' */
|
||||
pass = true; break;
|
||||
case 0x0024: /* 'BrtFRTEnd' */
|
||||
pass = false; break;
|
||||
|
||||
default:
|
||||
if((R_n||"").indexOf("Begin") > 0){/* empty */}
|
||||
else if((R_n||"").indexOf("End") > 0){/* empty */}
|
||||
else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
|
||||
}
|
||||
}, opts);
|
||||
}
|
@ -823,7 +823,7 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
stack.push(sname + "!" + encode_range((r/*:any*/)));
|
||||
stack.push(sname + "!" + encode_range_xls((r/*:any*/), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
stack.push("SUM(" + stack.pop() + ")");
|
||||
|
@ -43,8 +43,13 @@ function parse_cmnt(data, name/*:string*/, opts) {
|
||||
}
|
||||
|
||||
function parse_cc(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data/*:any*/), opts);
|
||||
return parse_cc_xml((data/*:any*/), opts);
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data/*:any*/), name, opts);
|
||||
return parse_cc_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function parse_xlink(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlink_bin((data/*:any*/), name, opts);
|
||||
return parse_xlink_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name/*:string*/, opts) {
|
||||
|
@ -377,6 +377,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
|
||||
case 'ContentStatus':
|
||||
case 'Identifier':
|
||||
case 'Language':
|
||||
case 'AppName':
|
||||
if(Rn[0].slice(-2) === "/>") break;
|
||||
else if(Rn[1]==="/") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));
|
||||
else pidx = Rn.index + Rn[0].length;
|
||||
@ -817,7 +818,10 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
|
||||
return out;
|
||||
}
|
||||
|
||||
function arr2str(data/*:any*/)/*:string*/ { return data.map(_chr).join(""); }
|
||||
function arr2str(data/*:any*/)/*:string*/ {
|
||||
if(Array.isArray(data)) return data.map(_chr).join("");
|
||||
var o = []; for(var i = 0; i < data.length; ++i) o[i] = _chr(data[i]); return o.join("");
|
||||
}
|
||||
|
||||
function parse_xlml(data/*:RawBytes|string*/, opts)/*:Workbook*/ {
|
||||
fix_read_opts(opts=opts||{});
|
||||
|
@ -833,6 +833,12 @@ if(cfb.FullPaths) {
|
||||
Summary = CFB.find(cfb, '!SummaryInformation');
|
||||
WB = CFB.find(cfb, '/Workbook');
|
||||
} else {
|
||||
switch(options.type) {
|
||||
case 'base64': cfb = s2a(Base64.decode(cfb)); break;
|
||||
case 'binary': cfb = s2a(cfb); break;
|
||||
case 'buffer': break;
|
||||
case 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;
|
||||
}
|
||||
prep_blob(cfb, 0);
|
||||
WB = ({content: cfb}/*:any*/);
|
||||
}
|
||||
|
@ -38,6 +38,8 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, shee
|
||||
}
|
||||
|
||||
var nodirs = function nodirs(x/*:string*/)/*:boolean*/{return x.slice(-1) != '/';};
|
||||
function strip_front_slash(x/*:string*/)/*:string*/ { return x.charAt(0) == '/' ? x.slice(1) : x; }
|
||||
|
||||
function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
make_ssf(SSF);
|
||||
opts = opts || {};
|
||||
@ -70,22 +72,26 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
var styles = ({}/*:any*/);
|
||||
if(!opts.bookSheets && !opts.bookProps) {
|
||||
strs = [];
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\//,'')), dir.sst, opts);
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts);
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\//,'')),dir.style, themes, opts);
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\//,'')), dir.workbooks[0], opts);
|
||||
var externbooks = dir.links.map(function(link) {
|
||||
return parse_xlink(getzipdata(zip, strip_front_slash(link)), link, opts);
|
||||
});
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
|
||||
|
||||
var props = {}, propdata = "";
|
||||
|
||||
if(dir.coreprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.coreprops[0].replace(/^\//,''), true);
|
||||
if(dir.coreprops.length) {
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.coreprops[0]), true);
|
||||
if(propdata) props = parse_core_props(propdata);
|
||||
if(dir.extprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.extprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.extprops[0]), true);
|
||||
if(propdata) parse_ext_props(propdata, props, opts);
|
||||
}
|
||||
}
|
||||
@ -93,7 +99,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
var custprops = {};
|
||||
if(!opts.bookSheets || opts.bookProps) {
|
||||
if (dir.custprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.custprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
|
||||
if(propdata) custprops = parse_cust_props(propdata, opts);
|
||||
}
|
||||
}
|
||||
@ -109,7 +115,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
sheets = {};
|
||||
|
||||
var deps = {};
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\//,'')),dir.calcchain,opts);
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);
|
||||
|
||||
var i=0;
|
||||
var sheetRels = ({}/*:any*/);
|
||||
@ -163,7 +169,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
out.files = zip.files;
|
||||
}
|
||||
if(opts.bookVBA) {
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0].replace(/^\//,''),true);
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);
|
||||
else if(dir.defaults && dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);
|
||||
}
|
||||
return out;
|
||||
|
@ -69,7 +69,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); }
|
||||
switch((n = firstbyte(d, o))[0]) {
|
||||
case 0xD0: return read_cfb(CFB.read(d, o), o);
|
||||
case 0x09: return parse_xlscfb(s2a(o.type === 'base64' ? Base64.decode(d) : d), o);
|
||||
case 0x09: return parse_xlscfb(d, o);
|
||||
case 0x3C: return parse_xlml(d, o);
|
||||
case 0x49: if(n[1] == 0x44) return read_wb_ID(d, o); break;
|
||||
case 0x54: if(n[1] == 0x41 && n[2] == 0x42 && n[3] == 0x4C) return DIF.to_workbook(d, o); break;
|
||||
|
@ -4,7 +4,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>JS-XLSX Live Demo</title>
|
||||
<title>SheetJS Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
@ -18,26 +18,33 @@
|
||||
#b64data{
|
||||
width:100%;
|
||||
}
|
||||
a { text-decoration: none }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-XLSX Live Demo</b><br />
|
||||
Output Format:
|
||||
<select name="format">
|
||||
<pre>
|
||||
<b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b>
|
||||
(Base64 text works back to IE6; drag and drop works back to IE10)
|
||||
|
||||
<a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a>
|
||||
<a href="https://github.com/SheetJS/js-xlsx/issues">Issues? Something look weird? Click here and report an issue</a>
|
||||
Output Format: <select name="format" onchange="setfmt()">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</option>
|
||||
<option value="html"> HTML</option>
|
||||
</select><br />
|
||||
|
||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
|
||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
|
||||
<input type="file" name="xlfile" id="xlf" /> ... or click here to select a file
|
||||
|
||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
|
||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
|
||||
Advanced Demo Options: <br />
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked><br />
|
||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked><br />
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
|
||||
<b>Advanced Demo Options:</b>
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked>
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
|
||||
</pre>
|
||||
<pre id="out"></pre>
|
||||
<div id="htmlout"></div>
|
||||
<br />
|
||||
<script src="browserify.min.js"></script>
|
||||
<script>
|
||||
@ -48,233 +55,168 @@ var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './xlsxworker2.js',
|
||||
norABS: './xlsxworker1.js',
|
||||
noxfer: './xlsxworker.js'
|
||||
worker: './xlsxworker.js'
|
||||
};
|
||||
|
||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
|
||||
if(!rABS) {
|
||||
document.getElementsByName("userabs")[0].disabled = true;
|
||||
document.getElementsByName("userabs")[0].checked = false;
|
||||
}
|
||||
var global_wb;
|
||||
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
if(!use_worker) {
|
||||
document.getElementsByName("useworker")[0].disabled = true;
|
||||
document.getElementsByName("useworker")[0].checked = false;
|
||||
}
|
||||
var process_wb = (function() {
|
||||
var OUT = document.getElementById('out');
|
||||
var HTMLOUT = document.getElementById('htmlout');
|
||||
|
||||
var transferable = use_worker;
|
||||
if(!transferable) {
|
||||
document.getElementsByName("xferable")[0].disabled = true;
|
||||
document.getElementsByName("xferable")[0].checked = false;
|
||||
}
|
||||
var get_format = (function() {
|
||||
var radios = document.getElementsByName( "format" );
|
||||
return function() {
|
||||
for(var i = 0; i < radios.length; ++i) if(radios[i].checked || radios.length === 1) return radios[i].value;
|
||||
};
|
||||
})();
|
||||
|
||||
var wtf_mode = false;
|
||||
|
||||
function fixdata(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
function xw_noxfer(data, cb) {
|
||||
var worker = new Worker(XW.noxfer);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
var to_json = function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length) result[sheetName] = roa;
|
||||
});
|
||||
return JSON.stringify(result, 2, 2);
|
||||
};
|
||||
var arr = rABS ? data : btoa(fixdata(data));
|
||||
worker.postMessage({d:arr,b:rABS});
|
||||
}
|
||||
|
||||
function xw_xfer(data, cb) {
|
||||
var worker = new Worker(rABS ? XW.rABS : XW.norABS);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
default: xx=ab2str(e.data).replace(/\n/g,"\\n").replace(/\r/g,"\\r"); console.log("done"); cb(JSON.parse(xx)); break;
|
||||
}
|
||||
var to_csv = function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
if(rABS) {
|
||||
var val = s2ab(data);
|
||||
worker.postMessage(val[1], [val[1]]);
|
||||
} else {
|
||||
worker.postMessage(data, [data]);
|
||||
}
|
||||
}
|
||||
|
||||
function xw(data, cb) {
|
||||
transferable = document.getElementsByName("xferable")[0].checked;
|
||||
if(transferable) xw_xfer(data, cb);
|
||||
else xw_noxfer(data, cb);
|
||||
}
|
||||
var to_fmla = function to_fmla(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
|
||||
function get_radio_value( radioName ) {
|
||||
var radios = document.getElementsByName( radioName );
|
||||
for( var i = 0; i < radios.length; i++ ) {
|
||||
if( radios[i].checked || radios.length === 1 ) {
|
||||
return radios[i].value;
|
||||
var to_html = function to_html(workbook) {
|
||||
HTMLOUT.innerHTML = "";
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
|
||||
HTMLOUT.innerHTML += htmlstr;
|
||||
});
|
||||
return "";
|
||||
};
|
||||
|
||||
return function process_wb(wb) {
|
||||
global_wb = wb;
|
||||
var output = "";
|
||||
switch(get_format()) {
|
||||
case "form": output = to_fmla(wb); break;
|
||||
case "html": output = to_html(wb); break;
|
||||
case "json": output = to_json(wb); break;
|
||||
default: output = to_csv(wb);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(OUT.innerText === undefined) OUT.textContent = output;
|
||||
else OUT.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
};
|
||||
})();
|
||||
|
||||
function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length > 0){
|
||||
result[sheetName] = roa;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
var setfmt = window.setfmt = function setfmt() { if(global_wb) process_wb(global_wb); };
|
||||
|
||||
function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
var b64it = window.b64it = (function() {
|
||||
var tarea = document.getElementById('b64data');
|
||||
return function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type:'base64', WTF:false});
|
||||
process_wb(wb);
|
||||
};
|
||||
})();
|
||||
|
||||
function to_formulae(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
var do_file = (function() {
|
||||
var rABS = typeof FileReader !== "undefined" && (FileReader.prototype||{}).readAsBinaryString;
|
||||
var domrabs = document.getElementsByName("userabs")[0];
|
||||
if(!rABS) domrabs.disabled = !(domrabs.checked = false);
|
||||
|
||||
var tarea = document.getElementById('b64data');
|
||||
function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
|
||||
process_wb(wb);
|
||||
}
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
var domwork = document.getElementsByName("useworker")[0];
|
||||
if(!use_worker) domwork.disabled = !(domwork.checked = false);
|
||||
|
||||
function process_wb(wb) {
|
||||
var output = "";
|
||||
switch(get_radio_value("format")) {
|
||||
case "json":
|
||||
output = JSON.stringify(to_json(wb), 2, 2);
|
||||
break;
|
||||
case "form":
|
||||
output = to_formulae(wb);
|
||||
break;
|
||||
default:
|
||||
output = to_csv(wb);
|
||||
}
|
||||
if(out.innerText === undefined) out.textContent = output;
|
||||
else out.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
}
|
||||
var xw = function xw(data, cb) {
|
||||
var worker = new Worker(XW.worker);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
};
|
||||
worker.postMessage({d:data,b:rABS?'binary':'array'});
|
||||
};
|
||||
|
||||
var drop = document.getElementById('drop');
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.dataTransfer.files;
|
||||
var f = files[0];
|
||||
{
|
||||
return function do_file(files) {
|
||||
rABS = domrabs.checked;
|
||||
use_worker = domwork.checked;
|
||||
var f = files[0];
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
if(!rABS) data = new Uint8Array(data);
|
||||
if(use_worker) xw(data, process_wb);
|
||||
else process_wb(X.read(data, {type: rABS ? 'binary' : 'array'}));
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
};
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var drop = document.getElementById('drop');
|
||||
if(!drop.addEventListener) return;
|
||||
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
do_file(e.dataTransfer.files);
|
||||
}
|
||||
}
|
||||
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
|
||||
if(drop.addEventListener) {
|
||||
drop.addEventListener('dragenter', handleDragover, false);
|
||||
drop.addEventListener('dragover', handleDragover, false);
|
||||
drop.addEventListener('drop', handleDrop, false);
|
||||
}
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var xlf = document.getElementById('xlf');
|
||||
if(!xlf.addEventListener) return;
|
||||
function handleFile(e) { do_file(e.target.files); }
|
||||
xlf.addEventListener('change', handleFile, false);
|
||||
})();
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-36810333-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
var xlf = document.getElementById('xlf');
|
||||
function handleFile(e) {
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.target.files;
|
||||
var f = files[0];
|
||||
{
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
}
|
||||
}
|
||||
|
||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
|
||||
(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>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -6,7 +6,7 @@ postMessage({t:"ready"});
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b});
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
};
|
||||
|
@ -1,27 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('browserify.min.js');
|
||||
var XLSX = require('xlsx');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,27 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('browserify.min.js');
|
||||
var XLSX = require('xlsx');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
43
demos/headless/README.md
Normal file
43
demos/headless/README.md
Normal file
@ -0,0 +1,43 @@
|
||||
# Headless Browsers
|
||||
|
||||
The library, intentionally conservative in the use of ES5+ feaures, plays nicely
|
||||
with most headless browsers. This demo shows a few common headless scenarios.
|
||||
|
||||
## PhantomJS
|
||||
|
||||
This was tested in phantomjs 2.1.1, installed using the node module:
|
||||
|
||||
```bash
|
||||
$ npm install -g phantomjs
|
||||
$ phantomjs phantomjs.js
|
||||
```
|
||||
|
||||
## wkhtmltopdf
|
||||
|
||||
This was tested in wkhtmltopdf 0.12.4, installed using the official binaries:
|
||||
|
||||
```bash
|
||||
$ wkhtmltopdf --javascript-delay 60000 http://localhost:8000/ test.pdf
|
||||
```
|
||||
|
||||
## Puppeteer
|
||||
|
||||
This was tested in puppeteer 0.9.0 and Chromium r494755, installed using node:
|
||||
|
||||
```bash
|
||||
$ npm install puppeteer
|
||||
$ node puppeteer.js
|
||||
```
|
||||
|
||||
Since the main process is node, the read and write features should be placed in
|
||||
the webpage. The `dist` versions are suitable for web pages.
|
||||
|
||||
## SlimerJS
|
||||
|
||||
This was tested in slimerjs 0.10.3 and FF 52.0, installed using `brew` on OSX:
|
||||
|
||||
```bash
|
||||
$ brew install slimerjs
|
||||
$ slimerjs slimerjs.js
|
||||
```
|
||||
|
13
demos/headless/puppeteer.js
Normal file
13
demos/headless/puppeteer.js
Normal file
@ -0,0 +1,13 @@
|
||||
const puppeteer = require('puppeteer');
|
||||
|
||||
(async () => {
|
||||
|
||||
const browser = await puppeteer.launch();
|
||||
const page = await browser.newPage();
|
||||
await page.goto('http://localhost:8000', {waitUntil: 'load'});
|
||||
await page.waitFor(30*1000);
|
||||
await page.pdf({path: 'test.pdf', format: 'A4'});
|
||||
|
||||
browser.close();
|
||||
})();
|
||||
|
14
demos/headless/slimerjs.js
Normal file
14
demos/headless/slimerjs.js
Normal file
@ -0,0 +1,14 @@
|
||||
var fs = require('fs');
|
||||
var xlsx = require('../../dist/xlsx.full.min');
|
||||
var page = require('webpage').create();
|
||||
|
||||
page.open('http://www.google.com', function(status) {
|
||||
|
||||
var data = fs.read('sheetjs.xlsx', {mode: 'rb', charset: 'utf8'});
|
||||
var workbook = xlsx.read(data, {type: 'binary'});
|
||||
data = xlsx.utils.sheet_to_csv(workbook.Sheets['SheetJS']);
|
||||
console.log("Data: " + data);
|
||||
|
||||
phantom.exit();
|
||||
});
|
||||
|
@ -1,8 +0,0 @@
|
||||
# PhantomJS Demo
|
||||
|
||||
This was tested in phantomjs 2.1.1, installed using the node module:
|
||||
|
||||
```bash
|
||||
$ npm install -g phantomjs
|
||||
$ phantomjs phantomjs.js
|
||||
```
|
@ -4,7 +4,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>JS-XLSX Live Demo</title>
|
||||
<title>SheetJS Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
@ -18,26 +18,33 @@
|
||||
#b64data{
|
||||
width:100%;
|
||||
}
|
||||
a { text-decoration: none }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-XLSX Live Demo</b><br />
|
||||
Output Format:
|
||||
<select name="format">
|
||||
<pre>
|
||||
<b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b>
|
||||
(Base64 text works back to IE6; drag and drop works back to IE10)
|
||||
|
||||
<a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a>
|
||||
<a href="https://github.com/SheetJS/js-xlsx/issues">Issues? Something look weird? Click here and report an issue</a>
|
||||
Output Format: <select name="format" onchange="setfmt()">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</option>
|
||||
<option value="html"> HTML</option>
|
||||
</select><br />
|
||||
|
||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
|
||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
|
||||
<input type="file" name="xlfile" id="xlf" /> ... or click here to select a file
|
||||
|
||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
|
||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
|
||||
Advanced Demo Options: <br />
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked><br />
|
||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked><br />
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
|
||||
<b>Advanced Demo Options:</b>
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked>
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
|
||||
</pre>
|
||||
<pre id="out"></pre>
|
||||
<div id="htmlout"></div>
|
||||
<br />
|
||||
<script src="require.js"></script>
|
||||
<script>
|
||||
@ -45,9 +52,7 @@ var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './xlsxworker2.js',
|
||||
norABS: './xlsxworker1.js',
|
||||
noxfer: './xlsxworker.js'
|
||||
worker: './xlsxworker.js'
|
||||
};
|
||||
</script>
|
||||
<script src="requirejs-built.js"></script>
|
||||
|
@ -1,173 +1,153 @@
|
||||
require(["xlsx.full.min"], function(_XLSX) {
|
||||
var X = XLSX;
|
||||
|
||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
|
||||
if(!rABS) {
|
||||
document.getElementsByName("userabs")[0].disabled = true;
|
||||
document.getElementsByName("userabs")[0].checked = false;
|
||||
}
|
||||
var global_wb;
|
||||
|
||||
var wtf_mode = false;
|
||||
var process_wb = (function() {
|
||||
var OUT = document.getElementById('out');
|
||||
var HTMLOUT = document.getElementById('htmlout');
|
||||
|
||||
function fixdata(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
var get_format = (function() {
|
||||
var radios = document.getElementsByName( "format" );
|
||||
return function() {
|
||||
for(var i = 0; i < radios.length; ++i) if(radios[i].checked || radios.length === 1) return radios[i].value;
|
||||
};
|
||||
})();
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
var to_json = function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length) result[sheetName] = roa;
|
||||
});
|
||||
return JSON.stringify(result, 2, 2);
|
||||
};
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
function get_radio_value( radioName ) {
|
||||
var radios = document.getElementsByName( radioName );
|
||||
for( var i = 0; i < radios.length; i++ ) {
|
||||
if( radios[i].checked || radios.length === 1 ) {
|
||||
return radios[i].value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length > 0){
|
||||
result[sheetName] = roa;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
|
||||
function to_formulae(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
|
||||
var tarea = document.getElementById('b64data');
|
||||
function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
|
||||
process_wb(wb);
|
||||
}
|
||||
|
||||
function process_wb(wb) {
|
||||
var output = "";
|
||||
switch(get_radio_value("format")) {
|
||||
case "json":
|
||||
output = JSON.stringify(to_json(wb), 2, 2);
|
||||
break;
|
||||
case "form":
|
||||
output = to_formulae(wb);
|
||||
break;
|
||||
default:
|
||||
output = to_csv(wb);
|
||||
}
|
||||
if(out.innerText === undefined) out.textContent = output;
|
||||
else out.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
}
|
||||
|
||||
var drop = document.getElementById('drop');
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
var files = e.dataTransfer.files;
|
||||
var f = files[0];
|
||||
{
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS);
|
||||
var data = e.target.result;
|
||||
{
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
var to_csv = function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
|
||||
var to_fmla = function to_fmla(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
|
||||
var to_html = function to_html(workbook) {
|
||||
HTMLOUT.innerHTML = "";
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
|
||||
HTMLOUT.innerHTML += htmlstr;
|
||||
});
|
||||
return "";
|
||||
};
|
||||
|
||||
return function process_wb(wb) {
|
||||
global_wb = wb;
|
||||
var output = "";
|
||||
switch(get_format()) {
|
||||
case "form": output = to_fmla(wb); break;
|
||||
case "html": output = to_html(wb); break;
|
||||
case "json": output = to_json(wb); break;
|
||||
default: output = to_csv(wb);
|
||||
}
|
||||
if(OUT.innerText === undefined) OUT.textContent = output;
|
||||
else OUT.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
};
|
||||
})();
|
||||
|
||||
var setfmt = window.setfmt = function setfmt() { if(global_wb) process_wb(global_wb); };
|
||||
|
||||
var b64it = window.b64it = (function() {
|
||||
var tarea = document.getElementById('b64data');
|
||||
return function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type:'base64', WTF:false});
|
||||
process_wb(wb);
|
||||
};
|
||||
})();
|
||||
|
||||
var do_file = (function() {
|
||||
var rABS = typeof FileReader !== "undefined" && (FileReader.prototype||{}).readAsBinaryString;
|
||||
var domrabs = document.getElementsByName("userabs")[0];
|
||||
if(!rABS) domrabs.disabled = !(domrabs.checked = false);
|
||||
|
||||
var use_worker = false && typeof Worker !== 'undefined';
|
||||
var domwork = document.getElementsByName("useworker")[0];
|
||||
if(!use_worker) domwork.disabled = !(domwork.checked = false);
|
||||
|
||||
var xw = function xw(data, cb) {
|
||||
var worker = new Worker(XW.worker);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
};
|
||||
worker.postMessage({d:data,b:rABS?'binary':'array'});
|
||||
};
|
||||
|
||||
return function do_file(files) {
|
||||
rABS = domrabs.checked;
|
||||
use_worker = domwork.checked;
|
||||
var f = files[0];
|
||||
var reader = new FileReader();
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(!rABS) data = new Uint8Array(data);
|
||||
if(use_worker) xw(data, process_wb);
|
||||
else process_wb(X.read(data, {type: rABS ? 'binary' : 'array'}));
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
};
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var drop = document.getElementById('drop');
|
||||
if(!drop.addEventListener) return;
|
||||
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
do_file(e.dataTransfer.files);
|
||||
}
|
||||
}
|
||||
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
|
||||
if(drop.addEventListener) {
|
||||
drop.addEventListener('dragenter', handleDragover, false);
|
||||
drop.addEventListener('dragover', handleDragover, false);
|
||||
drop.addEventListener('drop', handleDrop, false);
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
var xlf = document.getElementById('xlf');
|
||||
function handleFile(e) {
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
var files = e.target.files;
|
||||
var f = files[0];
|
||||
{
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS);
|
||||
var data = e.target.result;
|
||||
{
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
}
|
||||
}
|
||||
|
||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
|
||||
(function() {
|
||||
var xlf = document.getElementById('xlf');
|
||||
if(!xlf.addEventListener) return;
|
||||
function handleFile(e) { do_file(e.target.files); }
|
||||
xlf.addEventListener('change', handleFile, false);
|
||||
})();
|
||||
|
||||
});
|
||||
|
@ -2,225 +2,151 @@
|
||||
/*global XLSX */
|
||||
var X = XLSX;
|
||||
|
||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
|
||||
if(!rABS) {
|
||||
document.getElementsByName("userabs")[0].disabled = true;
|
||||
document.getElementsByName("userabs")[0].checked = false;
|
||||
}
|
||||
var global_wb;
|
||||
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
if(!use_worker) {
|
||||
document.getElementsByName("useworker")[0].disabled = true;
|
||||
document.getElementsByName("useworker")[0].checked = false;
|
||||
}
|
||||
var process_wb = (function() {
|
||||
var OUT = document.getElementById('out');
|
||||
var HTMLOUT = document.getElementById('htmlout');
|
||||
|
||||
var transferable = use_worker;
|
||||
if(!transferable) {
|
||||
document.getElementsByName("xferable")[0].disabled = true;
|
||||
document.getElementsByName("xferable")[0].checked = false;
|
||||
}
|
||||
var get_format = (function() {
|
||||
var radios = document.getElementsByName( "format" );
|
||||
return function() {
|
||||
for(var i = 0; i < radios.length; ++i) if(radios[i].checked || radios.length === 1) return radios[i].value;
|
||||
};
|
||||
})();
|
||||
|
||||
var wtf_mode = false;
|
||||
|
||||
function fixdata(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
function xw_noxfer(data, cb) {
|
||||
var worker = new Worker(XW.noxfer);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
var to_json = function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length) result[sheetName] = roa;
|
||||
});
|
||||
return JSON.stringify(result, 2, 2);
|
||||
};
|
||||
var arr = rABS ? data : btoa(fixdata(data));
|
||||
worker.postMessage({d:arr,b:rABS});
|
||||
}
|
||||
|
||||
function xw_xfer(data, cb) {
|
||||
var worker = new Worker(rABS ? XW.rABS : XW.norABS);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
default: xx=ab2str(e.data).replace(/\n/g,"\\n").replace(/\r/g,"\\r"); console.log("done"); cb(JSON.parse(xx)); break;
|
||||
}
|
||||
var to_csv = function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
if(rABS) {
|
||||
var val = s2ab(data);
|
||||
worker.postMessage(val[1], [val[1]]);
|
||||
} else {
|
||||
worker.postMessage(data, [data]);
|
||||
}
|
||||
}
|
||||
|
||||
function xw(data, cb) {
|
||||
transferable = document.getElementsByName("xferable")[0].checked;
|
||||
if(transferable) xw_xfer(data, cb);
|
||||
else xw_noxfer(data, cb);
|
||||
}
|
||||
var to_fmla = function to_fmla(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
|
||||
function get_radio_value( radioName ) {
|
||||
var radios = document.getElementsByName( radioName );
|
||||
for( var i = 0; i < radios.length; i++ ) {
|
||||
if( radios[i].checked || radios.length === 1 ) {
|
||||
return radios[i].value;
|
||||
var to_html = function to_html(workbook) {
|
||||
HTMLOUT.innerHTML = "";
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
|
||||
HTMLOUT.innerHTML += htmlstr;
|
||||
});
|
||||
return "";
|
||||
};
|
||||
|
||||
return function process_wb(wb) {
|
||||
global_wb = wb;
|
||||
var output = "";
|
||||
switch(get_format()) {
|
||||
case "form": output = to_fmla(wb); break;
|
||||
case "html": output = to_html(wb); break;
|
||||
case "json": output = to_json(wb); break;
|
||||
default: output = to_csv(wb);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(OUT.innerText === undefined) OUT.textContent = output;
|
||||
else OUT.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
};
|
||||
})();
|
||||
|
||||
function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length > 0){
|
||||
result[sheetName] = roa;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
var setfmt = window.setfmt = function setfmt() { if(global_wb) process_wb(global_wb); };
|
||||
|
||||
function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
var b64it = window.b64it = (function() {
|
||||
var tarea = document.getElementById('b64data');
|
||||
return function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type:'base64', WTF:false});
|
||||
process_wb(wb);
|
||||
};
|
||||
})();
|
||||
|
||||
function to_formulae(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
var do_file = (function() {
|
||||
var rABS = typeof FileReader !== "undefined" && (FileReader.prototype||{}).readAsBinaryString;
|
||||
var domrabs = document.getElementsByName("userabs")[0];
|
||||
if(!rABS) domrabs.disabled = !(domrabs.checked = false);
|
||||
|
||||
var tarea = document.getElementById('b64data');
|
||||
function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
|
||||
process_wb(wb);
|
||||
}
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
var domwork = document.getElementsByName("useworker")[0];
|
||||
if(!use_worker) domwork.disabled = !(domwork.checked = false);
|
||||
|
||||
function process_wb(wb) {
|
||||
var output = "";
|
||||
switch(get_radio_value("format")) {
|
||||
case "json":
|
||||
output = JSON.stringify(to_json(wb), 2, 2);
|
||||
break;
|
||||
case "form":
|
||||
output = to_formulae(wb);
|
||||
break;
|
||||
default:
|
||||
output = to_csv(wb);
|
||||
}
|
||||
if(out.innerText === undefined) out.textContent = output;
|
||||
else out.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
}
|
||||
var xw = function xw(data, cb) {
|
||||
var worker = new Worker(XW.worker);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
};
|
||||
worker.postMessage({d:data,b:rABS?'binary':'array'});
|
||||
};
|
||||
|
||||
var drop = document.getElementById('drop');
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.dataTransfer.files;
|
||||
var f = files[0];
|
||||
{
|
||||
return function do_file(files) {
|
||||
rABS = domrabs.checked;
|
||||
use_worker = domwork.checked;
|
||||
var f = files[0];
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
if(!rABS) data = new Uint8Array(data);
|
||||
if(use_worker) xw(data, process_wb);
|
||||
else process_wb(X.read(data, {type: rABS ? 'binary' : 'array'}));
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
};
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var drop = document.getElementById('drop');
|
||||
if(!drop.addEventListener) return;
|
||||
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
do_file(e.dataTransfer.files);
|
||||
}
|
||||
}
|
||||
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
|
||||
if(drop.addEventListener) {
|
||||
drop.addEventListener('dragenter', handleDragover, false);
|
||||
drop.addEventListener('dragover', handleDragover, false);
|
||||
drop.addEventListener('drop', handleDrop, false);
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
var xlf = document.getElementById('xlf');
|
||||
function handleFile(e) {
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.target.files;
|
||||
var f = files[0];
|
||||
{
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
}
|
||||
}
|
||||
|
||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
|
||||
(function() {
|
||||
var xlf = document.getElementById('xlf');
|
||||
if(!xlf.addEventListener) return;
|
||||
function handleFile(e) { do_file(e.target.files); }
|
||||
xlf.addEventListener('change', handleFile, false);
|
||||
})();
|
||||
|
60
demos/rollup/rollup.html
Normal file
60
demos/rollup/rollup.html
Normal file
@ -0,0 +1,60 @@
|
||||
<!DOCTYPE html>
|
||||
<!-- xlsx.js (C) 2013-present SheetJS http://sheetjs.com -->
|
||||
<!-- vim: set ts=2: -->
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>SheetJS Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
-moz-border-radius:5px;
|
||||
-webkit-border-radius:5px;
|
||||
border-radius:5px;
|
||||
padding:25px;
|
||||
text-align:center;
|
||||
font:20pt bold,"Vollkorn";color:#bbb
|
||||
}
|
||||
#b64data{
|
||||
width:100%;
|
||||
}
|
||||
a { text-decoration: none }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<pre>
|
||||
<b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b>
|
||||
(Base64 text works back to IE6; drag and drop works back to IE10)
|
||||
|
||||
<a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a>
|
||||
<a href="https://github.com/SheetJS/js-xlsx/issues">Issues? Something look weird? Click here and report an issue</a>
|
||||
Output Format: <select name="format" onchange="setfmt()">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</option>
|
||||
<option value="html"> HTML</option>
|
||||
</select><br />
|
||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
|
||||
<input type="file" name="xlfile" id="xlf" /> ... or click here to select a file
|
||||
|
||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
|
||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
|
||||
<b>Advanced Demo Options:</b>
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked>
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
|
||||
</pre>
|
||||
<pre id="out"></pre>
|
||||
<div id="htmlout"></div>
|
||||
<br />
|
||||
<script src="rollup.min.js"></script>
|
||||
<script>
|
||||
var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
worker: './xlsxworker.js'
|
||||
};
|
||||
</script>
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
</html>
|
@ -5,7 +5,7 @@ postMessage({t:"ready"});
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b});
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
};
|
||||
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('rollup.min.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('rollup.min.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -2,225 +2,151 @@
|
||||
/*global XLSX */
|
||||
var X = XLSX;
|
||||
|
||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
|
||||
if(!rABS) {
|
||||
document.getElementsByName("userabs")[0].disabled = true;
|
||||
document.getElementsByName("userabs")[0].checked = false;
|
||||
}
|
||||
var global_wb;
|
||||
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
if(!use_worker) {
|
||||
document.getElementsByName("useworker")[0].disabled = true;
|
||||
document.getElementsByName("useworker")[0].checked = false;
|
||||
}
|
||||
var process_wb = (function() {
|
||||
var OUT = document.getElementById('out');
|
||||
var HTMLOUT = document.getElementById('htmlout');
|
||||
|
||||
var transferable = use_worker;
|
||||
if(!transferable) {
|
||||
document.getElementsByName("xferable")[0].disabled = true;
|
||||
document.getElementsByName("xferable")[0].checked = false;
|
||||
}
|
||||
var get_format = (function() {
|
||||
var radios = document.getElementsByName( "format" );
|
||||
return function() {
|
||||
for(var i = 0; i < radios.length; ++i) if(radios[i].checked || radios.length === 1) return radios[i].value;
|
||||
};
|
||||
})();
|
||||
|
||||
var wtf_mode = false;
|
||||
|
||||
function fixdata(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
function xw_noxfer(data, cb) {
|
||||
var worker = new Worker(XW.noxfer);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
var to_json = function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length) result[sheetName] = roa;
|
||||
});
|
||||
return JSON.stringify(result, 2, 2);
|
||||
};
|
||||
var arr = rABS ? data : btoa(fixdata(data));
|
||||
worker.postMessage({d:arr,b:rABS});
|
||||
}
|
||||
|
||||
function xw_xfer(data, cb) {
|
||||
var worker = new Worker(rABS ? XW.rABS : XW.norABS);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
default: xx=ab2str(e.data).replace(/\n/g,"\\n").replace(/\r/g,"\\r"); console.log("done"); cb(JSON.parse(xx)); break;
|
||||
}
|
||||
var to_csv = function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
if(rABS) {
|
||||
var val = s2ab(data);
|
||||
worker.postMessage(val[1], [val[1]]);
|
||||
} else {
|
||||
worker.postMessage(data, [data]);
|
||||
}
|
||||
}
|
||||
|
||||
function xw(data, cb) {
|
||||
transferable = document.getElementsByName("xferable")[0].checked;
|
||||
if(transferable) xw_xfer(data, cb);
|
||||
else xw_noxfer(data, cb);
|
||||
}
|
||||
var to_fmla = function to_fmla(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
|
||||
function get_radio_value( radioName ) {
|
||||
var radios = document.getElementsByName( radioName );
|
||||
for( var i = 0; i < radios.length; i++ ) {
|
||||
if( radios[i].checked || radios.length === 1 ) {
|
||||
return radios[i].value;
|
||||
var to_html = function to_html(workbook) {
|
||||
HTMLOUT.innerHTML = "";
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
|
||||
HTMLOUT.innerHTML += htmlstr;
|
||||
});
|
||||
return "";
|
||||
};
|
||||
|
||||
return function process_wb(wb) {
|
||||
global_wb = wb;
|
||||
var output = "";
|
||||
switch(get_format()) {
|
||||
case "form": output = to_fmla(wb); break;
|
||||
case "html": output = to_html(wb); break;
|
||||
case "json": output = to_json(wb); break;
|
||||
default: output = to_csv(wb);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(OUT.innerText === undefined) OUT.textContent = output;
|
||||
else OUT.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
};
|
||||
})();
|
||||
|
||||
function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length > 0){
|
||||
result[sheetName] = roa;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
var setfmt = window.setfmt = function setfmt() { if(global_wb) process_wb(global_wb); };
|
||||
|
||||
function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
var b64it = window.b64it = (function() {
|
||||
var tarea = document.getElementById('b64data');
|
||||
return function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type:'base64', WTF:false});
|
||||
process_wb(wb);
|
||||
};
|
||||
})();
|
||||
|
||||
function to_formulae(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
var do_file = (function() {
|
||||
var rABS = typeof FileReader !== "undefined" && (FileReader.prototype||{}).readAsBinaryString;
|
||||
var domrabs = document.getElementsByName("userabs")[0];
|
||||
if(!rABS) domrabs.disabled = !(domrabs.checked = false);
|
||||
|
||||
var tarea = document.getElementById('b64data');
|
||||
function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
|
||||
process_wb(wb);
|
||||
}
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
var domwork = document.getElementsByName("useworker")[0];
|
||||
if(!use_worker) domwork.disabled = !(domwork.checked = false);
|
||||
|
||||
function process_wb(wb) {
|
||||
var output = "";
|
||||
switch(get_radio_value("format")) {
|
||||
case "json":
|
||||
output = JSON.stringify(to_json(wb), 2, 2);
|
||||
break;
|
||||
case "form":
|
||||
output = to_formulae(wb);
|
||||
break;
|
||||
default:
|
||||
output = to_csv(wb);
|
||||
}
|
||||
if(out.innerText === undefined) out.textContent = output;
|
||||
else out.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
}
|
||||
var xw = function xw(data, cb) {
|
||||
var worker = new Worker(XW.worker);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
};
|
||||
worker.postMessage({d:data,b:rABS?'binary':'array'});
|
||||
};
|
||||
|
||||
var drop = document.getElementById('drop');
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.dataTransfer.files;
|
||||
var f = files[0];
|
||||
{
|
||||
return function do_file(files) {
|
||||
rABS = domrabs.checked;
|
||||
use_worker = domwork.checked;
|
||||
var f = files[0];
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
if(!rABS) data = new Uint8Array(data);
|
||||
if(use_worker) xw(data, process_wb);
|
||||
else process_wb(X.read(data, {type: rABS ? 'binary' : 'array'}));
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
};
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var drop = document.getElementById('drop');
|
||||
if(!drop.addEventListener) return;
|
||||
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
do_file(e.dataTransfer.files);
|
||||
}
|
||||
}
|
||||
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
|
||||
if(drop.addEventListener) {
|
||||
drop.addEventListener('dragenter', handleDragover, false);
|
||||
drop.addEventListener('dragover', handleDragover, false);
|
||||
drop.addEventListener('drop', handleDrop, false);
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
var xlf = document.getElementById('xlf');
|
||||
function handleFile(e) {
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.target.files;
|
||||
var f = files[0];
|
||||
{
|
||||
var reader = new FileReader();
|
||||
var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
}
|
||||
}
|
||||
|
||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
|
||||
(function() {
|
||||
var xlf = document.getElementById('xlf');
|
||||
if(!xlf.addEventListener) return;
|
||||
function handleFile(e) { do_file(e.target.files); }
|
||||
xlf.addEventListener('change', handleFile, false);
|
||||
})();
|
||||
|
@ -4,7 +4,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>JS-XLSX Live Demo</title>
|
||||
<title>SheetJS Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
@ -18,26 +18,33 @@
|
||||
#b64data{
|
||||
width:100%;
|
||||
}
|
||||
a { text-decoration: none }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-XLSX Live Demo</b><br />
|
||||
Output Format:
|
||||
<select name="format">
|
||||
<pre>
|
||||
<b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b>
|
||||
(Base64 text works back to IE6; drag and drop works back to IE10)
|
||||
|
||||
<a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a>
|
||||
<a href="https://github.com/SheetJS/js-xlsx/issues">Issues? Something look weird? Click here and report an issue</a>
|
||||
Output Format: <select name="format" onchange="setfmt()">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</option>
|
||||
<option value="html"> HTML</option>
|
||||
</select><br />
|
||||
|
||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
|
||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
|
||||
<input type="file" name="xlfile" id="xlf" /> ... or click here to select a file
|
||||
|
||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
|
||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
|
||||
Advanced Demo Options: <br />
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked><br />
|
||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked><br />
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
|
||||
<b>Advanced Demo Options:</b>
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked>
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
|
||||
</pre>
|
||||
<pre id="out"></pre>
|
||||
<div id="htmlout"></div>
|
||||
<br />
|
||||
<script src="core.out.js"></script>
|
||||
<script>
|
||||
@ -45,9 +52,7 @@ var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './coreworker2.js',
|
||||
norABS: './coreworker1.js',
|
||||
noxfer: './coreworker.js'
|
||||
worker: './coreworker.js'
|
||||
};
|
||||
</script>
|
||||
<script src="app.js"></script>
|
||||
|
@ -5,7 +5,7 @@ postMessage({t:"ready"});
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b});
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
};
|
||||
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('core.out.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('core.out.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -4,7 +4,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>JS-XLSX Live Demo</title>
|
||||
<title>SheetJS Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
@ -18,26 +18,33 @@
|
||||
#b64data{
|
||||
width:100%;
|
||||
}
|
||||
a { text-decoration: none }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-XLSX Live Demo</b><br />
|
||||
Output Format:
|
||||
<select name="format">
|
||||
<pre>
|
||||
<b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b>
|
||||
(Base64 text works back to IE6; drag and drop works back to IE10)
|
||||
|
||||
<a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a>
|
||||
<a href="https://github.com/SheetJS/js-xlsx/issues">Issues? Something look weird? Click here and report an issue</a>
|
||||
Output Format: <select name="format" onchange="setfmt()">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</option>
|
||||
<option value="html"> HTML</option>
|
||||
</select><br />
|
||||
|
||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
|
||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
|
||||
<input type="file" name="xlfile" id="xlf" /> ... or click here to select a file
|
||||
|
||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
|
||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
|
||||
Advanced Demo Options: <br />
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked><br />
|
||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked><br />
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
|
||||
<b>Advanced Demo Options:</b>
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked>
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
|
||||
</pre>
|
||||
<pre id="out"></pre>
|
||||
<div id="htmlout"></div>
|
||||
<br />
|
||||
<script src="full.out.js"></script>
|
||||
<script>
|
||||
@ -45,9 +52,7 @@ var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './fullworker2.js',
|
||||
norABS: './fullworker1.js',
|
||||
noxfer: './fullworker.js'
|
||||
worker: './fullworker.js'
|
||||
};
|
||||
</script>
|
||||
<script src="app.js"></script>
|
||||
|
@ -5,7 +5,7 @@ postMessage({t:"ready"});
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b});
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
};
|
||||
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('full.out.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('full.out.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -4,7 +4,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>JS-XLSX Live Demo</title>
|
||||
<title>SheetJS Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
@ -18,26 +18,33 @@
|
||||
#b64data{
|
||||
width:100%;
|
||||
}
|
||||
a { text-decoration: none }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-XLSX Live Demo</b><br />
|
||||
Output Format:
|
||||
<select name="format">
|
||||
<pre>
|
||||
<b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b>
|
||||
(Base64 text works back to IE6; drag and drop works back to IE10)
|
||||
|
||||
<a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a>
|
||||
<a href="https://github.com/SheetJS/js-xlsx/issues">Issues? Something look weird? Click here and report an issue</a>
|
||||
Output Format: <select name="format" onchange="setfmt()">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</option>
|
||||
<option value="html"> HTML</option>
|
||||
</select><br />
|
||||
|
||||
<div id="drop">Drop a spreadsheet file here to see sheet data</div>
|
||||
<p><input type="file" name="xlfile" id="xlf" /> ... or click here to select a file</p>
|
||||
<input type="file" name="xlfile" id="xlf" /> ... or click here to select a file
|
||||
|
||||
<textarea id="b64data">... or paste a base64-encoding here</textarea>
|
||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
|
||||
Advanced Demo Options: <br />
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked><br />
|
||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked><br />
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked><br />
|
||||
<b>Advanced Demo Options:</b>
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked>
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
|
||||
</pre>
|
||||
<pre id="out"></pre>
|
||||
<div id="htmlout"></div>
|
||||
<br />
|
||||
<script src="webpack.min.js"></script>
|
||||
<script>
|
||||
@ -45,9 +52,7 @@ var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './xlsxworker2.js',
|
||||
norABS: './xlsxworker1.js',
|
||||
noxfer: './xlsxworker.js'
|
||||
worker: './xlsxworker.js'
|
||||
};
|
||||
</script>
|
||||
<script src="app.js"></script>
|
||||
|
@ -5,7 +5,7 @@ postMessage({t:"ready"});
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b});
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
};
|
||||
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('webpack.min.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,26 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('webpack.min.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
26
dist/xlsx.core.min.js
vendored
26
dist/xlsx.core.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.core.min.map
vendored
2
dist/xlsx.core.min.map
vendored
File diff suppressed because one or more lines are too long
28
dist/xlsx.full.min.js
vendored
28
dist/xlsx.full.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.full.min.map
vendored
2
dist/xlsx.full.min.map
vendored
File diff suppressed because one or more lines are too long
183
dist/xlsx.js
vendored
183
dist/xlsx.js
vendored
@ -6,7 +6,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.11.2';
|
||||
XLSX.version = '0.11.3';
|
||||
var current_codepage = 1200;
|
||||
/*global cptable:true */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -1537,8 +1537,8 @@ function fuzzydate(s) {
|
||||
if(y < 0 || y > 8099) return n;
|
||||
if((m > 0 || d > 1) && y != 101) return o;
|
||||
if(s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;
|
||||
if(s.match(/[^-0-9:,\/\\]/)) return o;
|
||||
return n;
|
||||
if(s.match(/[^-0-9:,\/\\]/)) return n;
|
||||
return o;
|
||||
}
|
||||
|
||||
var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
|
||||
@ -1546,7 +1546,7 @@ function split_regex(str, re, def) {
|
||||
if(safe_split_regex || typeof re == "string") return str.split(re);
|
||||
var p = str.split(re), o = [p[0]];
|
||||
for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }
|
||||
return o;
|
||||
return o;
|
||||
}
|
||||
function getdatastr(data) {
|
||||
if(!data) return null;
|
||||
@ -1857,8 +1857,8 @@ var __toBuffer, ___toBuffer;
|
||||
__toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };
|
||||
var __utf16le, ___utf16le;
|
||||
__utf16le = ___utf16le = function utf16le_(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(""); };
|
||||
var __hexlify, ___hexlify;
|
||||
__hexlify = ___hexlify = function hexlify_(b,s,l) { return b.slice(s,(s+l)).map(function(x){return (x<16?"0":"") + x.toString(16);}).join(""); };
|
||||
var __hexlify = function(b,s,l) { var ss=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
|
||||
var ___hexlify = __hexlify;
|
||||
var __utf8, ___utf8;
|
||||
__utf8 = ___utf8 = function(b,s,e) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
|
||||
var __lpstr, ___lpstr;
|
||||
@ -5712,6 +5712,16 @@ var PRN = (function() {
|
||||
return arr;
|
||||
}
|
||||
|
||||
function guess_sep(str) {
|
||||
var cnt = [], instr = false, end = 0, cc = 0;
|
||||
for(;end < str.length;++end) {
|
||||
if((cc=str.charCodeAt(end)) == 0x22) instr = !instr;
|
||||
else if(!instr) cnt[cc] = (cnt[cc]||0)+1;
|
||||
}
|
||||
if((cnt[0x2C]||0) >= (cnt[0x09]||0)) return ",";
|
||||
return "\t";
|
||||
}
|
||||
|
||||
function dsv_to_sheet_str(str, opts) {
|
||||
var o = opts || {};
|
||||
var sep = "";
|
||||
@ -5719,9 +5729,8 @@ var PRN = (function() {
|
||||
var ws = o.dense ? ([]) : ({});
|
||||
var range = ({s: {c:0, r:0}, e: {c:0, r:0}});
|
||||
|
||||
/* known sep */
|
||||
if(str.substr(0,4) == "sep=" && str.charCodeAt(5) == 10) { sep = str.charAt(4); str = str.substr(6); }
|
||||
else if(str.substr(0,1024).indexOf("\t") == -1) sep = ","; else sep = "\t";
|
||||
else sep = guess_sep(str.substr(0,1024));
|
||||
var R = 0, C = 0, v = 0;
|
||||
var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0;
|
||||
str = str.replace(/\r\n/mg, "\n");
|
||||
@ -5729,24 +5738,30 @@ var PRN = (function() {
|
||||
function finish_cell() {
|
||||
var s = str.slice(start, end);
|
||||
var cell = ({});
|
||||
if(o.raw) { cell.t = 's'; cell.v = s; }
|
||||
else if(s.charCodeAt(0) == 0x3D) { cell.t = 'n'; cell.f = s.substr(1); }
|
||||
if(s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') s = s.slice(1,-1).replace(/""/g,'"');
|
||||
if(s.length == 0) cell.t = 'z';
|
||||
else if(o.raw) { cell.t = 's'; cell.v = s; }
|
||||
else if(s.charCodeAt(0) == 0x3D) {
|
||||
if(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/""/g,'"'); }
|
||||
else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.substr(1); }
|
||||
else { cell.t = 's'; cell.v = s; } }
|
||||
else if(s == "TRUE") { cell.t = 'b'; cell.v = true; }
|
||||
else if(s == "FALSE") { cell.t = 'b'; cell.v = false; }
|
||||
else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; cell.w = s; cell.v = v; }
|
||||
else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }
|
||||
else if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
|
||||
cell.z = o.dateNF || SSF._table[14];
|
||||
var k = 0;
|
||||
if(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }
|
||||
if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }
|
||||
else { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }
|
||||
cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
|
||||
if(o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
|
||||
if(!o.cellNF) delete cell.z;
|
||||
} else {
|
||||
cell.t = 's';
|
||||
if(s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') s = s.slice(1,-1).replace(/""/g,'"');
|
||||
cell.v = s;
|
||||
}
|
||||
if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; }
|
||||
if(cell.t == 'z'){}
|
||||
else if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; }
|
||||
else ws[encode_cell({c:C,r:R})] = cell;
|
||||
start = end+1;
|
||||
if(range.e.c < C) range.e.c = C;
|
||||
@ -5779,7 +5794,7 @@ var PRN = (function() {
|
||||
case 'array': str = cc2str(d); break;
|
||||
default: throw new Error("Unrecognized type " + opts.type);
|
||||
}
|
||||
if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str);
|
||||
if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));
|
||||
return prn_to_sheet_str(str, opts);
|
||||
}
|
||||
|
||||
@ -8017,7 +8032,7 @@ function update_xfext(xf, xfext) {
|
||||
}
|
||||
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_xml(data, opts) {
|
||||
function parse_cc_xml(data, name, opts) {
|
||||
var d = [];
|
||||
if(!data) return d;
|
||||
var l = 0, i = 1;
|
||||
@ -8035,6 +8050,7 @@ function parse_cc_xml(data, opts) {
|
||||
}
|
||||
|
||||
function write_cc_xml(data, opts) { }
|
||||
|
||||
/* [MS-XLSB] 2.6.4.1 */
|
||||
function parse_BrtCalcChainItem$(data, length) {
|
||||
var out = {};
|
||||
@ -8050,7 +8066,7 @@ function parse_BrtCalcChainItem$(data, length) {
|
||||
}
|
||||
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_bin(data, opts) {
|
||||
function parse_cc_bin(data, name, opts) {
|
||||
var out = [];
|
||||
var pass = false;
|
||||
recordhopper(data, function hopper_cc(val, R_n, RT) {
|
||||
@ -8068,6 +8084,57 @@ function parse_cc_bin(data, opts) {
|
||||
}
|
||||
|
||||
function write_cc_bin(data, opts) { }
|
||||
/* 18.14 Supplementary Workbook Data */
|
||||
function parse_xlink_xml(data, name, _opts) {
|
||||
var opts = _opts || {};
|
||||
//if(opts.WTF) throw "XLSX External Link";
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.1.7.25 External Link */
|
||||
function parse_xlink_bin(data, name, _opts) {
|
||||
if(!data) return data;
|
||||
var opts = _opts || {};
|
||||
|
||||
var pass = false, end = false;
|
||||
|
||||
recordhopper(data, function xlink_parse(val, R_n, RT) {
|
||||
if(end) return;
|
||||
switch(RT) {
|
||||
case 0x0167: /* 'BrtSupTabs' */
|
||||
case 0x016B: /* 'BrtExternTableStart' */
|
||||
case 0x016C: /* 'BrtExternTableEnd' */
|
||||
case 0x016E: /* 'BrtExternRowHdr' */
|
||||
case 0x016F: /* 'BrtExternCellBlank' */
|
||||
case 0x0170: /* 'BrtExternCellReal' */
|
||||
case 0x0171: /* 'BrtExternCellBool' */
|
||||
case 0x0172: /* 'BrtExternCellError' */
|
||||
case 0x0173: /* 'BrtExternCellString' */
|
||||
case 0x01D8: /* 'BrtExternValueMeta' */
|
||||
case 0x0241: /* 'BrtSupNameStart' */
|
||||
case 0x0242: /* 'BrtSupNameValueStart' */
|
||||
case 0x0243: /* 'BrtSupNameValueEnd' */
|
||||
case 0x0244: /* 'BrtSupNameNum' */
|
||||
case 0x0245: /* 'BrtSupNameErr' */
|
||||
case 0x0246: /* 'BrtSupNameSt' */
|
||||
case 0x0247: /* 'BrtSupNameNil' */
|
||||
case 0x0248: /* 'BrtSupNameBool' */
|
||||
case 0x0249: /* 'BrtSupNameFmla' */
|
||||
case 0x024A: /* 'BrtSupNameBits' */
|
||||
case 0x024B: /* 'BrtSupNameEnd' */
|
||||
break;
|
||||
|
||||
case 0x0023: /* 'BrtFRTBegin' */
|
||||
pass = true; break;
|
||||
case 0x0024: /* 'BrtFRTEnd' */
|
||||
pass = false; break;
|
||||
|
||||
default:
|
||||
if((R_n||"").indexOf("Begin") > 0){/* empty */}
|
||||
else if((R_n||"").indexOf("End") > 0){/* empty */}
|
||||
else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
|
||||
}
|
||||
}, opts);
|
||||
}
|
||||
RELS.IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
||||
RELS.DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
|
||||
/* 20.5 DrawingML - SpreadsheetML Drawing */
|
||||
@ -8389,6 +8456,12 @@ function shift_formula_xlsx(f, range, cell) {
|
||||
var delta = {r:c.r - s.r, c:c.c - s.c};
|
||||
return shift_formula_str(f, delta);
|
||||
}
|
||||
|
||||
/* TODO: parse formula */
|
||||
function fuzzyfmla(f) {
|
||||
if(f.length == 1) return false;
|
||||
return true;
|
||||
}
|
||||
/* --- formula references point to MS-XLS --- */
|
||||
/* Small helpers */
|
||||
function parseread(l) { return function(blob, length) { blob.l+=l; return; }; }
|
||||
@ -9213,7 +9286,7 @@ function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = f[1][1]; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
stack.push(sname + "!" + encode_range((r)));
|
||||
stack.push(sname + "!" + encode_range_xls((r), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
stack.push("SUM(" + stack.pop() + ")");
|
||||
@ -12952,8 +13025,13 @@ function parse_cmnt(data, name, opts) {
|
||||
}
|
||||
|
||||
function parse_cc(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data), opts);
|
||||
return parse_cc_xml((data), opts);
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data), name, opts);
|
||||
return parse_cc_xml((data), name, opts);
|
||||
}
|
||||
|
||||
function parse_xlink(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlink_bin((data), name, opts);
|
||||
return parse_xlink_xml((data), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name, opts) {
|
||||
@ -13360,6 +13438,7 @@ Workbook.Names.push(_DefinedName);
|
||||
case 'ContentStatus':
|
||||
case 'Identifier':
|
||||
case 'Language':
|
||||
case 'AppName':
|
||||
if(Rn[0].slice(-2) === "/>") break;
|
||||
else if(Rn[1]==="/") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));
|
||||
else pidx = Rn.index + Rn[0].length;
|
||||
@ -13799,7 +13878,10 @@ Workbook.WBProps.date1904 = true;
|
||||
return out;
|
||||
}
|
||||
|
||||
function arr2str(data) { return data.map(_chr).join(""); }
|
||||
function arr2str(data) {
|
||||
if(Array.isArray(data)) return data.map(_chr).join("");
|
||||
var o = []; for(var i = 0; i < data.length; ++i) o[i] = _chr(data[i]); return o.join("");
|
||||
}
|
||||
|
||||
function parse_xlml(data, opts) {
|
||||
fix_read_opts(opts=opts||{});
|
||||
@ -14200,6 +14282,7 @@ function parse_workbook(blob, options) {
|
||||
if(file_depth > 1) return;
|
||||
if(!cell_valid) return;
|
||||
if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
|
||||
delete line.ixfe; delete line.XF;
|
||||
lastcell = cell;
|
||||
last_cell = encode_cell(cell);
|
||||
if(range.s) {
|
||||
@ -14308,8 +14391,11 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
|
||||
case 'FileSharing': break; //TODO
|
||||
case 'CodePage':
|
||||
/* overrides based on test cases */
|
||||
if(val === 0x5212) val = 1200;
|
||||
else if(val === 0x8001) val = 1252;
|
||||
switch(val) {
|
||||
case 0x5212: val = 1200; break;
|
||||
case 0x8000: val = 10000; break;
|
||||
case 0x8001: val = 1252; break;
|
||||
}
|
||||
opts.codepage = val;
|
||||
set_cp(val);
|
||||
break;
|
||||
@ -14897,6 +14983,12 @@ if(cfb.FullPaths) {
|
||||
Summary = CFB.find(cfb, '!SummaryInformation');
|
||||
WB = CFB.find(cfb, '/Workbook');
|
||||
} else {
|
||||
switch(options.type) {
|
||||
case 'base64': cfb = s2a(Base64.decode(cfb)); break;
|
||||
case 'binary': cfb = s2a(cfb); break;
|
||||
case 'buffer': break;
|
||||
case 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;
|
||||
}
|
||||
prep_blob(cfb, 0);
|
||||
WB = ({content: cfb});
|
||||
}
|
||||
@ -16326,13 +16418,19 @@ var HTML_ = (function() {
|
||||
if(range.e.c < C) range.e.c = C;
|
||||
if(opts.dense) {
|
||||
if(!ws[R]) ws[R] = [];
|
||||
if(opts.raw) ws[R][C] = {t:'s', v:m};
|
||||
if(!m.length){}
|
||||
else if(opts.raw) ws[R][C] = {t:'s', v:m};
|
||||
else if(m === 'TRUE') ws[R][C] = {t:'b', v:true};
|
||||
else if(m === 'FALSE') ws[R][C] = {t:'b', v:false};
|
||||
else if(!isNaN(fuzzynum(m))) ws[R][C] = {t:'n', v:fuzzynum(m)};
|
||||
else ws[R][C] = {t:'s', v:m};
|
||||
} else {
|
||||
var coord = encode_cell({r:R, c:C});
|
||||
/* TODO: value parsing */
|
||||
if(opts.raw) ws[coord] = {t:'s', v:m};
|
||||
if(!m.length){}
|
||||
else if(opts.raw) ws[coord] = {t:'s', v:m};
|
||||
else if(m === 'TRUE') ws[coord] = {t:'b', v:true};
|
||||
else if(m === 'FALSE') ws[coord] = {t:'b', v:false};
|
||||
else if(!isNaN(fuzzynum(m))) ws[coord] = {t:'n', v:fuzzynum(m)};
|
||||
else ws[coord] = {t:'s', v:m};
|
||||
}
|
||||
@ -16415,7 +16513,7 @@ function parse_dom_table(table, _opts) {
|
||||
var row = rows[R];
|
||||
var elts = row.children;
|
||||
for(_C = C = 0; _C < elts.length; ++_C) {
|
||||
var elt = elts[_C], v = elts[_C].innerText || elts[_C].textContent;
|
||||
var elt = elts[_C], v = elts[_C].innerText || elts[_C].textContent || "";
|
||||
for(midx = 0; midx < merges.length; ++midx) {
|
||||
var m = merges[midx];
|
||||
if(m.s.c == C && m.s.r <= R && R <= m.e.r) { C = m.e.c+1; midx = -1; }
|
||||
@ -16424,8 +16522,11 @@ function parse_dom_table(table, _opts) {
|
||||
CS = +elt.getAttribute("colspan") || 1;
|
||||
if((RS = +elt.getAttribute("rowspan"))>0 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});
|
||||
var o = {t:'s', v:v};
|
||||
if(v != null && v.length) {
|
||||
if(opts.raw) o = {t:'s', v:v};
|
||||
if(v != null) {
|
||||
if(v.length == 0) o.t = 'z';
|
||||
else if(opts.raw){}
|
||||
else if(v === 'TRUE') o = {t:'b', v:true};
|
||||
else if(v === 'FALSE') o = {t:'b', v:false};
|
||||
else if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};
|
||||
else if(!isNaN(fuzzydate(v).getDate())) {
|
||||
o = ({t:'d', v:parseDate(v)});
|
||||
@ -17215,6 +17316,8 @@ function safe_parse_sheet(zip, path, relsPath, sheet, sheetRels, sheets, stype,
|
||||
}
|
||||
|
||||
var nodirs = function nodirs(x){return x.slice(-1) != '/';};
|
||||
function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
|
||||
|
||||
function parse_zip(zip, opts) {
|
||||
make_ssf(SSF);
|
||||
opts = opts || {};
|
||||
@ -17247,22 +17350,26 @@ function parse_zip(zip, opts) {
|
||||
var styles = ({});
|
||||
if(!opts.bookSheets && !opts.bookProps) {
|
||||
strs = [];
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\//,'')), dir.sst, opts);
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts);
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\//,'')),dir.style, themes, opts);
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\//,'')), dir.workbooks[0], opts);
|
||||
var externbooks = dir.links.map(function(link) {
|
||||
return parse_xlink(getzipdata(zip, strip_front_slash(link)), link, opts);
|
||||
});
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
|
||||
|
||||
var props = {}, propdata = "";
|
||||
|
||||
if(dir.coreprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.coreprops[0].replace(/^\//,''), true);
|
||||
if(dir.coreprops.length) {
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.coreprops[0]), true);
|
||||
if(propdata) props = parse_core_props(propdata);
|
||||
if(dir.extprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.extprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.extprops[0]), true);
|
||||
if(propdata) parse_ext_props(propdata, props, opts);
|
||||
}
|
||||
}
|
||||
@ -17270,7 +17377,7 @@ function parse_zip(zip, opts) {
|
||||
var custprops = {};
|
||||
if(!opts.bookSheets || opts.bookProps) {
|
||||
if (dir.custprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.custprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
|
||||
if(propdata) custprops = parse_cust_props(propdata, opts);
|
||||
}
|
||||
}
|
||||
@ -17286,7 +17393,7 @@ function parse_zip(zip, opts) {
|
||||
sheets = {};
|
||||
|
||||
var deps = {};
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\//,'')),dir.calcchain,opts);
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);
|
||||
|
||||
var i=0;
|
||||
var sheetRels = ({});
|
||||
@ -17340,7 +17447,7 @@ function parse_zip(zip, opts) {
|
||||
out.files = zip.files;
|
||||
}
|
||||
if(opts.bookVBA) {
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0].replace(/^\//,''),true);
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);
|
||||
else if(dir.defaults && dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);
|
||||
}
|
||||
return out;
|
||||
@ -17577,7 +17684,7 @@ function readSync(data, opts) {
|
||||
if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); }
|
||||
switch((n = firstbyte(d, o))[0]) {
|
||||
case 0xD0: return read_cfb(CFB.read(d, o), o);
|
||||
case 0x09: return parse_xlscfb(s2a(o.type === 'base64' ? Base64.decode(d) : d), o);
|
||||
case 0x09: return parse_xlscfb(d, o);
|
||||
case 0x3C: return parse_xlml(d, o);
|
||||
case 0x49: if(n[1] == 0x44) return read_wb_ID(d, o); break;
|
||||
case 0x54: if(n[1] == 0x41 && n[2] == 0x42 && n[3] == 0x4C) return DIF.to_workbook(d, o); break;
|
||||
|
22
dist/xlsx.min.js
vendored
22
dist/xlsx.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.min.map
vendored
2
dist/xlsx.min.map
vendored
File diff suppressed because one or more lines are too long
@ -40,7 +40,7 @@ The `demos` directory includes sample projects for:
|
||||
|
||||
**JS Platforms and Integrations**
|
||||
- [`Adobe ExtendScript`](demos/extendscript/)
|
||||
- [`phantomjs`](demos/phantomjs/)
|
||||
- [`Headless Browsers`](demos/headless/)
|
||||
- [`canvas-datagrid`](demos/datagrid/)
|
||||
- [`Other JS engines`](demos/altjs/)
|
||||
|
||||
|
@ -50,7 +50,7 @@ tells the library how to parse the data argument:
|
||||
| `type` | expected input |
|
||||
|------------|-----------------------------------------------------------------|
|
||||
| `"base64"` | string: base64 encoding of the file |
|
||||
| `"binary"` | string: binary string (`n`-th byte is `data.charCodeAt(n)`) |
|
||||
| `"binary"` | string: binary string (`n`-th byte is `data.charCodeAt(n)`) |
|
||||
| `"buffer"` | nodejs Buffer |
|
||||
| `"array"` | array: array of 8-bit unsigned int (`n`-th byte is `data[n]`) |
|
||||
| `"file"` | string: filename that will be read and processed (nodejs only) |
|
||||
@ -76,7 +76,7 @@ file but Excel will know how to handle it. This library applies similar logic:
|
||||
| `0xEF` | UTF8 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0xFF` | UTF16 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x00` | Record Stream | Lotus WK\* or Quattro Pro or plaintext |
|
||||
| `0x0A` | Plaintext | RTF or plaintext |
|
||||
| `0x7B` | Plaintext | RTF or plaintext |
|
||||
| `0x0A` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x0D` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x20` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
|
361
index.html
361
index.html
@ -4,7 +4,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>JS-XLSX Live Demo</title>
|
||||
<title>SheetJS Live Demo</title>
|
||||
<style>
|
||||
#drop{
|
||||
border:2px dashed #bbb;
|
||||
@ -41,7 +41,6 @@ Output Format: <select name="format" onchange="setfmt()">
|
||||
<input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br />
|
||||
<b>Advanced Demo Options:</b>
|
||||
Use Web Workers: (when available) <input type="checkbox" name="useworker" checked>
|
||||
Use Transferrables: (when available) <input type="checkbox" name="xferable" checked>
|
||||
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
|
||||
</pre>
|
||||
<pre id="out"></pre>
|
||||
@ -63,249 +62,157 @@ var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './xlsxworker2.js',
|
||||
norABS: './xlsxworker1.js',
|
||||
noxfer: './xlsxworker.js'
|
||||
worker: './xlsxworker.js'
|
||||
};
|
||||
|
||||
var rABS = typeof FileReader !== "undefined" && typeof FileReader.prototype !== "undefined" && typeof FileReader.prototype.readAsBinaryString !== "undefined";
|
||||
if(!rABS) {
|
||||
document.getElementsByName("userabs")[0].disabled = true;
|
||||
document.getElementsByName("userabs")[0].checked = false;
|
||||
}
|
||||
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
if(!use_worker) {
|
||||
document.getElementsByName("useworker")[0].disabled = true;
|
||||
document.getElementsByName("useworker")[0].checked = false;
|
||||
}
|
||||
|
||||
var transferable = use_worker;
|
||||
if(!transferable) {
|
||||
document.getElementsByName("xferable")[0].disabled = true;
|
||||
document.getElementsByName("xferable")[0].checked = false;
|
||||
}
|
||||
|
||||
var wtf_mode = false;
|
||||
|
||||
function fixdata(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
function xw_noxfer(data, cb) {
|
||||
var worker = new Worker(XW.noxfer);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
};
|
||||
var arr = rABS ? data : btoa(fixdata(data));
|
||||
worker.postMessage({d:arr,b:rABS});
|
||||
}
|
||||
|
||||
function xw_xfer(data, cb) {
|
||||
var worker = new Worker(rABS ? XW.rABS : XW.norABS);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
default: var xx=ab2str(e.data).replace(/\n/g,"\\n").replace(/\r/g,"\\r"); console.log("done"); cb(JSON.parse(xx)); break;
|
||||
}
|
||||
};
|
||||
if(rABS) {
|
||||
var val = s2ab(data);
|
||||
worker.postMessage(val[1], [val[1]]);
|
||||
} else {
|
||||
worker.postMessage(data, [data]);
|
||||
}
|
||||
}
|
||||
|
||||
function xw(data, cb) {
|
||||
transferable = document.getElementsByName("xferable")[0].checked;
|
||||
if(transferable) xw_xfer(data, cb);
|
||||
else xw_noxfer(data, cb);
|
||||
}
|
||||
|
||||
function get_radio_value( radioName ) {
|
||||
var radios = document.getElementsByName( radioName );
|
||||
for( var i = 0; i < radios.length; i++ ) {
|
||||
if( radios[i].checked || radios.length === 1 ) {
|
||||
return radios[i].value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length > 0){
|
||||
result[sheetName] = roa;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
|
||||
function to_formulae(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length > 0){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
}
|
||||
|
||||
var HTMLOUT = document.getElementById('htmlout');
|
||||
function to_html(workbook) {
|
||||
HTMLOUT.innerHTML = "";
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
|
||||
HTMLOUT.innerHTML += htmlstr;
|
||||
});
|
||||
}
|
||||
|
||||
var tarea = document.getElementById('b64data');
|
||||
function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type: 'base64',WTF:wtf_mode});
|
||||
process_wb(wb);
|
||||
}
|
||||
window.b64it = b64it;
|
||||
|
||||
var OUT = document.getElementById('out');
|
||||
var global_wb;
|
||||
function process_wb(wb) {
|
||||
global_wb = wb;
|
||||
var output = "";
|
||||
switch(get_radio_value("format")) {
|
||||
case "json":
|
||||
output = JSON.stringify(to_json(wb), 2, 2);
|
||||
break;
|
||||
case "form":
|
||||
output = to_formulae(wb);
|
||||
break;
|
||||
case "html": return to_html(wb);
|
||||
default:
|
||||
output = to_csv(wb);
|
||||
}
|
||||
if(OUT.innerText === undefined) OUT.textContent = output;
|
||||
else OUT.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
}
|
||||
function setfmt() {if(global_wb) process_wb(global_wb); }
|
||||
window.setfmt = setfmt;
|
||||
|
||||
var drop = document.getElementById('drop');
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.dataTransfer.files;
|
||||
var f = files[0];
|
||||
{
|
||||
var process_wb = (function() {
|
||||
var OUT = document.getElementById('out');
|
||||
var HTMLOUT = document.getElementById('htmlout');
|
||||
|
||||
var get_format = (function() {
|
||||
var radios = document.getElementsByName( "format" );
|
||||
return function() {
|
||||
for(var i = 0; i < radios.length; ++i) if(radios[i].checked || radios.length === 1) return radios[i].value;
|
||||
};
|
||||
})();
|
||||
|
||||
var to_json = function to_json(workbook) {
|
||||
var result = {};
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]);
|
||||
if(roa.length) result[sheetName] = roa;
|
||||
});
|
||||
return JSON.stringify(result, 2, 2);
|
||||
};
|
||||
|
||||
var to_csv = function to_csv(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
|
||||
if(csv.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(csv);
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
|
||||
var to_fmla = function to_fmla(workbook) {
|
||||
var result = [];
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
|
||||
if(formulae.length){
|
||||
result.push("SHEET: " + sheetName);
|
||||
result.push("");
|
||||
result.push(formulae.join("\n"));
|
||||
}
|
||||
});
|
||||
return result.join("\n");
|
||||
};
|
||||
|
||||
var to_html = function to_html(workbook) {
|
||||
HTMLOUT.innerHTML = "";
|
||||
workbook.SheetNames.forEach(function(sheetName) {
|
||||
var htmlstr = X.write(workbook, {sheet:sheetName, type:'binary', bookType:'html'});
|
||||
HTMLOUT.innerHTML += htmlstr;
|
||||
});
|
||||
return "";
|
||||
};
|
||||
|
||||
return function process_wb(wb) {
|
||||
global_wb = wb;
|
||||
var output = "";
|
||||
switch(get_format()) {
|
||||
case "form": output = to_fmla(wb); break;
|
||||
case "html": output = to_html(wb); break;
|
||||
case "json": output = to_json(wb); break;
|
||||
default: output = to_csv(wb);
|
||||
}
|
||||
if(OUT.innerText === undefined) OUT.textContent = output;
|
||||
else OUT.innerText = output;
|
||||
if(typeof console !== 'undefined') console.log("output", new Date());
|
||||
};
|
||||
})();
|
||||
|
||||
var setfmt = window.setfmt = function setfmt() { if(global_wb) process_wb(global_wb); };
|
||||
|
||||
var b64it = window.b64it = (function() {
|
||||
var tarea = document.getElementById('b64data');
|
||||
return function b64it() {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date());
|
||||
var wb = X.read(tarea.value, {type:'base64', WTF:false});
|
||||
process_wb(wb);
|
||||
};
|
||||
})();
|
||||
|
||||
var do_file = (function() {
|
||||
var rABS = typeof FileReader !== "undefined" && (FileReader.prototype||{}).readAsBinaryString;
|
||||
var domrabs = document.getElementsByName("userabs")[0];
|
||||
if(!rABS) domrabs.disabled = !(domrabs.checked = false);
|
||||
|
||||
var use_worker = typeof Worker !== 'undefined';
|
||||
var domwork = document.getElementsByName("useworker")[0];
|
||||
if(!use_worker) domwork.disabled = !(domwork.checked = false);
|
||||
|
||||
var xw = function xw(data, cb) {
|
||||
var worker = new Worker(XW.worker);
|
||||
worker.onmessage = function(e) {
|
||||
switch(e.data.t) {
|
||||
case 'ready': break;
|
||||
case 'e': console.error(e.data.d); break;
|
||||
case XW.msg: cb(JSON.parse(e.data.d)); break;
|
||||
}
|
||||
};
|
||||
worker.postMessage({d:data,b:rABS?'binary':'array'});
|
||||
};
|
||||
|
||||
return function do_file(files) {
|
||||
rABS = domrabs.checked;
|
||||
use_worker = domwork.checked;
|
||||
var f = files[0];
|
||||
var reader = new FileReader();
|
||||
//var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
if(!rABS) data = new Uint8Array(data);
|
||||
if(use_worker) xw(data, process_wb);
|
||||
else process_wb(X.read(data, {type: rABS ? 'binary' : 'array'}));
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
};
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var drop = document.getElementById('drop');
|
||||
if(!drop.addEventListener) return;
|
||||
|
||||
function handleDrop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
do_file(e.dataTransfer.files);
|
||||
}
|
||||
}
|
||||
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
function handleDragover(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
}
|
||||
|
||||
if(drop.addEventListener) {
|
||||
drop.addEventListener('dragenter', handleDragover, false);
|
||||
drop.addEventListener('dragover', handleDragover, false);
|
||||
drop.addEventListener('drop', handleDrop, false);
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
var xlf = document.getElementById('xlf');
|
||||
function handleFile(e) {
|
||||
rABS = document.getElementsByName("userabs")[0].checked;
|
||||
use_worker = document.getElementsByName("useworker")[0].checked;
|
||||
var files = e.target.files;
|
||||
var f = files[0];
|
||||
{
|
||||
var reader = new FileReader();
|
||||
//var name = f.name;
|
||||
reader.onload = function(e) {
|
||||
if(typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
|
||||
var data = e.target.result;
|
||||
if(use_worker) {
|
||||
xw(data, process_wb);
|
||||
} else {
|
||||
var wb;
|
||||
if(rABS) {
|
||||
wb = X.read(data, {type: 'binary'});
|
||||
} else {
|
||||
var arr = fixdata(data);
|
||||
wb = X.read(btoa(arr), {type: 'base64'});
|
||||
}
|
||||
process_wb(wb);
|
||||
}
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
}
|
||||
}
|
||||
|
||||
if(xlf.addEventListener) xlf.addEventListener('change', handleFile, false);
|
||||
(function() {
|
||||
var xlf = document.getElementById('xlf');
|
||||
if(!xlf.addEventListener) return;
|
||||
function handleFile(e) { do_file(e.target.files); }
|
||||
xlf.addEventListener('change', handleFile, false);
|
||||
})();
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
|
@ -176,7 +176,7 @@ The `demos` directory includes sample projects for:
|
||||
|
||||
**JS Platforms and Integrations**
|
||||
- [`Adobe ExtendScript`](demos/extendscript/)
|
||||
- [`phantomjs`](demos/phantomjs/)
|
||||
- [`Headless Browsers`](demos/headless/)
|
||||
- [`canvas-datagrid`](demos/datagrid/)
|
||||
- [`Other JS engines`](demos/altjs/)
|
||||
|
||||
@ -1319,7 +1319,7 @@ tells the library how to parse the data argument:
|
||||
| `type` | expected input |
|
||||
|------------|-----------------------------------------------------------------|
|
||||
| `"base64"` | string: base64 encoding of the file |
|
||||
| `"binary"` | string: binary string (`n`-th byte is `data.charCodeAt(n)`) |
|
||||
| `"binary"` | string: binary string (`n`-th byte is `data.charCodeAt(n)`) |
|
||||
| `"buffer"` | nodejs Buffer |
|
||||
| `"array"` | array: array of 8-bit unsigned int (`n`-th byte is `data[n]`) |
|
||||
| `"file"` | string: filename that will be read and processed (nodejs only) |
|
||||
@ -1343,7 +1343,7 @@ file but Excel will know how to handle it. This library applies similar logic:
|
||||
| `0xEF` | UTF8 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0xFF` | UTF16 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x00` | Record Stream | Lotus WK\* or Quattro Pro or plaintext |
|
||||
| `0x0A` | Plaintext | RTF or plaintext |
|
||||
| `0x7B` | Plaintext | RTF or plaintext |
|
||||
| `0x0A` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x0D` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
| `0x20` | Plaintext | SpreadsheetML / Flat ODS / UOS1 / HTML / plaintext |
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.11.2",
|
||||
"version": "0.11.3",
|
||||
"author": "sheetjs",
|
||||
"description": "Excel (XLSB/XLSX/XLS/XML) ODS and other spreadsheet format (CSV/DIF/DBF/SYLK) parser and writer",
|
||||
"keywords": [ "excel", "xls", "xlsx", "xlsb", "xlsm", "ods", "csv", "dbf", "dif", "sylk", "office", "spreadsheet" ],
|
||||
|
@ -46,13 +46,13 @@
|
||||
<script src="mocha.js"></script>
|
||||
<script>
|
||||
window.initMochaPhantomJS && window.initMochaPhantomJS();
|
||||
mocha.setup({ui:'bdd', timeout:10000});
|
||||
mocha.setup({ui:'bdd', timeout:15000});
|
||||
</script>
|
||||
<script src="core.js"></script>
|
||||
<script>
|
||||
if(typeof mochaSaucePlease !== "undefined") mochaSaucePlease();
|
||||
else if(window.mochaPhantomJS) mochaPhantomJS.run();
|
||||
else mocha.run();
|
||||
else typeof mocha_sauce !== 'undefined' ? mocha_sauce() : mocha.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
59
tests/sauce.html
Normal file
59
tests/sauce.html
Normal file
@ -0,0 +1,59 @@
|
||||
<!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="fs_.js"></script>
|
||||
<script src="fixtures.js"></script>
|
||||
<script src="xlsx.full.min.js"></script>
|
||||
<!--[if IE]>
|
||||
<script type="text/javascript" src="xhr-hack.js"></script>
|
||||
<![endif]-->
|
||||
<div id="mocha"></div>
|
||||
<script src="sauce-client.js"></script>
|
||||
<script src="mocha.js"></script>
|
||||
<script>
|
||||
window.initMochaPhantomJS && window.initMochaPhantomJS();
|
||||
mocha.setup({ui:'bdd', timeout:15000});
|
||||
</script>
|
||||
<script src="core.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>
|
125
xlsx.flow.js
125
xlsx.flow.js
@ -6,7 +6,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.11.2';
|
||||
XLSX.version = '0.11.3';
|
||||
var current_codepage = 1200;
|
||||
/*:: declare var cptable:any; */
|
||||
/*global cptable:true */
|
||||
@ -1921,8 +1921,8 @@ var __toBuffer, ___toBuffer;
|
||||
__toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };
|
||||
var __utf16le, ___utf16le;
|
||||
__utf16le = ___utf16le = function utf16le_(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(""); };
|
||||
var __hexlify, ___hexlify;
|
||||
__hexlify = ___hexlify = function hexlify_(b,s,l) { return b.slice(s,(s+l)).map(function(x){return (x<16?"0":"") + x.toString(16);}).join(""); };
|
||||
var __hexlify = function(b/*:RawBytes|CFBlob*/,s/*:number*/,l/*:number*/)/*:string*/ { var ss/*:Array<string>*/=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
|
||||
var ___hexlify = __hexlify;
|
||||
var __utf8, ___utf8;
|
||||
__utf8 = ___utf8 = function(b,s,e) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
|
||||
var __lpstr, ___lpstr;
|
||||
@ -1961,11 +1961,11 @@ if(typeof cptable !== 'undefined') {
|
||||
__8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : "";};
|
||||
}
|
||||
|
||||
var __readUInt8 = function(b, idx) { return b[idx]; };
|
||||
var __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };
|
||||
var __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };
|
||||
var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };
|
||||
var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
|
||||
var __readUInt8 = function(b, idx/*:number*/)/*:number*/ { return b[idx]; };
|
||||
var __readUInt16LE = function(b, idx/*:number*/)/*:number*/ { return b[idx+1]*(1<<8)+b[idx]; };
|
||||
var __readInt16LE = function(b, idx/*:number*/)/*:number*/ { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };
|
||||
var __readUInt32LE = function(b, idx/*:number*/)/*:number*/ { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };
|
||||
var __readInt32LE = function(b, idx/*:number*/)/*:number*/ { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
|
||||
|
||||
var ___unhexlify = function(s) { return s.match(/../g).map(function(x) { return parseInt(x,16);}); };
|
||||
var __unhexlify = typeof Buffer !== "undefined" ? function(s) { return Buffer.isBuffer(s) ? new Buffer(s, 'hex') : ___unhexlify(s); } : ___unhexlify;
|
||||
@ -5792,8 +5792,8 @@ var PRN = (function() {
|
||||
if((cc=str.charCodeAt(end)) == 0x22) instr = !instr;
|
||||
else if(!instr) cnt[cc] = (cnt[cc]||0)+1;
|
||||
}
|
||||
if(cnt[0x2C] > cnt[0x09]) return ",";
|
||||
return ",";
|
||||
if((cnt[0x2C]||0) >= (cnt[0x09]||0)) return ",";
|
||||
return "\t";
|
||||
}
|
||||
|
||||
function dsv_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ {
|
||||
@ -8109,7 +8109,7 @@ function update_xfext(xf, xfext) {
|
||||
}
|
||||
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_xml(data, opts) {
|
||||
function parse_cc_xml(data, name, opts) {
|
||||
var d = [];
|
||||
if(!data) return d;
|
||||
var l = 0, i = 1;
|
||||
@ -8127,6 +8127,7 @@ function parse_cc_xml(data, opts) {
|
||||
}
|
||||
|
||||
function write_cc_xml(data, opts) { }
|
||||
|
||||
/* [MS-XLSB] 2.6.4.1 */
|
||||
function parse_BrtCalcChainItem$(data, length) {
|
||||
var out = {};
|
||||
@ -8142,7 +8143,7 @@ function parse_BrtCalcChainItem$(data, length) {
|
||||
}
|
||||
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_bin(data, opts) {
|
||||
function parse_cc_bin(data, name, opts) {
|
||||
var out = [];
|
||||
var pass = false;
|
||||
recordhopper(data, function hopper_cc(val, R_n, RT) {
|
||||
@ -8160,6 +8161,57 @@ function parse_cc_bin(data, opts) {
|
||||
}
|
||||
|
||||
function write_cc_bin(data, opts) { }
|
||||
/* 18.14 Supplementary Workbook Data */
|
||||
function parse_xlink_xml(data, name/*:string*/, _opts) {
|
||||
var opts = _opts || {};
|
||||
//if(opts.WTF) throw "XLSX External Link";
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.1.7.25 External Link */
|
||||
function parse_xlink_bin(data, name/*:string*/, _opts) {
|
||||
if(!data) return data;
|
||||
var opts = _opts || {};
|
||||
|
||||
var pass = false, end = false;
|
||||
|
||||
recordhopper(data, function xlink_parse(val, R_n, RT) {
|
||||
if(end) return;
|
||||
switch(RT) {
|
||||
case 0x0167: /* 'BrtSupTabs' */
|
||||
case 0x016B: /* 'BrtExternTableStart' */
|
||||
case 0x016C: /* 'BrtExternTableEnd' */
|
||||
case 0x016E: /* 'BrtExternRowHdr' */
|
||||
case 0x016F: /* 'BrtExternCellBlank' */
|
||||
case 0x0170: /* 'BrtExternCellReal' */
|
||||
case 0x0171: /* 'BrtExternCellBool' */
|
||||
case 0x0172: /* 'BrtExternCellError' */
|
||||
case 0x0173: /* 'BrtExternCellString' */
|
||||
case 0x01D8: /* 'BrtExternValueMeta' */
|
||||
case 0x0241: /* 'BrtSupNameStart' */
|
||||
case 0x0242: /* 'BrtSupNameValueStart' */
|
||||
case 0x0243: /* 'BrtSupNameValueEnd' */
|
||||
case 0x0244: /* 'BrtSupNameNum' */
|
||||
case 0x0245: /* 'BrtSupNameErr' */
|
||||
case 0x0246: /* 'BrtSupNameSt' */
|
||||
case 0x0247: /* 'BrtSupNameNil' */
|
||||
case 0x0248: /* 'BrtSupNameBool' */
|
||||
case 0x0249: /* 'BrtSupNameFmla' */
|
||||
case 0x024A: /* 'BrtSupNameBits' */
|
||||
case 0x024B: /* 'BrtSupNameEnd' */
|
||||
break;
|
||||
|
||||
case 0x0023: /* 'BrtFRTBegin' */
|
||||
pass = true; break;
|
||||
case 0x0024: /* 'BrtFRTEnd' */
|
||||
pass = false; break;
|
||||
|
||||
default:
|
||||
if((R_n||"").indexOf("Begin") > 0){/* empty */}
|
||||
else if((R_n||"").indexOf("End") > 0){/* empty */}
|
||||
else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
|
||||
}
|
||||
}, opts);
|
||||
}
|
||||
RELS.IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
||||
RELS.DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
|
||||
/* 20.5 DrawingML - SpreadsheetML Drawing */
|
||||
@ -9312,7 +9364,7 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
stack.push(sname + "!" + encode_range((r/*:any*/)));
|
||||
stack.push(sname + "!" + encode_range_xls((r/*:any*/), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
stack.push("SUM(" + stack.pop() + ")");
|
||||
@ -13053,8 +13105,13 @@ function parse_cmnt(data, name/*:string*/, opts) {
|
||||
}
|
||||
|
||||
function parse_cc(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data/*:any*/), opts);
|
||||
return parse_cc_xml((data/*:any*/), opts);
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data/*:any*/), name, opts);
|
||||
return parse_cc_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function parse_xlink(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlink_bin((data/*:any*/), name, opts);
|
||||
return parse_xlink_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name/*:string*/, opts) {
|
||||
@ -13464,6 +13521,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
|
||||
case 'ContentStatus':
|
||||
case 'Identifier':
|
||||
case 'Language':
|
||||
case 'AppName':
|
||||
if(Rn[0].slice(-2) === "/>") break;
|
||||
else if(Rn[1]==="/") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));
|
||||
else pidx = Rn.index + Rn[0].length;
|
||||
@ -13904,7 +13962,10 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
|
||||
return out;
|
||||
}
|
||||
|
||||
function arr2str(data/*:any*/)/*:string*/ { return data.map(_chr).join(""); }
|
||||
function arr2str(data/*:any*/)/*:string*/ {
|
||||
if(Array.isArray(data)) return data.map(_chr).join("");
|
||||
var o = []; for(var i = 0; i < data.length; ++i) o[i] = _chr(data[i]); return o.join("");
|
||||
}
|
||||
|
||||
function parse_xlml(data/*:RawBytes|string*/, opts)/*:Workbook*/ {
|
||||
fix_read_opts(opts=opts||{});
|
||||
@ -15008,6 +15069,12 @@ if(cfb.FullPaths) {
|
||||
Summary = CFB.find(cfb, '!SummaryInformation');
|
||||
WB = CFB.find(cfb, '/Workbook');
|
||||
} else {
|
||||
switch(options.type) {
|
||||
case 'base64': cfb = s2a(Base64.decode(cfb)); break;
|
||||
case 'binary': cfb = s2a(cfb); break;
|
||||
case 'buffer': break;
|
||||
case 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;
|
||||
}
|
||||
prep_blob(cfb, 0);
|
||||
WB = ({content: cfb}/*:any*/);
|
||||
}
|
||||
@ -17336,6 +17403,8 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, shee
|
||||
}
|
||||
|
||||
var nodirs = function nodirs(x/*:string*/)/*:boolean*/{return x.slice(-1) != '/';};
|
||||
function strip_front_slash(x/*:string*/)/*:string*/ { return x.charAt(0) == '/' ? x.slice(1) : x; }
|
||||
|
||||
function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
make_ssf(SSF);
|
||||
opts = opts || {};
|
||||
@ -17368,22 +17437,26 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
var styles = ({}/*:any*/);
|
||||
if(!opts.bookSheets && !opts.bookProps) {
|
||||
strs = [];
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\//,'')), dir.sst, opts);
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts);
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\//,'')),dir.style, themes, opts);
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\//,'')), dir.workbooks[0], opts);
|
||||
var externbooks = dir.links.map(function(link) {
|
||||
return parse_xlink(getzipdata(zip, strip_front_slash(link)), link, opts);
|
||||
});
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
|
||||
|
||||
var props = {}, propdata = "";
|
||||
|
||||
if(dir.coreprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.coreprops[0].replace(/^\//,''), true);
|
||||
if(dir.coreprops.length) {
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.coreprops[0]), true);
|
||||
if(propdata) props = parse_core_props(propdata);
|
||||
if(dir.extprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.extprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.extprops[0]), true);
|
||||
if(propdata) parse_ext_props(propdata, props, opts);
|
||||
}
|
||||
}
|
||||
@ -17391,7 +17464,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
var custprops = {};
|
||||
if(!opts.bookSheets || opts.bookProps) {
|
||||
if (dir.custprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.custprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
|
||||
if(propdata) custprops = parse_cust_props(propdata, opts);
|
||||
}
|
||||
}
|
||||
@ -17407,7 +17480,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
sheets = {};
|
||||
|
||||
var deps = {};
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\//,'')),dir.calcchain,opts);
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);
|
||||
|
||||
var i=0;
|
||||
var sheetRels = ({}/*:any*/);
|
||||
@ -17461,7 +17534,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
out.files = zip.files;
|
||||
}
|
||||
if(opts.bookVBA) {
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0].replace(/^\//,''),true);
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);
|
||||
else if(dir.defaults && dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);
|
||||
}
|
||||
return out;
|
||||
@ -17701,7 +17774,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); }
|
||||
switch((n = firstbyte(d, o))[0]) {
|
||||
case 0xD0: return read_cfb(CFB.read(d, o), o);
|
||||
case 0x09: return parse_xlscfb(s2a(o.type === 'base64' ? Base64.decode(d) : d), o);
|
||||
case 0x09: return parse_xlscfb(d, o);
|
||||
case 0x3C: return parse_xlml(d, o);
|
||||
case 0x49: if(n[1] == 0x44) return read_wb_ID(d, o); break;
|
||||
case 0x54: if(n[1] == 0x41 && n[2] == 0x42 && n[3] == 0x4C) return DIF.to_workbook(d, o); break;
|
||||
|
115
xlsx.js
115
xlsx.js
@ -6,7 +6,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.11.2';
|
||||
XLSX.version = '0.11.3';
|
||||
var current_codepage = 1200;
|
||||
/*global cptable:true */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -1857,8 +1857,8 @@ var __toBuffer, ___toBuffer;
|
||||
__toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };
|
||||
var __utf16le, ___utf16le;
|
||||
__utf16le = ___utf16le = function utf16le_(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(""); };
|
||||
var __hexlify, ___hexlify;
|
||||
__hexlify = ___hexlify = function hexlify_(b,s,l) { return b.slice(s,(s+l)).map(function(x){return (x<16?"0":"") + x.toString(16);}).join(""); };
|
||||
var __hexlify = function(b,s,l) { var ss=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
|
||||
var ___hexlify = __hexlify;
|
||||
var __utf8, ___utf8;
|
||||
__utf8 = ___utf8 = function(b,s,e) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
|
||||
var __lpstr, ___lpstr;
|
||||
@ -5718,8 +5718,8 @@ var PRN = (function() {
|
||||
if((cc=str.charCodeAt(end)) == 0x22) instr = !instr;
|
||||
else if(!instr) cnt[cc] = (cnt[cc]||0)+1;
|
||||
}
|
||||
if(cnt[0x2C] > cnt[0x09]) return ",";
|
||||
return ",";
|
||||
if((cnt[0x2C]||0) >= (cnt[0x09]||0)) return ",";
|
||||
return "\t";
|
||||
}
|
||||
|
||||
function dsv_to_sheet_str(str, opts) {
|
||||
@ -8032,7 +8032,7 @@ function update_xfext(xf, xfext) {
|
||||
}
|
||||
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_xml(data, opts) {
|
||||
function parse_cc_xml(data, name, opts) {
|
||||
var d = [];
|
||||
if(!data) return d;
|
||||
var l = 0, i = 1;
|
||||
@ -8050,6 +8050,7 @@ function parse_cc_xml(data, opts) {
|
||||
}
|
||||
|
||||
function write_cc_xml(data, opts) { }
|
||||
|
||||
/* [MS-XLSB] 2.6.4.1 */
|
||||
function parse_BrtCalcChainItem$(data, length) {
|
||||
var out = {};
|
||||
@ -8065,7 +8066,7 @@ function parse_BrtCalcChainItem$(data, length) {
|
||||
}
|
||||
|
||||
/* 18.6 Calculation Chain */
|
||||
function parse_cc_bin(data, opts) {
|
||||
function parse_cc_bin(data, name, opts) {
|
||||
var out = [];
|
||||
var pass = false;
|
||||
recordhopper(data, function hopper_cc(val, R_n, RT) {
|
||||
@ -8083,6 +8084,57 @@ function parse_cc_bin(data, opts) {
|
||||
}
|
||||
|
||||
function write_cc_bin(data, opts) { }
|
||||
/* 18.14 Supplementary Workbook Data */
|
||||
function parse_xlink_xml(data, name, _opts) {
|
||||
var opts = _opts || {};
|
||||
//if(opts.WTF) throw "XLSX External Link";
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.1.7.25 External Link */
|
||||
function parse_xlink_bin(data, name, _opts) {
|
||||
if(!data) return data;
|
||||
var opts = _opts || {};
|
||||
|
||||
var pass = false, end = false;
|
||||
|
||||
recordhopper(data, function xlink_parse(val, R_n, RT) {
|
||||
if(end) return;
|
||||
switch(RT) {
|
||||
case 0x0167: /* 'BrtSupTabs' */
|
||||
case 0x016B: /* 'BrtExternTableStart' */
|
||||
case 0x016C: /* 'BrtExternTableEnd' */
|
||||
case 0x016E: /* 'BrtExternRowHdr' */
|
||||
case 0x016F: /* 'BrtExternCellBlank' */
|
||||
case 0x0170: /* 'BrtExternCellReal' */
|
||||
case 0x0171: /* 'BrtExternCellBool' */
|
||||
case 0x0172: /* 'BrtExternCellError' */
|
||||
case 0x0173: /* 'BrtExternCellString' */
|
||||
case 0x01D8: /* 'BrtExternValueMeta' */
|
||||
case 0x0241: /* 'BrtSupNameStart' */
|
||||
case 0x0242: /* 'BrtSupNameValueStart' */
|
||||
case 0x0243: /* 'BrtSupNameValueEnd' */
|
||||
case 0x0244: /* 'BrtSupNameNum' */
|
||||
case 0x0245: /* 'BrtSupNameErr' */
|
||||
case 0x0246: /* 'BrtSupNameSt' */
|
||||
case 0x0247: /* 'BrtSupNameNil' */
|
||||
case 0x0248: /* 'BrtSupNameBool' */
|
||||
case 0x0249: /* 'BrtSupNameFmla' */
|
||||
case 0x024A: /* 'BrtSupNameBits' */
|
||||
case 0x024B: /* 'BrtSupNameEnd' */
|
||||
break;
|
||||
|
||||
case 0x0023: /* 'BrtFRTBegin' */
|
||||
pass = true; break;
|
||||
case 0x0024: /* 'BrtFRTEnd' */
|
||||
pass = false; break;
|
||||
|
||||
default:
|
||||
if((R_n||"").indexOf("Begin") > 0){/* empty */}
|
||||
else if((R_n||"").indexOf("End") > 0){/* empty */}
|
||||
else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
|
||||
}
|
||||
}, opts);
|
||||
}
|
||||
RELS.IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
||||
RELS.DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
|
||||
/* 20.5 DrawingML - SpreadsheetML Drawing */
|
||||
@ -9234,7 +9286,7 @@ function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
|
||||
case 'PtgArea3d': /* 2.5.198.28 TODO */
|
||||
type = f[1][0]; ixti = f[1][1]; r = f[1][2];
|
||||
sname = (supbooks && supbooks[1] ? supbooks[1][ixti+1] : "**MISSING**");
|
||||
stack.push(sname + "!" + encode_range((r)));
|
||||
stack.push(sname + "!" + encode_range_xls((r), opts));
|
||||
break;
|
||||
case 'PtgAttrSum': /* 2.5.198.41 */
|
||||
stack.push("SUM(" + stack.pop() + ")");
|
||||
@ -12973,8 +13025,13 @@ function parse_cmnt(data, name, opts) {
|
||||
}
|
||||
|
||||
function parse_cc(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data), opts);
|
||||
return parse_cc_xml((data), opts);
|
||||
if(name.slice(-4)===".bin") return parse_cc_bin((data), name, opts);
|
||||
return parse_cc_xml((data), name, opts);
|
||||
}
|
||||
|
||||
function parse_xlink(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlink_bin((data), name, opts);
|
||||
return parse_xlink_xml((data), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name, opts) {
|
||||
@ -13381,6 +13438,7 @@ Workbook.Names.push(_DefinedName);
|
||||
case 'ContentStatus':
|
||||
case 'Identifier':
|
||||
case 'Language':
|
||||
case 'AppName':
|
||||
if(Rn[0].slice(-2) === "/>") break;
|
||||
else if(Rn[1]==="/") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));
|
||||
else pidx = Rn.index + Rn[0].length;
|
||||
@ -13820,7 +13878,10 @@ Workbook.WBProps.date1904 = true;
|
||||
return out;
|
||||
}
|
||||
|
||||
function arr2str(data) { return data.map(_chr).join(""); }
|
||||
function arr2str(data) {
|
||||
if(Array.isArray(data)) return data.map(_chr).join("");
|
||||
var o = []; for(var i = 0; i < data.length; ++i) o[i] = _chr(data[i]); return o.join("");
|
||||
}
|
||||
|
||||
function parse_xlml(data, opts) {
|
||||
fix_read_opts(opts=opts||{});
|
||||
@ -14922,6 +14983,12 @@ if(cfb.FullPaths) {
|
||||
Summary = CFB.find(cfb, '!SummaryInformation');
|
||||
WB = CFB.find(cfb, '/Workbook');
|
||||
} else {
|
||||
switch(options.type) {
|
||||
case 'base64': cfb = s2a(Base64.decode(cfb)); break;
|
||||
case 'binary': cfb = s2a(cfb); break;
|
||||
case 'buffer': break;
|
||||
case 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;
|
||||
}
|
||||
prep_blob(cfb, 0);
|
||||
WB = ({content: cfb});
|
||||
}
|
||||
@ -17249,6 +17316,8 @@ function safe_parse_sheet(zip, path, relsPath, sheet, sheetRels, sheets, stype,
|
||||
}
|
||||
|
||||
var nodirs = function nodirs(x){return x.slice(-1) != '/';};
|
||||
function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
|
||||
|
||||
function parse_zip(zip, opts) {
|
||||
make_ssf(SSF);
|
||||
opts = opts || {};
|
||||
@ -17281,22 +17350,26 @@ function parse_zip(zip, opts) {
|
||||
var styles = ({});
|
||||
if(!opts.bookSheets && !opts.bookProps) {
|
||||
strs = [];
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\//,'')), dir.sst, opts);
|
||||
if(dir.sst) strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts);
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\//,'')),dir.style, themes, opts);
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\//,'')), dir.workbooks[0], opts);
|
||||
var externbooks = dir.links.map(function(link) {
|
||||
return parse_xlink(getzipdata(zip, strip_front_slash(link)), link, opts);
|
||||
});
|
||||
|
||||
var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
|
||||
|
||||
var props = {}, propdata = "";
|
||||
|
||||
if(dir.coreprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.coreprops[0].replace(/^\//,''), true);
|
||||
if(dir.coreprops.length) {
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.coreprops[0]), true);
|
||||
if(propdata) props = parse_core_props(propdata);
|
||||
if(dir.extprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.extprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.extprops[0]), true);
|
||||
if(propdata) parse_ext_props(propdata, props, opts);
|
||||
}
|
||||
}
|
||||
@ -17304,7 +17377,7 @@ function parse_zip(zip, opts) {
|
||||
var custprops = {};
|
||||
if(!opts.bookSheets || opts.bookProps) {
|
||||
if (dir.custprops.length !== 0) {
|
||||
propdata = getzipstr(zip, dir.custprops[0].replace(/^\//,''), true);
|
||||
propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
|
||||
if(propdata) custprops = parse_cust_props(propdata, opts);
|
||||
}
|
||||
}
|
||||
@ -17320,7 +17393,7 @@ function parse_zip(zip, opts) {
|
||||
sheets = {};
|
||||
|
||||
var deps = {};
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\//,'')),dir.calcchain,opts);
|
||||
if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);
|
||||
|
||||
var i=0;
|
||||
var sheetRels = ({});
|
||||
@ -17374,7 +17447,7 @@ function parse_zip(zip, opts) {
|
||||
out.files = zip.files;
|
||||
}
|
||||
if(opts.bookVBA) {
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0].replace(/^\//,''),true);
|
||||
if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);
|
||||
else if(dir.defaults && dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);
|
||||
}
|
||||
return out;
|
||||
@ -17611,7 +17684,7 @@ function readSync(data, opts) {
|
||||
if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); }
|
||||
switch((n = firstbyte(d, o))[0]) {
|
||||
case 0xD0: return read_cfb(CFB.read(d, o), o);
|
||||
case 0x09: return parse_xlscfb(s2a(o.type === 'base64' ? Base64.decode(d) : d), o);
|
||||
case 0x09: return parse_xlscfb(d, o);
|
||||
case 0x3C: return parse_xlml(d, o);
|
||||
case 0x49: if(n[1] == 0x44) return read_wb_ID(d, o); break;
|
||||
case 0x54: if(n[1] == 0x41 && n[2] == 0x42 && n[3] == 0x4C) return DIF.to_workbook(d, o); break;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* uncomment the next line for encoding support */
|
||||
/*:: declare var XLSX: XLSXModule; */
|
||||
/*:: declare var self: DedicatedWorkerGlobalScope; */
|
||||
/* uncomment the next line for encoding support */
|
||||
importScripts('dist/cpexcel.js');
|
||||
importScripts('jszip.js');
|
||||
importScripts('xlsx.js');
|
||||
@ -10,8 +10,7 @@ importScripts('xlsx.js');
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b});
|
||||
/*::self.*/postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
} catch(e) { /*::self.*/postMessage({t:"e",d:e.stack||e}); }
|
||||
/*::self.*/
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
};
|
||||
|
@ -8,7 +8,7 @@ postMessage({t:"ready"});
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b ? 'binary' : 'base64'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
v = XLSX.read(oEvent.data.d, {type: oEvent.data.b});
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
|
||||
};
|
||||
|
@ -1,32 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* uncomment the next line for encoding support */
|
||||
/*:: declare var XLSX: XLSXModule; */
|
||||
/*:: declare var self: DedicatedWorkerGlobalScope; */
|
||||
importScripts('dist/cpexcel.js');
|
||||
importScripts('jszip.js');
|
||||
importScripts('xlsx.js');
|
||||
/*::self.*/postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,/*::(*/new Uint8Array(data.slice(l*w,l*w+w))/*:: :any)*/);
|
||||
o+=String.fromCharCode.apply(null, /*::(*/new Uint8Array(data.slice(l*w))/*:: :any)*/);
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s/*:string*/) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { /*::self.*/postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
/*::self.*/
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,29 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* uncomment the next line for encoding support */
|
||||
importScripts('dist/cpexcel.js');
|
||||
importScripts('jszip.js');
|
||||
importScripts('xlsx.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,32 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* uncomment the next line for encoding support */
|
||||
/*:: declare var XLSX: XLSXModule; */
|
||||
/*:: declare var self: DedicatedWorkerGlobalScope; */
|
||||
importScripts('dist/cpexcel.js');
|
||||
importScripts('jszip.js');
|
||||
importScripts('xlsx.js');
|
||||
/*::self.*/postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,/*::(*/new Uint16Array(data.slice(l*w,l*w+w))/*:: :any)*/);
|
||||
o+=String.fromCharCode.apply(null, /*::(*/new Uint16Array(data.slice(l*w))/*:: :any)*/);
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s/*:string*/) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { /*::self.*/postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
/*::self.*/
|
||||
postMessage(r, [r]);
|
||||
};
|
@ -1,29 +0,0 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* uncomment the next line for encoding support */
|
||||
importScripts('dist/cpexcel.js');
|
||||
importScripts('jszip.js');
|
||||
importScripts('xlsx.js');
|
||||
postMessage({t:"ready"});
|
||||
|
||||
function ab2str(data) {
|
||||
var o = "", l = 0, w = 10240;
|
||||
for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint16Array(data.slice(l*w,l*w+w)));
|
||||
o+=String.fromCharCode.apply(null, new Uint16Array(data.slice(l*w)));
|
||||
return o;
|
||||
}
|
||||
|
||||
function s2ab(s) {
|
||||
var b = new ArrayBuffer(s.length*2), v = new Uint16Array(b);
|
||||
for (var i=0; i != s.length; ++i) v[i] = s.charCodeAt(i);
|
||||
return [v, b];
|
||||
}
|
||||
|
||||
onmessage = function (oEvent) {
|
||||
var v;
|
||||
try {
|
||||
v = XLSX.read(ab2str(oEvent.data), {type: 'binary'});
|
||||
} catch(e) { postMessage({t:"e",d:e.stack}); }
|
||||
var res = {t:"xlsx", d:JSON.stringify(v)};
|
||||
var r = s2ab(res.d)[1];
|
||||
postMessage(r, [r]);
|
||||
};
|
Loading…
Reference in New Issue
Block a user