美文网首页Vue随笔-生活工作点滴
vue - Excel表格导入、导出组件

vue - Excel表格导入、导出组件

作者: 可怜的小黑兔 | 来源:发表于2019-07-08 17:55 被阅读56次

1、先安装了2个依赖:

npm install -S file-saver xlsx
npm install -D script-loader

2、在src目录下新建一个excel文件夹引入Blob.js和expor2Excal.js

Blob.js和expor2Excal.js //可网上下载

3、在main.js中全局引入:

import Blob from './excel/Blob.js'
import Export2Excel from './excel/Export2Excel.js'

4、父组件引用子组件,通过点击将配置参数传给子组件 并 调用子组件内的导入、导出方法,
导入时通过$emit将处理过的json返给父组件,将json传给后端即可

//父组件
<template>
  <div class="excel">
    <div class="importExcel">
      <label for="upload">导入</label>
      <input id="upload" type="file" @change="importExcel()" 
        accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" 
      />
    </div>
    <div class="exportExcel" @click="exportExcel()">导出</div>
    <v-excel ref="excel" @importRequest="importRequest"></v-excel>
  </div>
</template>

<script>
  import VExcel from '@/components/Excel';
  export default {
    methods: {
      importExcel() { //导入
        let importData = {
          file: event.currentTarget.files[0], //导入时上传的文件
          tHeader: ['姓名', '年龄', '大小'], //表格头部名称
          filterVal: ['name', 'age', 'dx']  //数据库的字段名
        }
        this.$refs.excel.importExcel(importData);
      },
      importRequest(e) { //子组件返回的json表格数据,传给后端入库
        console.log(e)
      },
      exportExcel() { //导出
        let exportData = {
          title: "excel文件名", //导出的文件名
          data: [ //要导出的数据
            {contacts: '1',address: '2',department: '3'},
            {contacts: '5',address: '4',department: '6'}
          ],
          tHeader: ['联系人', '地址', '部门'], //要导出表格的头部名称
          filterVal: ['contacts', 'address', 'department'] //要导出的数据字段名
        }
        this.$refs.excel.exportExcel(exportData);
      }
    },
    components: {
      VExcel
    }
  }
</script>

<style scoped>
  .excel{
    width: 150px;
    display: flex;
    justify-content: space-between;
  }
  .importExcel label,.exportExcel{
    color: #FFF;
    background-color: #409EFF;
    border-color: #409EFF;
    display: inline-block;
    line-height: 1;
    white-space: nowrap;
    cursor: pointer;
    -webkit-appearance: none;
    text-align: center;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    outline: 0;
    margin: 0;
    -webkit-transition: .1s;
    transition: .1s;
    font-weight: 500;
    -moz-user-select: none;
    padding: 12px 20px;
    font-size: 14px;
    border-radius: 4px;
  }
  .importExcel input{
    display: none;
  }
</style>
//子组件
<template>
  <div></div>
</template>

<script>
  export default {
    methods: {
      importExcel(res) {
        let that = this;
        this.file = res.file;
        var rABS = false; //是否将文件读取为二进制字符串
        var f = this.file;
        var reader = new FileReader();
        FileReader.prototype.readAsBinaryString = function(f) {
          var binary = "";
          var rABS = false; //是否将文件读取为二进制字符串
          var wb; //读取完成的数据
          var outdata;
          var reader = new FileReader();
          reader.onload = function() {
            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]]);
            let arr = [];
            outdata.map(v => {
              let obj = {};
              for (var i=0; i<res.tHeader.length; i++){
                obj[ res.filterVal[i] ] = v[ res.tHeader[i] ]
              }
              arr.push(obj);
            })
            that.$emit("importRequest",arr); //将处理好的json表格数据传给父组件
          }
          reader.readAsArrayBuffer(f);
        }
        if(rABS) {
          reader.readAsArrayBuffer(f);
        } else {
          reader.readAsBinaryString(f);
        }
      },
      exportExcel(res) {
        require.ensure([], () => {
          const {export_json_to_excel} = require('@/excel/Export2Excel');//引入文件
          const data = this.formatJson(res.filterVal, res.data); //想要导出的数据
          export_json_to_excel(res.tHeader, data, res.title);
        });
      },
      formatJson(filterVal, jsonData) {
        return jsonData.map(v => filterVal.map(j => v[j]));
      }
    }
  }
</script>

相关文章

网友评论

    本文标题:vue - Excel表格导入、导出组件

    本文链接:https://www.haomeiwen.com/subject/tlmahctx.html