js 用xlsx读取excel、json_to_execl、excel_to_json导入导出
用了xlsx插件。
线上例子
http://yueqingfang.cn/exportJson/json_to_execl%E3%80%81excel_to_json.html (F12看控制台)
http://yueqingfang.cn/exportJson/json_to_execl%E3%80%81excel_to_json2.html (F12看控制台、使用了FileSaver插件)
上面两个例子的区别在于,下载的时候,兼容处理。
第一个例子是自己原生写了一个,第二个例子是引用了FileSaver插件。
废话不多说,直接上代码。
文件目录
json_to_execl、excel_to_json.html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>json_to_execl、excel_to_json</title> <script src="sheetJson.js"></script> </head> <body> <button class="download">下载</button> <button class="upload">上传</button> <script> window.onload = function () { var download = document.querySelector('.download'); var upload = document.querySelector('.upload'); var sheetName = { name: '姓名', age: '年龄', sex: '性别' }; // 下载 download.onclick = function () { var datas = [ {"name": "路飞", "age": "100", "sex": "男"}, {"name": "女帝", "age": "30", "sex": "女"}, {"name": "娜美", "age": "30", "sex": "女"}, {"name": "索隆", "age": "solo", "sex": "男"}, ]; console.log(datas); //JSON数据 var workbook = sheetJson.toSheet({ sheetName: sheetName, datas: datas }); console.log(workbook); sheetJson.downloadExl(workbook) } //给upload注册上传方法 sheetJson.uploadXls(upload, function (files) { //解析excel数据 sheetJson.readWorkbookFromLocalFile(files, function (workbook) { console.log(workbook); //获取到解析的数据 var datas = sheetJson.toJson({ sheetName: sheetName, datas: workbook }); console.log(datas); //JSON数据 }); }, function (errmsg) { alert(errmsg); }) } </script> </body> </html>
json_to_execl、excel_to_json2.html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>json_to_execl、excel_to_json</title> <script src="sheetJson2.js"></script> </head> <body> <button class="download">下载</button> <button class="upload">上传</button> <script> window.onload = function () { var download = document.querySelector('.download'); var upload = document.querySelector('.upload'); var sheetName = { name: '姓名', age: '年龄', sex: '性别' }; // 下载 download.onclick = function () { var datas = [ {"name": "路飞", "age": "100", "sex": "男"}, {"name": "女帝", "age": "30", "sex": "女"}, {"name": "娜美", "age": "30", "sex": "女"}, {"name": "索隆", "age": "solo", "sex": "男"}, ]; console.log(datas); //JSON数据 var workbook = sheetJson.toSheet({ sheetName: sheetName, datas: datas }); console.log(workbook); sheetJson.downloadExl(workbook) } //给upload注册上传方法 sheetJson.uploadXls(upload, function (files) { //解析excel数据 sheetJson.readWorkbookFromLocalFile(files, function (workbook) { console.log(workbook); //获取到解析的数据 var datas = sheetJson.toJson({ sheetName: sheetName, datas: workbook }); console.log(datas); //JSON数据 }); }, function (errmsg) { alert(errmsg); }) } </script> </body> </html>
sheetJson.js代码
window.addEventListener("DOMContentLoaded", function () { downloadScript([ // 'http://oss.sheetjs.com/js-xlsx/xlsx.core.min.js', // 'http://sheetjs.com/demos/Blob.js', // 'http://sheetjs.com/demos/FileSaver.js', './lib/xlsx.core.min.js', // './lib/Blob.js', // './lib/FileSaver.js' ], function () { console.log("不小心成功了"); }, function (errUrl) { // console.log(errUrl); }); // 下载js方法start // 批量下载解析script function downloadScript(scriptUrlArr, callback, errorback) { var downloadCount = 0; var isError = false; var i = 0, length = scriptUrlArr.length; for (i; i < length; i++) { addScript(scriptUrlArr[i], startCallback, startErrorback) } function startCallback() { if (isError) return; downloadCount++; if (downloadCount == length) { callback && callback(); } } function startErrorback(scriptUrl) { isError = true; var errorMsg = scriptUrl + '链接无效'; console.error(errorMsg) errorback && errorback(errorMsg); } } // 添加script下载 function addScript(scriptUrl, callback, errorback) { var script = document.createElement("script"); script.src = scriptUrl; document.body.appendChild(script); document.body.removeChild(script); script.onload = function () { callback && callback(); } script.onerror = function () { errorback && errorback(scriptUrl); } } // 下载js方法end // 上传方法 start // 上传excel方法 function uploadXls(dom, callback, errorback) { var file = document.createElement("input"); file.type = 'file'; // file.multiple = "multiple"; //批量 file.style.display = 'none'; document.body.appendChild(file); file.onchange = function (e) { var files = e.target.files; // var files = file.files; if (files.length == 0) { // errorback && errorback("没有上传文件"); return; } var f = files[0]; if (!/\.xlsx$/g.test(f.name) && !/\.xls$/g.test(f.name)) { errorback && errorback('仅支持读取xlsx和xls格式!'); return; } callback & callback(f); }; dom.onclick = function () { file.click(); } } // 将excel的binary数据解析成JSON function readWorkbookFromLocalFile(file, callback) { var reader = new FileReader(); reader.onload = function (e) { var data = e.target.result; var workbook = XLSX.read(data, {type: 'binary'}); // var json = JSON.stringify( XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]) ); var json = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]); if (callback) callback(json); }; reader.readAsBinaryString(file); } // 上传方法 end // 下载excel方法 start function downloadExl(data, type) { const wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'};//这里的数据是用来定义导出的格式类型 // const wopts = { bookType: 'csv', bookSST: false, type: 'binary' };//ods格式 // const wopts = { bookType: 'ods', bookSST: false, type: 'binary' };//ods格式 // const wopts = { bookType: 'xlsb', bookSST: false, type: 'binary' };//xlsb格式 // const wopts = { bookType: 'fods', bookSST: false, type: 'binary' };//fods格式 // const wopts = { bookType: 'biff2', bookSST: false, type: 'binary' };//xls格式 var wb = {SheetNames: ['Sheet1'], Sheets: {}, Props: {}}; wb.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(data);//通过json_to_sheet转成单页(Sheet)数据 saveAs(new Blob([s2ab(XLSX.write(wb, wopts))], {type: "application/octet-stream"}), "这里是下载的文件名" + '.' + (wopts.bookType == "biff2" ? "xls" : wopts.bookType)); } function s2ab(s) { if (typeof ArrayBuffer !== 'undefined') { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } else { var buf = new Array(s.length); for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF; return buf; } } //如果不能下载,那么清注释saveAs方法,第八行恢复FileSaver.js的引入 function saveAs(obj, fileName) { //当然可以自定义简单的下载文件实现方式 var hrefDom = document.createElement("a"); hrefDom.download = fileName || '下载.xls'; hrefDom.href = URL.createObjectURL(obj); //绑定a标签 hrefDom.style.display = "none"; document.body.appendChild(hrefDom); hrefDom.click(); //模拟点击实现下载 document.body.removeChild(hrefDom); var set = setTimeout(function () { //延时释放 URL.revokeObjectURL(obj); //用URL.revokeObjectURL()来释放这个object URL clearTimeout(set); //释放内存 set = null; }, 100); } // 下载excel方法 end // util start /* * 将json数据转成sheet数据 * */ function toSheet(params) { if (!params) return []; var sheetName = params.sheetName; var datas = params.datas; var i = 0, length = datas.length, data; var _datas = []; for (i; i < length; i++) { data = datas[i]; var key; var _data = {} for (key in sheetName) { _data[sheetName[key]] = data[key] } _datas.push(_data); } return _datas; } /* * 将sheet数据转成json数据 * */ function toJson(params) { if (!params) return []; var sheetName = params.sheetName; var datas = params.datas; var i = 0, length = datas.length, data; var _datas = []; for (i; i < length; i++) { data = datas[i]; var key; var _data = {} for (key in sheetName) { _data[key] = data[sheetName[key]] } _datas.push(_data); } return _datas; } // util end window.sheetJson = { // downloadScript: downloadScript, // addScript: addScript, uploadXls: uploadXls, readWorkbookFromLocalFile: readWorkbookFromLocalFile, downloadExl: downloadExl, // s2ab: s2ab, // saveAs: saveAs, toSheet: toSheet, toJson: toJson }; })
sheetJson2.js代码
window.addEventListener("DOMContentLoaded", function () { downloadScript([ // 'http://oss.sheetjs.com/js-xlsx/xlsx.core.min.js', // 'http://sheetjs.com/demos/Blob.js', // 'http://sheetjs.com/demos/FileSaver.js', './lib/xlsx.core.min.js', // './lib/Blob.js', './lib/FileSaver.js' ], function () { console.log("不小心成功了"); }, function (errUrl) { // console.log(errUrl); }); // 下载js方法start // 批量下载解析script function downloadScript(scriptUrlArr, callback, errorback) { var downloadCount = 0; var isError = false; var i = 0, length = scriptUrlArr.length; for (i; i < length; i++) { addScript(scriptUrlArr[i], startCallback, startErrorback) } function startCallback() { if (isError) return; downloadCount++; if (downloadCount == length) { callback && callback(); } } function startErrorback(scriptUrl) { isError = true; var errorMsg = scriptUrl + '链接无效'; console.error(errorMsg) errorback && errorback(errorMsg); } } // 添加script下载 function addScript(scriptUrl, callback, errorback) { var script = document.createElement("script"); script.src = scriptUrl; document.body.appendChild(script); document.body.removeChild(script); script.onload = function () { callback && callback(); } script.onerror = function () { errorback && errorback(scriptUrl); } } // 下载js方法end // 上传方法 start // 上传excel方法 function uploadXls(dom, callback, errorback) { var file = document.createElement("input"); file.type = 'file'; // file.multiple = "multiple"; //批量 file.style.display = 'none'; document.body.appendChild(file); file.onchange = function (e) { var files = e.target.files; // var files = file.files; if (files.length == 0) { // errorback && errorback("没有上传文件"); return; } var f = files[0]; if (!/\.xlsx$/g.test(f.name) && !/\.xls$/g.test(f.name)) { errorback && errorback('仅支持读取xlsx和xls格式!'); return; } callback & callback(f); }; dom.onclick = function () { file.click(); } } // 将excel的binary数据解析成JSON function readWorkbookFromLocalFile(file, callback) { var reader = new FileReader(); reader.onload = function (e) { var data = e.target.result; var workbook = XLSX.read(data, {type: 'binary'}); // var json = JSON.stringify( XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]) ); var json = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]); if (callback) callback(json); }; reader.readAsBinaryString(file); } // 上传方法 end // 下载excel方法 start function downloadExl(data, type) { const wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'};//这里的数据是用来定义导出的格式类型 // const wopts = { bookType: 'csv', bookSST: false, type: 'binary' };//ods格式 // const wopts = { bookType: 'ods', bookSST: false, type: 'binary' };//ods格式 // const wopts = { bookType: 'xlsb', bookSST: false, type: 'binary' };//xlsb格式 // const wopts = { bookType: 'fods', bookSST: false, type: 'binary' };//fods格式 // const wopts = { bookType: 'biff2', bookSST: false, type: 'binary' };//xls格式 var wb = {SheetNames: ['Sheet1'], Sheets: {}, Props: {}}; wb.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(data);//通过json_to_sheet转成单页(Sheet)数据 saveAs(new Blob([s2ab(XLSX.write(wb, wopts))], {type: "application/octet-stream"}), "这里是下载的文件名" + '.' + (wopts.bookType == "biff2" ? "xls" : wopts.bookType)); } function s2ab(s) { if (typeof ArrayBuffer !== 'undefined') { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } else { var buf = new Array(s.length); for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF; return buf; } } //如果不能下载,那么清注释saveAs方法,第八行恢复FileSaver.js的引入 // function saveAs(obj, fileName) { //当然可以自定义简单的下载文件实现方式 // var hrefDom = document.createElement("a"); // hrefDom.download = fileName || '下载.xls'; // hrefDom.href = URL.createObjectURL(obj); //绑定a标签 // hrefDom.style.display = "none"; // document.body.appendChild(hrefDom); // hrefDom.click(); //模拟点击实现下载 // document.body.removeChild(hrefDom); // var set = setTimeout(function () { //延时释放 // URL.revokeObjectURL(obj); //用URL.revokeObjectURL()来释放这个object URL // clearTimeout(set); //释放内存 // set = null; // }, 100); // } // 下载excel方法 end // util start /* * 将json数据转成sheet数据 * */ function toSheet(params) { if (!params) return []; var sheetName = params.sheetName; var datas = params.datas; var i = 0, length = datas.length, data; var _datas = []; for (i; i < length; i++) { data = datas[i]; var key; var _data = {} for (key in sheetName) { _data[sheetName[key]] = data[key] } _datas.push(_data); } return _datas; } /* * 将sheet数据转成json数据 * */ function toJson(params) { if (!params) return []; var sheetName = params.sheetName; var datas = params.datas; var i = 0, length = datas.length, data; var _datas = []; for (i; i < length; i++) { data = datas[i]; var key; var _data = {} for (key in sheetName) { _data[key] = data[sheetName[key]] } _datas.push(_data); } return _datas; } // util end window.sheetJson = { // downloadScript: downloadScript, // addScript: addScript, uploadXls: uploadXls, readWorkbookFromLocalFile: readWorkbookFromLocalFile, downloadExl: downloadExl, // s2ab: s2ab, // saveAs: saveAs, toSheet: toSheet, toJson: toJson }; })
lib/Blob.js代码
/* Blob.js * A Blob implementation. * 2014-05-27 * * By Eli Grey, http://eligrey.com * By Devin Samarin, https://github.com/eboyjr * License: X11/MIT * See LICENSE.md */ /*global self, unescape */ /*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, plusplus: true */ /*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */ (function (view) { "use strict"; view.URL = view.URL || view.webkitURL; if (view.Blob && view.URL) { try { new Blob; return; } catch (e) {} } // Internally we use a BlobBuilder implementation to base Blob off of // in order to support older browsers that only have BlobBuilder var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) { var get_class = function(object) { return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; } , FakeBlobBuilder = function BlobBuilder() { this.data = []; } , FakeBlob = function Blob(data, type, encoding) { this.data = data; this.size = data.length; this.type = type; this.encoding = encoding; } , FBB_proto = FakeBlobBuilder.prototype , FB_proto = FakeBlob.prototype , FileReaderSync = view.FileReaderSync , FileException = function(type) { this.code = this[this.name = type]; } , file_ex_codes = ( "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" ).split(" ") , file_ex_code = file_ex_codes.length , real_URL = view.URL || view.webkitURL || view , real_create_object_URL = real_URL.createObjectURL , real_revoke_object_URL = real_URL.revokeObjectURL , URL = real_URL , btoa = view.btoa , atob = view.atob , ArrayBuffer = view.ArrayBuffer , Uint8Array = view.Uint8Array ; FakeBlob.fake = FB_proto.fake = true; while (file_ex_code--) { FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; } if (!real_URL.createObjectURL) { URL = view.URL = {}; } URL.createObjectURL = function(blob) { var type = blob.type , data_URI_header ; if (type === null) { type = "application/octet-stream"; } if (blob instanceof FakeBlob) { data_URI_header = "data:" + type; if (blob.encoding === "base64") { return data_URI_header + ";base64," + blob.data; } else if (blob.encoding === "URI") { return data_URI_header + "," + decodeURIComponent(blob.data); } if (btoa) { return data_URI_header + ";base64," + btoa(blob.data); } else { return data_URI_header + "," + encodeURIComponent(blob.data); } } else if (real_create_object_URL) { return real_create_object_URL.call(real_URL, blob); } }; URL.revokeObjectURL = function(object_URL) { if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { real_revoke_object_URL.call(real_URL, object_URL); } }; FBB_proto.append = function(data/*, endings*/) { var bb = this.data; // decode data to a binary string if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { var str = "" , buf = new Uint8Array(data) , i = 0 , buf_len = buf.length ; for (; i < buf_len; i++) { str += String.fromCharCode(buf[i]); } bb.push(str); } else if (get_class(data) === "Blob" || get_class(data) === "File") { if (FileReaderSync) { var fr = new FileReaderSync; bb.push(fr.readAsBinaryString(data)); } else { // async FileReader won't work as BlobBuilder is sync throw new FileException("NOT_READABLE_ERR"); } } else if (data instanceof FakeBlob) { if (data.encoding === "base64" && atob) { bb.push(atob(data.data)); } else if (data.encoding === "URI") { bb.push(decodeURIComponent(data.data)); } else if (data.encoding === "raw") { bb.push(data.data); } } else { if (typeof data !== "string") { data += ""; // convert unsupported types to strings } // decode UTF-16 to binary string bb.push(unescape(encodeURIComponent(data))); } }; FBB_proto.getBlob = function(type) { if (!arguments.length) { type = null; } return new FakeBlob(this.data.join(""), type, "raw"); }; FBB_proto.toString = function() { return "[object BlobBuilder]"; }; FB_proto.slice = function(start, end, type) { var args = arguments.length; if (args < 3) { type = null; } return new FakeBlob( this.data.slice(start, args > 1 ? end : this.data.length) , type , this.encoding ); }; FB_proto.toString = function() { return "[object Blob]"; }; FB_proto.close = function() { this.size = this.data.length = 0; }; return FakeBlobBuilder; }(view)); view.Blob = function Blob(blobParts, options) { var type = options ? (options.type || "") : ""; var builder = new BlobBuilder(); if (blobParts) { for (var i = 0, len = blobParts.length; i < len; i++) { builder.append(blobParts[i]); } } return builder.getBlob(type); }; }(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
lib/FileSaver.js代码
/*! FileSaver.js * A saveAs() FileSaver implementation. * 2014-01-24 * * By Eli Grey, http://eligrey.com * License: X11/MIT * See LICENSE.md */ /*global self */ /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ var saveAs = saveAs // IE 10+ (native saveAs) || (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator)) // Everyone else || (function(view) { "use strict"; // IE <10 is explicitly unsupported if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { return; } var doc = view.document // only get URL when necessary in case BlobBuilder.js hasn't overridden it yet , get_URL = function() { return view.URL || view.webkitURL || view; } , URL = view.URL || view.webkitURL || view , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") , can_use_save_link = !view.externalHost && "download" in save_link , click = function(node) { var event = doc.createEvent("MouseEvents"); event.initMouseEvent( "click", true, false, view, 0, 0, 0, 0, 0 , false, false, false, false, 0, null ); node.dispatchEvent(event); } , webkit_req_fs = view.webkitRequestFileSystem , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem , throw_outside = function(ex) { (view.setImmediate || view.setTimeout)(function() { throw ex; }, 0); } , force_saveable_type = "application/octet-stream" , fs_min_size = 0 , deletion_queue = [] , process_deletion_queue = function() { var i = deletion_queue.length; while (i--) { var file = deletion_queue[i]; if (typeof file === "string") { // file is an object URL URL.revokeObjectURL(file); } else { // file is a File file.remove(); } } deletion_queue.length = 0; // clear queue } , dispatch = function(filesaver, event_types, event) { event_types = [].concat(event_types); var i = event_types.length; while (i--) { var listener = filesaver["on" + event_types[i]]; if (typeof listener === "function") { try { listener.call(filesaver, event || filesaver); } catch (ex) { throw_outside(ex); } } } } , FileSaver = function(blob, name) { // First try a.download, then web filesystem, then object URLs var filesaver = this , type = blob.type , blob_changed = false , object_url , target_view , get_object_url = function() { var object_url = get_URL().createObjectURL(blob); deletion_queue.push(object_url); return object_url; } , dispatch_all = function() { dispatch(filesaver, "writestart progress write writeend".split(" ")); } // on any filesys errors revert to saving with object URLs , fs_error = function() { // don't create more object URLs than needed if (blob_changed || !object_url) { object_url = get_object_url(blob); } if (target_view) { target_view.location.href = object_url; } else { if(navigator.userAgent.match(/7\.[\d\s\.]+Safari/) // is Safari 7.x && typeof window.FileReader !== "undefined" // can convert to base64 && blob.size <= 1024*1024*150 // file size max 150MB ) { var reader = new window.FileReader(); reader.readAsDataURL(blob); reader.onloadend = function() { var frame = doc.createElement("iframe"); frame.src = reader.result; frame.style.display = "none"; doc.body.appendChild(frame); dispatch_all(); return; } filesaver.readyState = filesaver.DONE; filesaver.savedAs = filesaver.SAVEDASUNKNOWN; return; } else { window.open(object_url, "_blank"); filesaver.readyState = filesaver.DONE; filesaver.savedAs = filesaver.SAVEDASBLOB; dispatch_all(); return; } } } , abortable = function(func) { return function() { if (filesaver.readyState !== filesaver.DONE) { return func.apply(this, arguments); } }; } , create_if_not_found = {create: true, exclusive: false} , slice ; filesaver.readyState = filesaver.INIT; if (!name) { name = "download"; } if (can_use_save_link) { object_url = get_object_url(blob); // FF for Android has a nasty garbage collection mechanism // that turns all objects that are not pure javascript into 'deadObject' // this means `doc` and `save_link` are unusable and need to be recreated // `view` is usable though: doc = view.document; save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"); save_link.href = object_url; save_link.download = name; var event = doc.createEvent("MouseEvents"); event.initMouseEvent( "click", true, false, view, 0, 0, 0, 0, 0 , false, false, false, false, 0, null ); save_link.dispatchEvent(event); filesaver.readyState = filesaver.DONE; filesaver.savedAs = filesaver.SAVEDASBLOB; dispatch_all(); return; } // Object and web filesystem URLs have a problem saving in Google Chrome when // viewed in a tab, so I force save with application/octet-stream // http://code.google.com/p/chromium/issues/detail?id=91158 if (view.chrome && type && type !== force_saveable_type) { slice = blob.slice || blob.webkitSlice; blob = slice.call(blob, 0, blob.size, force_saveable_type); blob_changed = true; } // Since I can't be sure that the guessed media type will trigger a download // in WebKit, I append .download to the filename. // https://bugs.webkit.org/show_bug.cgi?id=65440 if (webkit_req_fs && name !== "download") { name += ".download"; } if (type === force_saveable_type || webkit_req_fs) { target_view = view; } if (!req_fs) { fs_error(); return; } fs_min_size += blob.size; req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) { fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) { var save = function() { dir.getFile(name, create_if_not_found, abortable(function(file) { file.createWriter(abortable(function(writer) { writer.onwriteend = function(event) { target_view.location.href = file.toURL(); deletion_queue.push(file); filesaver.readyState = filesaver.DONE; filesaver.savedAs = filesaver.SAVEDASBLOB; dispatch(filesaver, "writeend", event); }; writer.onerror = function() { var error = writer.error; if (error.code !== error.ABORT_ERR) { fs_error(); } }; "writestart progress write abort".split(" ").forEach(function(event) { writer["on" + event] = filesaver["on" + event]; }); writer.write(blob); filesaver.abort = function() { writer.abort(); filesaver.readyState = filesaver.DONE; filesaver.savedAs = filesaver.FAILED; }; filesaver.readyState = filesaver.WRITING; }), fs_error); }), fs_error); }; dir.getFile(name, {create: false}, abortable(function(file) { // delete file if it already exists file.remove(); save(); }), abortable(function(ex) { if (ex.code === ex.NOT_FOUND_ERR) { save(); } else { fs_error(); } })); }), fs_error); }), fs_error); } , FS_proto = FileSaver.prototype , saveAs = function(blob, name) { return new FileSaver(blob, name); } ; FS_proto.abort = function() { var filesaver = this; filesaver.readyState = filesaver.DONE; filesaver.savedAs = filesaver.FAILED; dispatch(filesaver, "abort"); }; FS_proto.readyState = FS_proto.INIT = 0; FS_proto.WRITING = 1; FS_proto.DONE = 2; FS_proto.FAILED = -1; FS_proto.SAVEDASBLOB = 1; FS_proto.SAVEDASURI = 2; FS_proto.SAVEDASUNKNOWN = 3; FS_proto.error = FS_proto.onwritestart = FS_proto.onprogress = FS_proto.onwrite = FS_proto.onabort = FS_proto.onerror = FS_proto.onwriteend = null; view.addEventListener("unload", process_deletion_queue, false); saveAs.unload = function() { process_deletion_queue(); view.removeEventListener("unload", process_deletion_queue, false); }; return saveAs; }( typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content )); // `self` is undefined in Firefox for Android content script context // while `this` is nsIContentFrameMessageManager // with an attribute `content` that corresponds to the window if (typeof module !== "undefined" && module !== null) { module.exports = saveAs; } else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) { define([], function() { return saveAs; }); } else if(typeof Meteor !== 'undefined') { // make it available for Meteor Meteor.saveAs = saveAs; }
lib/xlsx.core.min.js下载地址
下载地址1:http://yueqingfang.cn/exportJson/lib/xlsx.core.min.js
下载地址2:http://oss.sheetjs.com/js-xlsx/xlsx.core.min.js