Skip to content

Commit 4d043f6

Browse files
committed
override_range
1 parent f35e38d commit 4d043f6

File tree

2 files changed

+244
-0
lines changed

2 files changed

+244
-0
lines changed

assets/js/dropsheet_override_range.js

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/* oss.sheetjs.com (C) 2014-present SheetJS -- http://sheetjs.com */
2+
/* vim: set ts=2: */
3+
4+
function update_sheet_range(ws) {
5+
var range = {s:{r:Infinity, c:Infinity},e:{r:0,c:0}};
6+
Object.keys(ws).filter(function(x) { return x.charAt(0) != "!"; }).map(XLSX.utils.decode_cell).forEach(function(x) {
7+
range.s.c = Math.min(range.s.c, x.c); range.s.r = Math.min(range.s.r, x.r);
8+
range.e.c = Math.max(range.e.c, x.c); range.e.r = Math.max(range.e.r, x.r);
9+
});
10+
ws['!ref'] = XLSX.utils.encode_range(range);
11+
}
12+
13+
var DropSheet = function DropSheet(opts) {
14+
if(!opts) opts = {};
15+
var nullfunc = function(){};
16+
if(!opts.errors) opts.errors = {};
17+
if(!opts.errors.badfile) opts.errors.badfile = nullfunc;
18+
if(!opts.errors.pending) opts.errors.pending = nullfunc;
19+
if(!opts.errors.failed) opts.errors.failed = nullfunc;
20+
if(!opts.errors.large) opts.errors.large = nullfunc;
21+
if(!opts.on) opts.on = {};
22+
if(!opts.on.workstart) opts.on.workstart = nullfunc;
23+
if(!opts.on.workend) opts.on.workend = nullfunc;
24+
if(!opts.on.sheet) opts.on.sheet = nullfunc;
25+
if(!opts.on.wb) opts.on.wb = nullfunc;
26+
27+
var rABS = typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsBinaryString;
28+
var useworker = typeof Worker !== 'undefined';
29+
var pending = false;
30+
function fixdata(data) {
31+
var o = "", l = 0, w = 10240;
32+
for(; l<data.byteLength/w; ++l)
33+
o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
34+
o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(o.length)));
35+
return o;
36+
}
37+
38+
function sheetjsw(data, cb, readtype) {
39+
pending = true;
40+
opts.on.workstart();
41+
var scripts = document.getElementsByTagName('script');
42+
var dropsheetPath;
43+
for (var i = 0; i < scripts.length; i++) {
44+
if (scripts[i].src.indexOf('dropsheet') != -1) {
45+
dropsheetPath = scripts[i].src.split('dropsheet')[0];
46+
}
47+
}
48+
var worker = new Worker(dropsheetPath + 'sheetjsw.js');
49+
worker.onmessage = function(e) {
50+
switch(e.data.t) {
51+
case 'ready': break;
52+
case 'e': pending = false; console.error(e.data.d); break;
53+
case 'xlsx':
54+
pending = false;
55+
opts.on.workend();
56+
cb(JSON.parse(e.data.d)); break;
57+
}
58+
};
59+
worker.postMessage({d:data,b:readtype,t:'xlsx'});
60+
}
61+
62+
var last_wb;
63+
64+
function to_json(workbook) {
65+
if(useworker && workbook.SSF) XLSX.SSF.load_table(workbook.SSF);
66+
var result = {};
67+
workbook.SheetNames.forEach(function(sheetName) {
68+
update_sheet_range(workbook.Sheets[sheetName]);
69+
var roa = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], {raw:false, header:1});
70+
if(roa.length > 0) result[sheetName] = roa;
71+
});
72+
return result;
73+
}
74+
75+
function choose_sheet(sheetidx) { process_wb(last_wb, sheetidx); }
76+
77+
function process_wb(wb, sheetidx) {
78+
last_wb = wb;
79+
opts.on.wb(wb, sheetidx);
80+
var sheet = wb.SheetNames[sheetidx||0];
81+
var json = to_json(wb)[sheet];
82+
opts.on.sheet(json, wb.SheetNames, choose_sheet);
83+
}
84+
85+
function handleDrop(e) {
86+
e.stopPropagation();
87+
e.preventDefault();
88+
if(pending) return opts.errors.pending();
89+
var files = e.dataTransfer.files;
90+
var i,f;
91+
for (i = 0, f = files[i]; i != files.length; ++i) {
92+
var reader = new FileReader();
93+
var name = f.name;
94+
reader.onload = function(e) {
95+
var data = e.target.result;
96+
var wb, arr;
97+
var readtype = {type: rABS ? 'binary' : 'base64' };
98+
if(!rABS) {
99+
arr = fixdata(data);
100+
data = btoa(arr);
101+
}
102+
function doit() {
103+
try {
104+
if(useworker) { sheetjsw(data, process_wb, readtype); return; }
105+
wb = XLSX.read(data, readtype);
106+
process_wb(wb);
107+
} catch(e) { console.log(e); opts.errors.failed(e); }
108+
}
109+
110+
if(e.target.result.length > 1e6) opts.errors.large(e.target.result.length, function(e) { if(e) doit(); });
111+
else { doit(); }
112+
};
113+
if(rABS) reader.readAsBinaryString(f);
114+
else reader.readAsArrayBuffer(f);
115+
}
116+
}
117+
118+
function handleDragover(e) {
119+
e.stopPropagation();
120+
e.preventDefault();
121+
e.dataTransfer.dropEffect = 'copy';
122+
}
123+
124+
if(opts.drop.addEventListener) {
125+
opts.drop.addEventListener('dragenter', handleDragover, false);
126+
opts.drop.addEventListener('dragover', handleDragover, false);
127+
opts.drop.addEventListener('drop', handleDrop, false);
128+
}
129+
130+
function handleFile(e) {
131+
if(pending) return opts.errors.pending();
132+
var files = e.target.files;
133+
var i,f;
134+
for (i = 0, f = files[i]; i != files.length; ++i) {
135+
var reader = new FileReader();
136+
var name = f.name;
137+
reader.onload = function(e) {
138+
var data = e.target.result;
139+
var wb, arr;
140+
var readtype = {type: rABS ? 'binary' : 'base64' };
141+
if(!rABS) {
142+
arr = fixdata(data);
143+
data = btoa(arr);
144+
}
145+
function doit() {
146+
try {
147+
if(useworker) { sheetjsw(data, process_wb, readtype); return; }
148+
wb = XLSX.read(data, readtype);
149+
process_wb(wb);
150+
} catch(e) { console.log(e); opts.errors.failed(e); }
151+
}
152+
153+
if(e.target.result.length > 1e6) opts.errors.large(e.target.result.length, function(e) { if(e) doit(); });
154+
else { doit(); }
155+
};
156+
if(rABS) reader.readAsBinaryString(f);
157+
else reader.readAsArrayBuffer(f);
158+
}
159+
}
160+
161+
if(opts.file && opts.file.addEventListener) opts.file.addEventListener('change', handleFile, false);
162+
};

