js 实现导入导出功能(FileSave.js)

 点击导出按钮弹出文件框导出文件,点击导入选择文件获取文件数据,以下我保存的是json。

html: 

<div class="layui-inline">  
    <div class="layui-btn-group">
         <button type="button" class="layui-btn layui-btn-normal layui-btn-sm"  onclick="exportEditFile()">导入</button>
         <input type="file" id="importEditFile" accept=".json" onchange="uploadEditFile(this)" style="width:0;visibility:hidden;opacity: 0">
         <button type="button" class="layui-btn layui-btn-normal layui-btn-sm"  onclick="importEditFile()">导出</button>
     </div>
</div>


//需要引用 FileSaver.js

js: 

function SceneFileSaveAs(obj, name) {
    let content = JSON.stringify(obj, null, 4);
    let blob = new Blob([content], { type: "text/plain;charset=utf-8" });
    saveAs(blob, name);
}

//导出文件
function exportEditFile() { 
    //文件的json数据
    let testobj = {
        "id": 1,
        "name": "11"
    };
    //保存的文件名
    let fileName =  "file_" + localStorage.getItem("ip") + ".json";
    SceneFileSaveAs(testobj, fileName);
}
//导入文件
function importEditFile() {
    $("#importEditFile").click();
}
// 导入
function uploadEditFile(input) {
    //支持chrome IE10
    let file = input.files[0];//获取读取的File对象
    let filepath = file.name;//读取选中文件的文件名
    let filename = file.name.split(".")[0];
    let size = file.size;//读取选中文件的大小
    console.log("文件名:" + filepath + "大小:" + size); 
    if (window.FileReader) {
        console.log("window.FileReader")
        var reader = new FileReader();
        console.log(" reader.onload");
        reader.readAsText(file);//读取文件的内容
        reader.onload = function () {
            console.log(" reader.onload----------------")
            let myresult = this.result;//当读取完成之后会回调这个函数,然后此时文件的内容存储到了result中。直接操作即可。
            input.value = "";
            if(isJSON(myresult)){
                let myresult1 = JSON.parse(myresult);
                console.log(myresult1);
                SceneEditSend(myresult1);
            }else {
                console.log("文件内容格式异常");
            }
        }
        // reader.readAsText(file);
    }
}
//拿到json文件里的数据
function SceneEditSend(data) {
    console.log(data.name);
}

 FileSaver.js 框架代码:

/* FileSaver.js
 * A saveAs() FileSaver implementation.
 * 2014-11-29
 *
 * By Eli Grey, http://eligrey.com
 * License: X11/MIT
 *   See https://github.com/eligrey/FileSaver.js/blob/master/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 Blob.js hasn't overridden it yet
            , get_URL = function() {
                return view.URL || view.webkitURL || view;
            }
            , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
            , can_use_save_link = "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
            // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and
            // https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047
            // for the reasoning behind the timeout and revocation flow
            , arbitrary_revoke_timeout = 500 // in ms
            , revoke = function(file) {
                var revoker = function() {
                    if (typeof file === "string") { // file is an object URL
                        get_URL().revokeObjectURL(file);
                    } else { // file is a File
                        file.remove();
                    }
                };
                if (view.chrome) {
                    revoker();
                } else {
                    setTimeout(revoker, arbitrary_revoke_timeout);
                }
            }
            , 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
                    , 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_URL().createObjectURL(blob);
                        }
                        if (target_view) {
                            target_view.location.href = object_url;
                        } else {
                            var new_tab = view.open(object_url, "_blank");
                            if (new_tab == undefined && typeof safari !== "undefined") {
                                //Apple do not allow window.open, see http://bit.ly/1kZffRI
                                view.location.href = object_url
                            }
                        }
                        filesaver.readyState = filesaver.DONE;
                        dispatch_all();
                        revoke(object_url);
                    }
                    , 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_URL().createObjectURL(blob);
                    save_link.href = object_url;
                    save_link.download = name;
                    click(save_link);
                    filesaver.readyState = filesaver.DONE;
                    dispatch_all();
                    revoke(object_url);
                    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
                // Update: Google errantly closed 91158, I submitted it again:
                // https://code.google.com/p/chromium/issues/detail?id=389642
                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();
                                        filesaver.readyState = filesaver.DONE;
                                        dispatch(filesaver, "writeend", event);
                                        revoke(file);
                                    };
                                    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.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;
            dispatch(filesaver, "abort");
        };
        FS_proto.readyState = FS_proto.INIT = 0;
        FS_proto.WRITING = 1;
        FS_proto.DONE = 2;

        FS_proto.error =
            FS_proto.onwritestart =
                FS_proto.onprogress =
                    FS_proto.onwrite =
                        FS_proto.onabort =
                            FS_proto.onerror =
                                FS_proto.onwriteend =
                                    null;

        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;
    });
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下步骤来实现文件导入导出功能: 1. 安装 antd 和 xlsx 库 ``` npm install ant-design-vue xlsx --save ``` 2. 在 Vue 组件中引入 antd 和 xlsx ```javascript import { Button, Upload, message } from 'ant-design-vue'; import XLSX from 'xlsx'; ``` 3. 在 Vue 组件中添加上传组件和下载按钮 ```html <template> <div> <a-button type="primary" @click="downloadExcel">下载Excel模板</a-button> <a-upload :before-upload="beforeUpload" :show-upload-list="false"> <a-button>上传Excel文件</a-button> </a-upload> </div> </template> ``` 4. 实现下载 Excel 模板功能 ```javascript downloadExcel() { const fileName = 'example.xlsx'; const headers = ['姓名', '年龄', '性别']; const data = [['张三', 18, '男'], ['李四', 20, '女'], ['王五', 22, '男']]; const worksheet = XLSX.utils.aoa_to_sheet([headers, ...data]); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); XLSX.writeFile(workbook, fileName); } ``` 5. 实现上传 Excel 文件功能 ```javascript beforeUpload(file) { const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result; const workbook = XLSX.read(data, { type: 'binary' }); const worksheet = workbook.Sheets[workbook.SheetNames[0]]; const headers = ['姓名', '年龄', '性别']; const fields = ['name', 'age', 'gender']; const records = XLSX.utils.sheet_to_json(worksheet, { header: headers, range: 1 }); const valid = records.every((record) => fields.every((field) => record[field])); if (valid) { // 调用后端接口保存数据 message.success('上传成功'); } else { message.error('上传失败,请检查文件格式'); } }; reader.readAsBinaryString(file); return false; } ``` 在 beforeUpload 方法中,我们使用 FileReader 对象读取上传的文件内容,并使用 XLSX 库解析 Excel 文件。如果文件格式正确,就将数据传递给后端接口进行保存,否则提示用户上传失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值