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>
View Code

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>
View Code

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
    };
})
View Code

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
    };
})
View Code

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(/^[objects(.*)]$/)[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));
View Code

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.[ds.]+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;
}
View Code

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

原文地址:https://www.cnblogs.com/huoan/p/10963328.html