vue excel 数据导入导出 总结

安装依赖:
npm install -S file-saver
npm install -D script-loader
npm install xlsx
npm i element-ui -S(这里导出的时候会用到)

**

场景一(导入excel)

**
直接上代码(excel一定不能是加密文件**,否则读取出来的是乱码**)

<template>
  <div>
    <input
      type="file"
      @change="importf(this)"
      accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
    />
  </div>
</template>
<script>
import XLSX from "xlsx"; // npm导入库,命令:npm i xlsx@^0.14.1 -s

export default {
  data() {
    return {
      accountList: []
    };
  },
  methods: {
    importf(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就是你想要的东西 excel导入的数据

          outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
          // excel 数据再处理
          let arr = [];

          outdata.map(v => {
            let obj = {};
            obj.name = v["姓名"];//姓名对应的表头名称

            obj.phone = v["手机号"];

            arr.push(obj);
          });

          _this.accountList = [...arr];
          _this.$emit('sendLists',_this.accountList);//此处需要给父组件传值,看需求写
          console.log(_this.accountList)

          //          _this.reload();
        };

        reader.readAsArrayBuffer(f);
      };

      if (rABS) {
        reader.readAsArrayBuffer(f);
      } else {
        reader.readAsBinaryString(f);
      }
    }
  }
};
</script>
<style scoped>
.in-file,
.cont h2 {
  text-align: center;
}
</style>

场景二(table导出excel)

前提条件:
main.js写入

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

如图所示:

在这里插入图片描述
在/src目录下新建一个vendor(名字也可自取)文件夹,存入Export2Zip.js和Export2Excel.js文件。
下载地址:
https://github.com/penpeng617/excel
目录结构如图所示:
在这里插入图片描述

新建下载的组件
组件代码

<template>
  <div>
    <div class='downExcel'>
        <el-button
        class="filter-item"
        type="primary"
        icon="el-icon-download"
        @click="handleDownload"
      >下载excel</el-button>
    </div>
    <!-- sortable是否排序 -->
    <el-table id="excel-table" ref="filterTable" :data="tableList" style="width: 100%">
      <el-table-column prop="name" label="姓名"  width="180"></el-table-column>
      <el-table-column prop="phone" label="手机号"  width="180" column-key="date"></el-table-column>
      <el-table-column prop="id" label="中奖等次" sortable width="180"></el-table-column>
      <el-table-column prop="prizename" label="奖项名称" width="180"></el-table-column>
      <el-table-column prop="prize" label="礼品"></el-table-column>
      <el-table-column prop="tag" label="是否已领取" width="100" filter-placement="bottom-end"></el-table-column>
    </el-table>
    
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableList: [
        {
        name: "张三",
        phone: "14696458722",
        id: 2,
        prizename: "二等奖",
        prize: "耳机一个",
        tag: "未领取",
      },{
        name: "杜军",
        phone: "13599994444",
        id: 2,
        prizename: "二等奖",
        prize: "手机一个",
        tag: "已领取",
      },{
        name: "李四",
        phone: "15877774512",
        id: 2,
        prizename: "二等奖",
        index: 1,
        prize: "耳机一个",
        tag: "未领取",
      },
      ]
    };
  },
  methods: {
    handleDownload() {
      // this.downloadLoading = true;
      import("@/vendor/Export2Excel").then(excel => {
        const tHeader = ["姓名", "手机号",  "奖项名称", "礼品", "是否已领取"]; //要导出后表头是什么,可以跟tableDate中的表头不一致
        const filterVal = ["name", "phone",  "prizename",  "prize", "tag"];
        const data = this.formatJson(filterVal, this.tableList);

        // const data = this.tableList;
        excel.export_json_to_excel({
          header: tHeader,
          data,
          filename: "lottery-winner" //导出文件的名,自定义就好
        });
        // this.downloadLoading = false;
      });
    },
    //下载方法中,需要用到的格式化json的方法
    formatJson(filterVal, jsonData) {
      return jsonData.map(v =>
        filterVal.map(j => {
          if (j === "id") {
            //此处如没有要格式化的列,可以不用此判断
            // return parseTime(v[j])
            return v[j];
          } else {
            return v[j];
          }
        })
      );
    }
  }
};
</script>
<style scoped>
.downExcel{text-align:right;background:#fff}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值