vue.js前端导入Excel文档

导入Excel文档功能实现大体有两种方式,一是前端解析后将数据返回给后端,另一种是前端直接返回Excel文档给后台,后台进行处理。在数据量小的情况下,第一种方式是可以接受的,如果数据量多的话还是让后台处理吧。究竟哪种方法更好,需要根据具体业务实现,下面简单说一下这两种方法是怎么实现的。

一、vue.js前端解析数据。

1、在vue中使用导入导出,需要下载3个依赖包和2个js包。这里说的是npm安装

 使用npm安装:

 npm install -S file-saver xlsx(这里其实安装了2个依赖)

 npm install -D script-loader

2、在vue页面引入js。

3、写一个导入的弹出页面(初始隐藏)

<el-dialog title="导入文件" :visible.sync="excelImportShow">

        <a href="javascript:;" class="file">

            <input id="upload" type="file" @change="importfxx(this)" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />

        </a>

        <!-- <input type="file" οnchange="importf(this)" /> -->

        <div id="demo"></div>

        <div slot="footer" class="dialog-footer">

            <el-button @click.native="excelImportShow = false">取消</el-button>

            <el-button type="primary" @click.native="excelImportSub" :loading="addLoading">提交</el-button>

        </div>

    </el-dialog>

 

4、添加js方法解析Excel文档

importfxx(obj) {

                let _this = this;

                let inputDOM = this.$refs.inputer;

                // 通过DOM取文件数据

                this.file = event.currentTarget.files[0];

                var rABS = false; //是否将文件读取为二进制字符串

                var f = this.file;

                var reader = new FileReader();

                //if (!FileReader.prototype.readAsBinaryString) {

                FileReader.prototype.readAsBinaryString = function(f) {

                    var binary = "";

                    var rABS = false; //是否将文件读取为二进制字符串

                    var pt = this;

                    var wb; //读取完成的数据

                    var outdata;

                    var reader = new FileReader();

                    reader.onload = function(e) {

                        var bytes = new Uint8Array(reader.result);

                        var length = bytes.byteLength;

                        for(var i = 0; i < length; i++) {

                            binary += String.fromCharCode(bytes[i]);

                        }

                        var XLSX = require('xlsx');

                        if(rABS) {

                            wb = XLSX.read(btoa(fixdata(binary)), { //手动转化

                                type: 'base64'

                            });

                        } else {

                            wb = XLSX.read(binary, {

                                type: 'binary'

                            });

                        }

                        outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);//outdata就是你想要的东西

                        this.da = [...outdata]

                        let arr = []

                        console.log(outdata);

                        this.da.map(v => {

                            let obj = {}

                            obj.id = v.id

                            obj.status = v.status

                            arr.push(obj)

                        })

                        let para = {

                            //withList: JSON.stringify(this.da)

                            withList: arr

                        }

                        _this.$message({

                            message: '请耐心等待导入成功',

                            type: 'success'

                        });

                        // withImport(para).then(res => {

                        //  window.location.reload()

                        // })

                        

                    }

                    reader.readAsArrayBuffer(f);

                }

                if(rABS) {

                    reader.readAsArrayBuffer(f);

                } else {

                    reader.readAsBinaryString(f);

                }

            }

5、测试

Excel模板+页面展示效果

二、直接传文件至后台,交由后台解析

1、首先新增导入上传弹窗

<el-dialog title="导入文件" :visible.sync="excelImportShow">

        <el-upload class="upload-demo" :limit="1" :file-list="fileList" :before-upload="beforeUpload">

            <el-button slot="trigger" size="small" type="primary">选取文件</el-button>

            <div slot="tip" class="el-upload__tip">只能上传excel文件</div>

            <a href="/financial-admin/exportInOutBusiClass-excel" rel="external nofollow" download="模板">

            <el-button size="small" type="success">下载模板</el-button></a>

            <div slot="tip" class="el-upload-list__item-name">{{fileName}}</div>

        </el-upload>

        <div slot="footer" class="dialog-footer">

            <el-button @click.native="excelImportShow = false">取消</el-button>

            <el-button type="primary" @click.native="submitUpload()" :loading="addLoading">提交</el-button>

        </div>

    </el-dialog>

2、js方法

beforeUpload(file){

                console.log(file,'文件');

                this.files = file;

                const extension = file.name.split('.')[1] === 'xls'

                const extension2 = file.name.split('.')[1] === 'xlsx'

                // const isLt2M = file.size / 1024 / 1024 < 5(校验上传文件的大小)

                if (!extension && !extension2) {

                    this.$message.warning('上传文档只能是 xls、xlsx格式!')

                    return

                }

                // if (!isLt2M) {

                //  this.$message.warning('上传模板大小不能超过 5MB!')

                //  return

                // }

                console.log(file.name);

                this.fileName = file.name;

                return false // 返回false不会自动上传

            },

            submitUpload() {

              if(this.fileName == ""){

                   this.$message.warning('请选择要上传的文件!')

                   return false

              }

              let fileFormData = new FormData();

              fileFormData.append('file', this.files);//filename是键,file是值,就是要传的文件,test.zip是要传的文件名

            importBdDeptdoc(fileFormData).then((res) => {

                    this.addLoading = false;

                    this.$message({

                        message: '导入成功',

                        type: 'success'

                    });

                    this.getUsers();//重新请求一次页面数据

                })

          },

后台请求:(注意heads)

export function importBdDeptdoc(data) {

return request2({

url: '/financial-admin/importCostType',

method: 'post',

data,

headers: {

'Content-Type': 'multipart/form-data'

}

})

}

参考文档:https://www.cnblogs.com/liguiwang/p/8430672.html

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值