• 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

  • 相关阅读:
    自定义Dialog
    AlertDialog
    Toast
    WebView
    《构建之法》阅读笔记3
    UI组件之GridView
    ScrollView&HorizontalScrollView
    UI组件之ImageView
    UI组件之ListView
    每周总结(1.24)
  • 原文地址:https://www.cnblogs.com/huoan/p/10963328.html
Copyright © 2020-2023  润新知