You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.9 KiB

/* oss.sheetjs.com (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
var DropSheet = function DropSheet(opts) {
if(!opts) opts = {};
var nullfunc = function(){};
if(!opts.errors) opts.errors = {};
if(!opts.errors.badfile) opts.errors.badfile = nullfunc;
if(!opts.errors.pending) opts.errors.pending = nullfunc;
if(!opts.errors.failed) opts.errors.failed = nullfunc;
if(!opts.errors.large) opts.errors.large = nullfunc;
if(!opts.on) opts.on = {};
if(!opts.on.workstart) opts.on.workstart = nullfunc;
if(!opts.on.workend) opts.on.workend = nullfunc;
if(!opts.on.sheet) opts.on.sheet = nullfunc;
if(!opts.on.wb) opts.on.wb = nullfunc;
var rABS = typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsBinaryString;
var useworker = typeof Worker !== 'undefined';
var pending = 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(o.length)));
return o;
}
function sheetjsw(data, cb, readtype) {
pending = true;
opts.on.workstart();
var scripts = document.getElementsByTagName('script');
var dropsheetPath;
for (var i = 0; i < scripts.length; i++) {
if (scripts[i].src.indexOf('dropsheet') != -1) {
dropsheetPath = scripts[i].src.split('dropsheet.js')[0];
}
}
var worker = new Worker(dropsheetPath + 'sheetjsw.js');
worker.onmessage = function(e) {
switch(e.data.t) {
case 'ready': break;
case 'e': pending = false; console.error(e.data.d); break;
case 'xlsx':
pending = false;
opts.on.workend();
cb(JSON.parse(e.data.d)); break;
}
};
worker.postMessage({d:data,b:readtype,t:'xlsx'});
}
var last_wb;
function to_json(workbook) {
if(useworker && workbook.SSF) XLSX.SSF.load_table(workbook.SSF);
var result = {};
workbook.SheetNames.forEach(function(sheetName) {
var roa = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], {raw:false, header:1});
if(roa.length > 0) result[sheetName] = roa;
});
return result;
}
function choose_sheet(sheetidx) { process_wb(last_wb, sheetidx); }
function process_wb(wb, sheetidx) {
last_wb = wb;
opts.on.wb(wb, sheetidx);
var sheet = wb.SheetNames[sheetidx||0];
var json = to_json(wb)[sheet];
opts.on.sheet(json, wb.SheetNames, choose_sheet);
}
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
if(pending) return opts.errors.pending();
var files = e.dataTransfer.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
var wb, arr;
var readtype = {type: rABS ? 'binary' : 'base64' };
if(!rABS) {
arr = fixdata(data);
data = btoa(arr);
}
function doit() {
try {
if(useworker) { sheetjsw(data, process_wb, readtype); return; }
wb = XLSX.read(data, readtype);
process_wb(wb);
} catch(e) { console.log(e); opts.errors.failed(e); }
}
if(e.target.result.length > 1e6) opts.errors.large(e.target.result.length, function(e) { if(e) doit(); });
else { doit(); }
};
if(rABS) reader.readAsBinaryString(f);
else reader.readAsArrayBuffer(f);
}
}
function handleDragover(e) {
e.stopPropagation();
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
}
if(opts.drop.addEventListener) {
opts.drop.addEventListener('dragenter', handleDragover, false);
opts.drop.addEventListener('dragover', handleDragover, false);
opts.drop.addEventListener('drop', handleDrop, false);
}
function handleFile(e) {
if(pending) return opts.errors.pending();
var files = e.target.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
var wb, arr;
var readtype = {type: rABS ? 'binary' : 'base64' };
if(!rABS) {
arr = fixdata(data);
data = btoa(arr);
}
function doit() {
try {
if(useworker) { sheetjsw(data, process_wb, readtype); return; }
wb = XLSX.read(data, readtype);
process_wb(wb);
} catch(e) { console.log(e); opts.errors.failed(e); }
}
if(e.target.result.length > 1e6) opts.errors.large(e.target.result.length, function(e) { if(e) doit(); });
else { doit(); }
};
if(rABS) reader.readAsBinaryString(f);
else reader.readAsArrayBuffer(f);
}
}
if(opts.file && opts.file.addEventListener) opts.file.addEventListener('change', handleFile, false);
};