version bump 0.8.7: bundlers
demos for browserify/requirejs/webpack
This commit is contained in:
parent
5ae6b1965b
commit
3d1f0f79ca
2
.gitignore
vendored
2
.gitignore
vendored
@ -9,7 +9,7 @@ tmp
|
||||
*.[pP][rR][nN]
|
||||
*.[sS][lL][kK]
|
||||
*.socialcalc
|
||||
*.[xX][lL][sSwW]
|
||||
*.[xX][lL][sSwWcC]
|
||||
*.[xX][lL][sS][xXmMbB]
|
||||
*.[oO][dD][sS]
|
||||
*.[fF][oO][dD][sS]
|
||||
|
@ -1,5 +1,6 @@
|
||||
test_files/
|
||||
tests/files/
|
||||
demos/
|
||||
index.html
|
||||
misc/
|
||||
node_modules
|
||||
@ -10,7 +11,7 @@ tmp
|
||||
*.[pP][rR][nN]
|
||||
*.[sS][lL][kK]
|
||||
*.socialcalc
|
||||
*.[xX][lL][sSwW]
|
||||
*.[xX][lL][sSwWcC]
|
||||
*.[xX][lL][sS][xXmMbB]
|
||||
*.[oO][dD][sS]
|
||||
*.[fF][oO][dD][sS]
|
||||
|
@ -16,6 +16,6 @@ before_install:
|
||||
- "npm install coveralls mocha-lcov-reporter"
|
||||
before_script:
|
||||
- "make init"
|
||||
- "cd test_files; make all; cd -"
|
||||
- "cd test_files; make all; cd -"
|
||||
after_success:
|
||||
- "make coveralls-spin"
|
||||
|
12
Makefile
12
Makefile
@ -57,8 +57,9 @@ dist: dist-deps $(TARGET) bower.json ## Prepare JS files for distribution
|
||||
misc/strip_sourcemap.sh dist/$(LIB).min.js
|
||||
uglifyjs $(UGLIFYOPTS) $(REQS) $(TARGET) -o dist/$(LIB).core.min.js --source-map dist/$(LIB).core.min.map --preamble "$$(head -n 1 bits/00_header.js)"
|
||||
misc/strip_sourcemap.sh dist/$(LIB).core.min.js
|
||||
uglifyjs $(UGLIFYOPTS) $(REQS) $(ADDONS) $(TARGET) -o dist/$(LIB).full.min.js --source-map dist/$(LIB).full.min.map --preamble "$$(head -n 1 bits/00_header.js)"
|
||||
uglifyjs $(UGLIFYOPTS) $(REQS) $(ADDONS) $(TARGET) $(AUXTARGETS) -o dist/$(LIB).full.min.js --source-map dist/$(LIB).full.min.map --preamble "$$(head -n 1 bits/00_header.js)"
|
||||
misc/strip_sourcemap.sh dist/$(LIB).full.min.js
|
||||
cat <(head -n 1 bits/00_header.js) $(REQS) $(ADDONS) $(TARGET) $(AUXTARGETS) > demos/requirejs/$(LIB).full.js
|
||||
|
||||
.PHONY: dist-deps
|
||||
dist-deps: ods.js ## Copy dependencies for distribution
|
||||
@ -91,6 +92,15 @@ TESTFMT=$(patsubst %,test_%,$(FMT))
|
||||
$(TESTFMT): test_%:
|
||||
FMTS=$* make test
|
||||
|
||||
.PHONY: demo-browserify
|
||||
demo-browserify: ## Run browserify demo build
|
||||
make -C demos/browserify
|
||||
@echo "start a local server and go to demos/browserify/browserify.html"
|
||||
|
||||
.PHONY: demo-webpack
|
||||
demo-webpack: ## Run webpack demo build
|
||||
make -C demos/webpack
|
||||
@echo "start a local server and go to demos/webpack/webpack.html"
|
||||
|
||||
## Code Checking
|
||||
|
||||
|
10
README.md
10
README.md
@ -73,6 +73,14 @@ An appropriate version for each dependency is included in the dist/ directory.
|
||||
|
||||
The complete single-file version is generated at `dist/xlsx.full.min.js`
|
||||
|
||||
### JS Ecosystem Demos
|
||||
|
||||
The `demos` directory includes sample projects for:
|
||||
|
||||
- [`browserify`](http://browserify.org/)
|
||||
- [`requirejs`](http://requirejs.org/)
|
||||
- [`webpack`](https://webpack.js.org/)
|
||||
|
||||
### ECMAScript 5 Compatibility
|
||||
|
||||
Since xlsx.js uses ES5 functions like `Array#forEach`, older browsers require
|
||||
@ -338,7 +346,7 @@ Utilities are available in the `XLSX.utils` object:
|
||||
|
||||
Exporting:
|
||||
|
||||
- `sheet_to_json` converts a workbook object to an array of JSON objects.
|
||||
- `sheet_to_json` converts a worksheet object to an array of JSON objects.
|
||||
`sheet_to_row_object_array` is an alias that will be removed in the future.
|
||||
- `sheet_to_csv` generates delimiter-separated-values output.
|
||||
- `sheet_to_formulae` generates a list of the formulae (with value fallbacks).
|
||||
|
10
bin/xlsx.njs
10
bin/xlsx.njs
@ -10,6 +10,7 @@ program
|
||||
.usage('[options] <file> [sheetname]')
|
||||
.option('-f, --file <file>', 'use specified workbook')
|
||||
.option('-s, --sheet <sheet>', 'print specified sheet (default first sheet)')
|
||||
.option('-N, --sheet-index <idx>', 'use specified sheet index (0-based)')
|
||||
.option('-p, --password <pw>', 'if file is encrypted, try with specified pw')
|
||||
.option('-l, --list-sheets', 'list sheet names and exit')
|
||||
.option('-o, --output <file>', 'output to specified file')
|
||||
@ -25,6 +26,7 @@ program
|
||||
.option('-j, --json', 'emit formatted JSON (all fields text)')
|
||||
.option('-J, --raw-js', 'emit raw JS object (raw numbers)')
|
||||
.option('-A, --arrays', 'emit rows as JS objects (raw numbers)')
|
||||
|
||||
.option('-F, --field-sep <sep>', 'CSV field separator', ",")
|
||||
.option('-R, --row-sep <sep>', 'CSV row separator', "\n")
|
||||
.option('-n, --sheet-rows <num>', 'Number of rows to process (0=all rows)')
|
||||
@ -80,6 +82,7 @@ if(program.listSheets) opts.bookSheets = true;
|
||||
if(program.sheetRows) opts.sheetRows = program.sheetRows;
|
||||
if(program.password) opts.password = program.password;
|
||||
if(program.xlsx || program.xlsm || program.xlsb) {
|
||||
opts.cellFormula = true;
|
||||
opts.cellNF = true;
|
||||
if(program.output) sheetname = program.output;
|
||||
}
|
||||
@ -109,7 +112,7 @@ if(program.read) process.exit(0);
|
||||
|
||||
/*:: if(wb) { */
|
||||
if(program.listSheets) {
|
||||
console.log(wb.SheetNames.join("\n"));
|
||||
console.log((wb.SheetNames||[]).join("\n"));
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
@ -123,7 +126,10 @@ workbook_formats.forEach(function(m) { if(program[m]) {
|
||||
} });
|
||||
|
||||
var target_sheet = sheetname || '';
|
||||
if(target_sheet === '') target_sheet = wb.SheetNames[0];
|
||||
if(target_sheet === '') {
|
||||
if(program.sheetIndex < (wb.SheetNames||[]).length) target_sheet = wb.SheetNames[program.sheetIndex];
|
||||
else target_sheet = (wb.SheetNames||[""])[0];
|
||||
}
|
||||
|
||||
var ws;
|
||||
try {
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.8.6';
|
||||
XLSX.version = '0.8.7';
|
||||
|
@ -1,6 +1,6 @@
|
||||
var current_codepage = 1200, current_cptable;
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');
|
||||
if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel.js');
|
||||
current_cptable = cptable[current_codepage];
|
||||
}
|
||||
function reset_cp() { set_cp(1200); }
|
||||
|
@ -55,7 +55,7 @@ var _fs, jszip;
|
||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
|
||||
if (typeof exports !== 'undefined') {
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
if(typeof jszip === 'undefined') jszip = require('./js'+'zip');
|
||||
_fs = require('f'+'s');
|
||||
if(typeof jszip === 'undefined') jszip = require('./jszip.js');
|
||||
_fs = require('fs');
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ var make_offcrypto = function(O, _crypto) {
|
||||
var crypto;
|
||||
if(typeof _crypto !== 'undefined') crypto = _crypto;
|
||||
else if(typeof require !== 'undefined') {
|
||||
try { crypto = require('cry'+'pto'); }
|
||||
try { crypto = require('crypto'); }
|
||||
catch(e) { crypto = null; }
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ function parse_VtVecHeadingPair(blob) {
|
||||
/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
|
||||
function parse_dictionary(blob,CodePage) {
|
||||
var cnt = blob.read_shift(4);
|
||||
var dict/*{[number]:string}*/ = ({}/*:any*/);
|
||||
var dict/*:{[number]:string}*/ = ({}/*:any*/);
|
||||
for(var j = 0; j != cnt; ++j) {
|
||||
var pid = blob.read_shift(4);
|
||||
var len = blob.read_shift(4);
|
||||
@ -149,7 +149,7 @@ function parse_PropertySet(blob, PIDSI) {
|
||||
var NumProps = blob.read_shift(4);
|
||||
var Props = [], i = 0;
|
||||
var CodePage = 0;
|
||||
var Dictionary = -1, DictObj/*{[number]:string}*/ = ({}/*:any*/);
|
||||
var Dictionary = -1, DictObj/*:{[number]:string}*/ = ({}/*:any*/);
|
||||
for(i = 0; i != NumProps; ++i) {
|
||||
var PropID = blob.read_shift(4);
|
||||
var Offset = blob.read_shift(4);
|
||||
|
@ -557,6 +557,7 @@ function parse_FormulaValue(blob) {
|
||||
|
||||
/* 2.5.198.103 */
|
||||
function parse_RgbExtra(blob, length, rgce, opts) {
|
||||
if(opts.biff < 8) return parsenoop(blob, length);
|
||||
var target = blob.l + length;
|
||||
var o = [];
|
||||
for(var i = 0; i !== rgce.length; ++i) {
|
||||
@ -624,7 +625,6 @@ function parse_ArrayParsedFormula(blob, length, opts, ref) {
|
||||
}
|
||||
|
||||
/* 2.5.198.104 */
|
||||
var gcnt = 0;
|
||||
function parse_Rgce(blob, length, opts) {
|
||||
var target = blob.l + length;
|
||||
var R, id, ptgs = [];
|
||||
@ -892,6 +892,7 @@ function stringify_formula(formula, range, cell, supbooks, opts) {
|
||||
|
||||
/* 2.5.198.38 */
|
||||
case 'PtgAttrSpace':
|
||||
/* 2.5.198.39 */
|
||||
case 'PtgAttrSpaceSemi':
|
||||
last_sp = ff;
|
||||
break;
|
||||
|
@ -701,7 +701,7 @@ function parse_xlml_xml(d, opts) {
|
||||
}
|
||||
if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");
|
||||
}
|
||||
var out = ({}/*:Any*/);
|
||||
var out = ({}/*:any*/);
|
||||
if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;
|
||||
out.SheetNames = sheetnames;
|
||||
out.SSF = SSF.get_table();
|
||||
|
@ -160,6 +160,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
|
||||
var length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;
|
||||
var R = XLSRecordEnum[RecordType];
|
||||
//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
|
||||
//if(!R) console.log(blob.slice(blob.l, blob.l + length));
|
||||
if(R && R.f) {
|
||||
if(options.bookSheets) {
|
||||
if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;
|
||||
@ -253,12 +254,13 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
|
||||
} break;
|
||||
case 'BOF': {
|
||||
if(opts.biff !== 8){}
|
||||
else if(val.BIFFVer === 0x0500) opts.biff = 5;
|
||||
else if(val.BIFFVer === 0x0002) opts.biff = 2;
|
||||
else if(val.BIFFVer === 0x0007) opts.biff = 2;
|
||||
else if(RecordType === 0x0009) opts.biff = 2;
|
||||
else if(RecordType === 0x0209) opts.biff = 3;
|
||||
else if(RecordType === 0x0409) opts.biff = 4;
|
||||
else if(val.BIFFVer === 0x0500) opts.biff = 5;
|
||||
else if(val.BIFFVer === 0x0600) opts.biff = 8;
|
||||
else if(val.BIFFVer === 0x0002) opts.biff = 2;
|
||||
else if(val.BIFFVer === 0x0007) opts.biff = 2;
|
||||
if(file_depth++) break;
|
||||
cell_valid = true;
|
||||
out = {};
|
||||
|
@ -1,16 +1,21 @@
|
||||
/* Helper functions to call out to ODS */
|
||||
|
||||
function get_ods() {
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./ods.js');
|
||||
return ODS;
|
||||
}
|
||||
function parse_ods(zip, opts) {
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
|
||||
get_ods();
|
||||
if(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error("Unsupported ODS");
|
||||
return ODS.parse_ods(zip, opts);
|
||||
}
|
||||
function write_ods(wb, opts) {
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
|
||||
get_ods();
|
||||
if(typeof ODS === 'undefined' || !ODS.write_ods) throw new Error("Unsupported ODS");
|
||||
return ODS.write_ods(wb, opts);
|
||||
}
|
||||
function parse_fods(data, opts) {
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');
|
||||
get_ods();
|
||||
if(typeof ODS === 'undefined' || !ODS.parse_fods) throw new Error("Unsupported ODS");
|
||||
return ODS.parse_fods(data, opts);
|
||||
}
|
||||
|
@ -10,13 +10,20 @@ function unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\$([A-Z])
|
||||
|
||||
function split_cell(cstr/*:string*/)/*:Array<string>*/ { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); }
|
||||
function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
|
||||
function encode_cell(cell/*:Cell*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
|
||||
function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
|
||||
function fix_cell(cstr/*:string*/)/*:string*/ { return fix_col(fix_row(cstr)); }
|
||||
function unfix_cell(cstr/*:string*/)/*:string*/ { return unfix_col(unfix_row(cstr)); }
|
||||
function decode_range(range/*:string*/)/*:Range*/ { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }
|
||||
function encode_range(cs/*:any*/,ce/*:?any*/)/*:string*/ {
|
||||
if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);
|
||||
if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);
|
||||
if(typeof ce === 'undefined' || typeof ce === 'number') {
|
||||
/*:: if(!(cs instanceof Range)) throw "unreachable"; */
|
||||
return encode_range(cs.s, cs.e);
|
||||
}
|
||||
/*:: if((cs instanceof Range)) throw "unreachable"; */
|
||||
if(typeof cs !== 'string') cs = encode_cell((cs/*:any*/));
|
||||
if(typeof ce !== 'string') ce = encode_cell((ce/*:any*/));
|
||||
/*:: if(typeof cs !== 'string') throw "unreachable"; */
|
||||
/*:: if(typeof ce !== 'string') throw "unreachable"; */
|
||||
return cs == ce ? cs : cs + ":" + ce;
|
||||
}
|
||||
|
||||
|
2
demos/browserify/.gitignore
vendored
Normal file
2
demos/browserify/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
browserify.js
|
||||
browserify.min.js
|
10
demos/browserify/Makefile
Normal file
10
demos/browserify/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
TOOL=browserify
|
||||
.PHONY: all
|
||||
all: $(TOOL).min.js
|
||||
|
||||
$(TOOL).min.js: $(TOOL).js
|
||||
uglifyjs $< > $@
|
||||
|
||||
.PHONY: $(TOOL).js
|
||||
$(TOOL).js:
|
||||
browserify -r './main.js:xlsx' > $@
|
278
demos/browserify/browserify.html
Normal file
278
demos/browserify/browserify.html
Normal file
@ -0,0 +1,278 @@
|
||||
<!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>JS-XLSX 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%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-XLSX Live Demo</b><br />
|
||||
Output Format:
|
||||
<select name="format">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</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>
|
||||
<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 />
|
||||
<pre id="out"></pre>
|
||||
<br />
|
||||
<script src="browserify.min.js"></script>
|
||||
<script>
|
||||
var X = require('xlsx');
|
||||
var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './xlsxworker2.js',
|
||||
norABS: './xlsxworker1.js',
|
||||
noxfer: './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: 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_row_object_array(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;
|
||||
use_worker = document.getElementsByName("useworker")[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, 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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
3
demos/browserify/main.js
Normal file
3
demos/browserify/main.js
Normal file
@ -0,0 +1,3 @@
|
||||
var XLSX = require('../../'); // test against development version
|
||||
//var XLSX = require('xlsx'); // use in production
|
||||
module.exports = XLSX;
|
12
demos/browserify/xlsxworker.js
Normal file
12
demos/browserify/xlsxworker.js
Normal file
@ -0,0 +1,12 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('browserify.min.js');
|
||||
var XLSX = require('xlsx');
|
||||
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}); }
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
};
|
27
demos/browserify/xlsxworker1.js
Normal file
27
demos/browserify/xlsxworker1.js
Normal file
@ -0,0 +1,27 @@
|
||||
/* 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]);
|
||||
};
|
27
demos/browserify/xlsxworker2.js
Normal file
27
demos/browserify/xlsxworker2.js
Normal file
@ -0,0 +1,27 @@
|
||||
/* 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]);
|
||||
};
|
4
demos/requirejs/.gitignore
vendored
Normal file
4
demos/requirejs/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
xlsx.full*
|
||||
r.js
|
||||
require.js
|
||||
requirejs-built.js
|
9
demos/requirejs/Makefile
Normal file
9
demos/requirejs/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
TOOL=requirejs
|
||||
.PHONY: all
|
||||
all: $(TOOL).js
|
||||
|
||||
.PHONY: $(TOOL).js
|
||||
$(TOOL).js:
|
||||
if [ ! -e require.js ]; then curl -O http://requirejs.org/docs/release/2.3.3/comments/require.js; fi
|
||||
if [ ! -e r.js ]; then curl -O http://requirejs.org/docs/release/2.3.3/r.js; fi
|
||||
node r.js -o build.js
|
5
demos/requirejs/build.js
Normal file
5
demos/requirejs/build.js
Normal file
@ -0,0 +1,5 @@
|
||||
({
|
||||
baseUrl: ".",
|
||||
name: "requirejs",
|
||||
out: "requirejs-built.js"
|
||||
})
|
173
demos/requirejs/requirejs.js
Normal file
173
demos/requirejs/requirejs.js
Normal file
@ -0,0 +1,173 @@
|
||||
require(["xlsx.full"], 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 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 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_row_object_array(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);
|
||||
}
|
||||
};
|
||||
if(rABS) reader.readAsBinaryString(f);
|
||||
else reader.readAsArrayBuffer(f);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
});
|
2
demos/webpack/.gitignore
vendored
Normal file
2
demos/webpack/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
webpack.js
|
||||
webpack.min.js
|
10
demos/webpack/Makefile
Normal file
10
demos/webpack/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
TOOL=webpack
|
||||
.PHONY: all
|
||||
all: $(TOOL).min.js
|
||||
|
||||
$(TOOL).min.js: $(TOOL).js
|
||||
uglifyjs $< > $@
|
||||
|
||||
.PHONY: $(TOOL).js
|
||||
$(TOOL).js:
|
||||
webpack main.js --output-filename $@ --display-modules
|
3
demos/webpack/main.js
Normal file
3
demos/webpack/main.js
Normal file
@ -0,0 +1,3 @@
|
||||
var XLSX = require('../../');
|
||||
console.log("it works!");
|
||||
module.exports = XLSX;
|
19
demos/webpack/webpack.config.js
Normal file
19
demos/webpack/webpack.config.js
Normal file
@ -0,0 +1,19 @@
|
||||
module.exports = {
|
||||
output: {
|
||||
libraryTarget: 'var',
|
||||
library: 'XLSX'
|
||||
},
|
||||
module: {
|
||||
noParse: [/jszip.js$/]
|
||||
},
|
||||
node: {
|
||||
fs: false,
|
||||
Buffer: false
|
||||
},
|
||||
externals: [
|
||||
{
|
||||
'./cptable': 'var cptable',
|
||||
'../xlsx.js': 'var _XLSX'
|
||||
}
|
||||
]
|
||||
}
|
278
demos/webpack/webpack.html
Normal file
278
demos/webpack/webpack.html
Normal file
@ -0,0 +1,278 @@
|
||||
<!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>JS-XLSX 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%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<b>JS-XLSX Live Demo</b><br />
|
||||
Output Format:
|
||||
<select name="format">
|
||||
<option value="csv" selected> CSV</option>
|
||||
<option value="json"> JSON</option>
|
||||
<option value="form"> FORMULAE</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>
|
||||
<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 />
|
||||
<pre id="out"></pre>
|
||||
<br />
|
||||
<script src="webpack.min.js"></script>
|
||||
<script>
|
||||
var X = XLSX;
|
||||
var XW = {
|
||||
/* worker message */
|
||||
msg: 'xlsx',
|
||||
/* worker scripts */
|
||||
rABS: './xlsxworker2.js',
|
||||
norABS: './xlsxworker1.js',
|
||||
noxfer: './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: 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_row_object_array(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;
|
||||
use_worker = document.getElementsByName("useworker")[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, 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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
11
demos/webpack/xlsxworker.js
Normal file
11
demos/webpack/xlsxworker.js
Normal file
@ -0,0 +1,11 @@
|
||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
importScripts('webpack.min.js');
|
||||
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}); }
|
||||
postMessage({t:"xlsx", d:JSON.stringify(v)});
|
||||
};
|
26
demos/webpack/xlsxworker1.js
Normal file
26
demos/webpack/xlsxworker1.js
Normal file
@ -0,0 +1,26 @@
|
||||
/* 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]);
|
||||
};
|
26
demos/webpack/xlsxworker2.js
Normal file
26
demos/webpack/xlsxworker2.js
Normal file
@ -0,0 +1,26 @@
|
||||
/* 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]);
|
||||
};
|
2
dist/jszip.js
vendored
2
dist/jszip.js
vendored
@ -9,7 +9,7 @@ Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/js
|
||||
JSZip uses the library pako released under the MIT license :
|
||||
https://github.com/nodeca/pako/blob/master/LICENSE
|
||||
*/
|
||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
|
||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd){JSZip=e();define([],e);}else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
|
||||
'use strict';
|
||||
// private property
|
||||
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
|
15
dist/ods.js
vendored
15
dist/ods.js
vendored
@ -7,10 +7,9 @@ var ODS = {};
|
||||
var get_utils = function() {
|
||||
if(typeof XLSX !== 'undefined') return XLSX.utils;
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') try {
|
||||
return require('../' + 'xlsx').utils;
|
||||
return require('../xlsx.js').utils;
|
||||
} catch(e) {
|
||||
try { return require('./' + 'xlsx').utils; }
|
||||
catch(ee) { return require('xl' + 'sx').utils; }
|
||||
return require('./xlsx.js').utils;
|
||||
}
|
||||
throw new Error("Cannot find XLSX utils");
|
||||
};
|
||||
@ -29,7 +28,7 @@ function dup(o) {
|
||||
for(var k in o) if(o.hasOwnProperty(k)) out[k] = dup(o[k]);
|
||||
return out;
|
||||
}
|
||||
function getdata(data) {
|
||||
function getdatastr(data) {
|
||||
if(!data) return null;
|
||||
if(data.data) return data.data;
|
||||
if(data.asNodeBuffer && has_buf) return data.asNodeBuffer().toString('binary');
|
||||
@ -38,6 +37,10 @@ function getdata(data) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* ODS and friends only use text files in container */
|
||||
< |