- file writing includes `fs` as appropriate - CLI modify and write options - infrastructure update
		
			
				
	
	
		
			189 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<!-- cfb.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-CFB 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 CFB Preview Live Demo</a></b>
 | 
						|
 | 
						|
<a href="https://github.com/SheetJS/js-cfb">Source Code Repo</a>
 | 
						|
<a href="https://github.com/SheetJS/js-cfb/issues">Issues?  Something look weird?  Click here and report an issue</a>
 | 
						|
<div id="drop">Drop an XLS file here to see the CFB structure.</div>
 | 
						|
 | 
						|
<b>Advanced Demo Options:</b>
 | 
						|
Use readAsBinaryString: (when available) <input type="checkbox" name="userabs" checked>
 | 
						|
 | 
						|
<a id="saveit" onclick="savefile();" href="#">Export data</a>
 | 
						|
</pre>
 | 
						|
<pre id="out"></pre>
 | 
						|
<br />
 | 
						|
<script src="shim.js"></script>
 | 
						|
<script src="https://unpkg.com/printj/dist/printj.min.js"></script>
 | 
						|
<script src="cfb.js"></script>
 | 
						|
<script src="//rawgit.com/eligrey/Blob.js/master/Blob.js"></script>
 | 
						|
<script src="//rawgit.com/eligrey/FileSaver.js/master/FileSaver.js"></script>
 | 
						|
<script>
 | 
						|
/*jshint browser:true */
 | 
						|
/* eslint-env browser */
 | 
						|
/* eslint no-use-before-define:0 */
 | 
						|
/*global CFB, out */
 | 
						|
var global_cfb;
 | 
						|
 | 
						|
var get_manifest = (function() {
 | 
						|
	var sprintf = PRINTJ.sprintf;
 | 
						|
	function fix_string(x/*:string*/)/*:string*/ { return x.replace(/[\u0000-\u001f]/, function($$) { return sprintf("\\u%04X", $$.charCodeAt(0)); }); }
 | 
						|
	var format_date = function(date/*:Date*/)/*:string*/ {
 | 
						|
		return sprintf("%02u-%02u-%02u %02u:%02u", date.getUTCMonth()+1, date.getUTCDate(), date.getUTCFullYear()%100, date.getUTCHours(), date.getUTCMinutes());
 | 
						|
	};
 | 
						|
	return function get_manifest(cfb) {
 | 
						|
		var out = [];
 | 
						|
 | 
						|
		var basetime = new Date(1980,0,1);
 | 
						|
		var cnt = 0, rootsize = 0, filesize = 0;
 | 
						|
		out.push("  Length     Date   Time    Name");
 | 
						|
		out.push(" --------    ----   ----    ----");
 | 
						|
		cfb.FileIndex.forEach(function(file/*:CFBEntry*/, i/*:number*/) {
 | 
						|
			switch(file.type) {
 | 
						|
				case 5:
 | 
						|
					basetime = file.ct || file.mt || basetime;
 | 
						|
					rootsize = file.size;
 | 
						|
					break;
 | 
						|
				case 2:
 | 
						|
					out.push(sprintf("%9lu  %s   <a href=\"#\" onclick=\"download_file(%d);\">%s</a>", file.size, format_date(basetime), i, fix_string(cfb.FullPaths[i])));
 | 
						|
					filesize += file.size;
 | 
						|
					++cnt;
 | 
						|
			}
 | 
						|
		});
 | 
						|
		out.push(" --------                   -------");
 | 
						|
		out.push(sprintf("%9lu                   %lu file%s", rootsize || filesize, cnt, (cnt !== 1 ? "s" : "")));
 | 
						|
		return out.join("\n");
 | 
						|
	};
 | 
						|
})();
 | 
						|
 | 
						|
function process_data(cfb) {
 | 
						|
	global_cfb = cfb;
 | 
						|
	var output = get_manifest(cfb);
 | 
						|
	out.innerHTML = output;
 | 
						|
}
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
	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;
 | 
						|
	}
 | 
						|
 | 
						|
	return function do_file(files) {
 | 
						|
		rABS = domrabs.checked;
 | 
						|
		var f = files[0];
 | 
						|
		var reader = new FileReader();
 | 
						|
		reader.onload = function(e) {
 | 
						|
			var data = e.target.result;
 | 
						|
			var cfb = CFB.read(rABS ? data : btoa(fixdata(data)), {type: rABS ? 'binary' : 'base64'});
 | 
						|
			process_data(cfb);
 | 
						|
		};
 | 
						|
		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';
 | 
						|
	}
 | 
						|
 | 
						|
	drop.addEventListener('dragenter', handleDragover, false);
 | 
						|
	drop.addEventListener('dragover', handleDragover, false);
 | 
						|
	drop.addEventListener('drop', handleDrop, false);
 | 
						|
})();
 | 
						|
 | 
						|
var savefile = (function() {
 | 
						|
	var s2ab = function s2ab(s) {
 | 
						|
		var buf, i=0;
 | 
						|
		if(typeof ArrayBuffer !== 'undefined') {
 | 
						|
			buf = new ArrayBuffer(s.length);
 | 
						|
			var view = new Uint8Array(buf);
 | 
						|
			for (; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
 | 
						|
			return buf;
 | 
						|
		} else {
 | 
						|
			buf = new Array(s.length);
 | 
						|
			for (; i!=s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
 | 
						|
			return buf;
 | 
						|
		}
 | 
						|
	};
 | 
						|
 | 
						|
	return function savefile() {
 | 
						|
		if(!global_cfb) return alert("Must load a file first!");
 | 
						|
		console.log(global_cfb);
 | 
						|
		var data = CFB.write(global_cfb, {type:'binary'});
 | 
						|
		console.log(data);
 | 
						|
		saveAs(new Blob([s2ab(data)],{type:"application/octet-stream"}), "sheetjs.xls");
 | 
						|
	};
 | 
						|
})();
 | 
						|
 | 
						|
var download_file = (function() {
 | 
						|
	var a2ab = function a2ab(a) {
 | 
						|
		var o = new ArrayBuffer(a.length);
 | 
						|
		var view = new Uint8Array(o);
 | 
						|
		for (var i = 0; i!=a.length; ++i) view[i] = a[i];
 | 
						|
		return o;
 | 
						|
	};
 | 
						|
 | 
						|
	return function download_file(i) {
 | 
						|
		if(!global_cfb) return alert("Must load a file first!");
 | 
						|
		console.log(global_cfb);
 | 
						|
		var file = global_cfb.FileIndex[i], data = file.content;
 | 
						|
		saveAs(new Blob([a2ab(data)],{type:"application/octet-stream"}), file.name);
 | 
						|
	};
 | 
						|
})();
 | 
						|
</script>
 | 
						|
<script type="text/javascript">
 | 
						|
/* eslint no-use-before-define:0 */
 | 
						|
	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>
 | 
						|
</body>
 | 
						|
</html>
 |