1. js 解析Excle文件
- https://github.com/SheetJS/sheetjs
- https://oss.sheetjs.com/sheetjs/
- https://cdnjs.com/libraries/xlsx
1.1. index.html
- https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.15.3/xlsx.full.min.js
- https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.15.3/shim.min.js
format 转换格式
<script src="/js_xls/shim.min.js" type="text/javascript"></script> <script src="/js_xls/jszip.js" type="text/javascript"></script> <script src="/js_xls/xlsx.full.min.js" type="text/javascript"></script> //... <div > <div> <input type="hidden" name="format" value="html"/> <p><input type="file" name="xlfile" id="xlf"/></p> <br> <b>选项:</b> <br> worker是否可用 :<input type="checkbox" name="useworker" disabled checked> <br> 二进制是否可用: <input type="checkbox" name="userabs" disabled checked> </div> <div id="out"> </div> <div id="htmlout"> </div> </div> //... <script type="application/javascript"> /*jshint browser:true */ /* eslint-env browser */ /* eslint no-use-before-define:0 */ /*global Uint8Array, Uint16Array, ArrayBuffer */ /*global XLSX */ var X = XLSX; var XW = { /* worker message */ msg: 'xlsx', /* worker scripts */ worker: '/js_xls/xlsxworker.js' }; var global_wb; 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], {header: 1}); 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: 'string', 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); }; })(); (function () { 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(); 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); }; })(); var xlf = document.getElementById('xlf'); if (!xlf.addEventListener) return; function handleFile(e) { do_file(e.target.files); //TODO ...上传 } xlf.addEventListener('change', handleFile, false); })(); </script>
1.2. 使用worker xlsxworker.js
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
importScripts('shim.min.js');
importScripts('xlsx.full.min.js');
postMessage({t:"ready"});
onmessage = function (evt) {
var v;
try {
v = XLSX.read(evt.data.d, {type: evt.data.b});
postMessage({t:"xlsx", d:JSON.stringify(v)});
} catch(e) { postMessage({t:"e",d:e.stack||e}); }
};