Bootstrap

vue 纯前端导出 Excel

方法一:

1、安装"file-saver"

npm i -S file-saver xlsx

2、引入

在需要导出功能的 .vue 文件中引入

import FileSaver from "file-saver";
import XLSX from "xlsx";

3、简单示例(复制即可食用): 

<template>
  <div>
    <div class="buttons">
      <button class="custom-btn btn-5" @click="exportExcel">
        <span>导出excel文件</span>
      </button>
    </div>
    <el-table id="table-box" resizable show-overflow :data="tableData" border>
      <el-table-column type="index" label="序号" width="50"></el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        width="200"
        :show-overflow-tooltip="true"
        align="center"
      ></el-table-column>
      <el-table-column
        prop="sex"
        label="性别"
        width="200"
        :show-overflow-tooltip="true"
        align="center"
      ></el-table-column>
    </el-table>
  </div>
</template>

<script>
import FileSaver from "file-saver";
import XLSX from "xlsx";

export default {
  data() {
    return {
      tableData: [
        { id: 10001, name: "张三", sex: "男" },
        { id: 10002, name: "李四", sex: "男" },
        { id: 10003, name: "王五", sex: "男" },
      ],
    };
  },
  mounted() {},
  methods: {
    getCurrentDate() {
      const today = new Date();
      let date = today.getFullYear() + "-";
      date += (today.getMonth() + 1).toString().padStart(2, "0") + "-";
      date += today.getDate().toString().padStart(2, "0");
      return date;
    },
    // 定义导出Excel表格事件
    exportExcel() {
      const timeInfo = this.getCurrentDate();
      var xlsxParam = { raw: true };
      let abc = document.querySelector("#table-box");
      console.log(abc);

      /* 从表生成工作簿对象 */
      var wb = XLSX.utils.table_to_book(
        document.querySelector("#table-box"),
        xlsxParam
      );
      // 给每一列 设置宽度大小
      wb["Sheets"]["Sheet1"]["!cols"] = [
        { wpx: 60 }, // 1
        { wpx: 60 }, // 2
        { wpx: 100 }, // 3
        { wpx: 100 }, // 4
        { wpx: 60 }, // 5
        { wpx: 60 }, // 6
        { wpx: 60 }, // 7
        { wpx: 60 }, // 8
        { wpx: 60 }, // 7
        { wpx: 60 }, // 8
      ];
      /* 获取二进制字符串作为输出 */
      var wbout = XLSX.write(wb, {
        bookType: "xlsx",
        bookSST: true,
        type: "array",
      });
      try {
        FileSaver.saveAs(
          // Blob 对象表示一个不可变、原始数据的类文件对象。
          // Blob 表示的不一定是JavaScript原生格式的数据。
          // File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
          // 返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
          new Blob([wbout], { type: "application/octet-stream" }),
          // 设置导出文件名称
          "自定义查询导出" + timeInfo + ".xlsx"
        );
      } catch (e) {
        if (typeof console !== "undefined") console.log(e, wbout);
      }
      return wbout;
    },
  },
};
</script>
<style lang="scss" scoped>
.buttons {
  margin-bottom: 10px;
}
.custom-btn {
  width: 130px;
  height: 40px;
  color: #fff;
  border-radius: 5px;
  padding: 10px 25px;
  font-family: "Lato", sans-serif;
  font-weight: 500;
  background: transparent;
  cursor: pointer;
  transition: all 0.3s ease;
  position: relative;
  display: inline-block;
  box-shadow: inset 2px 2px 2px 0px rgba(255, 255, 255, 0.5),
    7px 7px 20px 0px rgba(0, 0, 0, 0.1), 4px 4px 5px 0px rgba(0, 0, 0, 0.1);
  outline: none;
}
.btn-5 {
  width: 130px;
  height: 40px;
  line-height: 42px;
  padding: 0;
  border: none;
  background: rgb(255, 27, 0);
  background: linear-gradient(
    0deg,
    rgba(255, 27, 0, 1) 0%,
    rgba(251, 75, 2, 1) 100%
  );
}
.btn-5:hover {
  color: #f0094a;
  background: transparent;
  box-shadow: none;
}
.btn-5:before,
.btn-5:after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  height: 2px;
  width: 0;
  background: #f0094a;
  box-shadow: -1px -1px 5px 0px #fff, 7px 7px 20px 0px #0003,
    4px 4px 5px 0px #0002;
  transition: 400ms ease all;
}
.btn-5:after {
  right: inherit;
  top: inherit;
  left: 0;
  bottom: 0;
}
.btn-5:hover:before,
.btn-5:hover:after {
  width: 100%;
  transition: 800ms ease all;
}
</style>

方法二:

1、安装"vue-json-excel"

npm install vue-json-excel -S

2、在项目的入口文件(main.js)中引入

import Vue from 'vue'
import JsonExcel from 'vue-json-excel'
 
Vue.component('downloadExcel', JsonExcel)

3、简单示例(复制即可食用):

<template>
  <div>
    <el-row>
      <el-col :span="6"> </el-col>
      <el-col :span="12">
        <h1>{{ msg }}</h1>
        <download-excel
          v-if="json_data.length >= 0"
          class="el-button"
          :data="json_data"
          :fields="json_fields"
          worksheet="My Worksheet"
          name="用户信息列表"
        >
          导出Excel
        </download-excel>
      </el-col>
      <el-col :span="6"> </el-col>
    </el-row>
    <el-table :data="json_data" border style="width: 100%">
      <el-table-column prop="type" label="序号" align="center" width="180">
      </el-table-column>
      <el-table-column prop="userName" label="姓名" align="center" width="180">
      </el-table-column>
      <el-table-column prop="age" align="center" label="年龄">
      </el-table-column>
      <el-table-column prop="phone" align="center" label="手机号">
      </el-table-column>
      <el-table-column prop="createTime" align="center" label="注册时间">
      </el-table-column>
    </el-table>
  </div>
</template>
 
<script>
import JsonExcel from "vue-json-excel";

export default {
  name: "HelloWorld",
  components: {
    downloadExcel: JsonExcel,
  },
  data() {
    return {
      msg: "使用vue-json-excel插件导出Excel",
      json_fields: {
        //导出Excel表格的表头设置
        序号: "type",
        姓名: "userName",
        年龄: "age",
        手机号: "phone",
        注册时间: "createTime",
      },
      json_data: [
        {
          userName: "张三",
          age: 18,
          phone: 15612345612,
          createTime: "2019-10-22",
        },
        {
          userName: "李四",
          age: 17,
          phone: 15612345613,
          createTime: "2019-10-23",
        },
        {
          userName: "王五",
          age: 19,
          phone: 15612345615,
          createTime: "2019-10-25",
        },
        {
          userName: "赵六",
          age: 18,
          phone: 15612345618,
          createTime: "2019-10-15",
        },
      ],
    };
  },
  created() {
    this.initList();
  },
  methods: {
    initList() {
      for (let i in this.json_data) {
        this.json_data[i].type = parseInt(i) + 1;
      }
    },
  },
};
</script>
<style scoped>
.el-button {
  background-color: lightskyblue;
}
</style>

;