override_range.html

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<!DOCTYPE html>
2+
<!-- xlsx.js (C) 2013-present SheetJS http://sheetjs.com -->
3+
<!-- vim: set ts=2: -->
4+
<html>
5+
<head>
6+
<title>SheetJS Live Grid Demo</title>
7+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8+
<link rel="icon" type="image/png" href="assets/img/logo.png" />
9+
<link rel="stylesheet" href="assets/css/sheetjs.css">
10+
</head>
11+
<body>
12+
<script src="assets/vendor/alertify.js"></script>
13+
<script src="//unpkg.com/canvas-datagrid/dist/canvas-datagrid.js"></script>
14+
15+
<link rel="stylesheet" media="screen" href="assets/vendor/samples.css">
16+
<link rel="stylesheet" media="screen" href="assets/vendor/alertify.css">
17+
18+
<div id="body">
19+
<div id="left">
20+
<div id="logo">
21+
<a href="http://sheetjs.com"><img src="assets/img/logo.png" class="logo" alt="SheetJS Logo" width=128px height=128px /></a>
22+
</div>
23+
<div id="drop">Drop a file here</div>
24+
<input type="file" id="file" value=""/><label for="file">... or click here to select a file</label>
25+
<h3> Choose a worksheet:</h3>
26+
<div id="buttons"></div>
27+
</div>
28+
<div id="right">
29+
<div id="header">
30+
<pre id="out"></pre>
31+
<h2>SheetJS In-Browser Live Grid Demo</h2>
32+
<h3>
33+
Drop a spreadsheet in the box to the left to see a preview.<br/>
34+
Need a file? Why not the <a href="https://obamawhitehouse.archives.gov/sites/default/files/omb/budget/fy2014/assets/receipts.xls">OMB FY 2014 Federal Receipts?</a>
35+
</h3>
36+
<table id="tt">
37+
<tr><td colspan="6"><a href="http://github.com/SheetJS/SheetJS.github.io">View This Page Source</a>; <a href="http://github.com/SheetJS/js-xlsx">XLSX Library</a> (for parsing); <a href="https://github.com/TonyGermaneri/canvas-datagrid">Grid Library</a></tr>
38+
<tr>
39+
<th>File Formats</th>
40+
<td><a href="http://github.com/SheetJS/js-xlsx">Library Source</a></td>
41+
<td><a href="http://SheetJS.github.io/js-xlsx">Interactive Demo</a></td>
42+
<td><a href="http://npm.im/xlsx">"xlsx" on npm</a></td>
43+
<td><a href="https://travis-ci.org/SheetJS/js-xlsx">node CI status</a></td>
44+
<td><a href="stress.html">browser stress test</a></td>
45+
</tr>
46+
</table>
47+
</div>
48+
<div id="grid"></div>
49+
<div id="footnote">
50+
<h3>
51+
This particular parser assumes that <b>the first row of the table is a header.</b><br/>
52+
For parsing a more general file, check the Interactive Demos
53+
</h3><br/>
54+
<h3>The entire process occurs within your browser <br />
55+
<b>NO SPREADSHEET DATA IS SENT TO ANY SERVER (parsing and rendering done in your browser)</b></br>
56+
<h3>This is a work in progress. Every bit helps. Please email <a href="mailto:[email protected]">[email protected]</a> with your feedback.
57+
<h3>Follow us on Twitter <a href="https://twitter.com/SheetJS">@SheetJS</a></h3>
58+
</div>
59+
</div>
60+
61+
<script src="assets/js/shim.js"></script>
62+
<script src="//unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
63+
<script src="assets/js/dropsheet_override_range.js"></script>
64+
<script src="assets/js/main.js"></script>
65+
66+
<script src="assets/vendor/spin.js"></script>
67+
68+
<script type="text/javascript">
69+
var _gaq = _gaq || [];
70+
_gaq.push(['_setAccount', 'UA-36810333-1']);
71+
_gaq.push(['_setDomainName', 'sheetjs.com']);
72+
_gaq.push(['_setAllowLinker', true]);
73+
_gaq.push(['_trackPageview']);
74+
75+
(function() {
76+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
77+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
78+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
79+
})();
80+
</script>
81+
</body>
82+
</html>

0 commit comments

Comments
 (0)