Vue实现导出功能(无后端配合)

正常导出是后端来做,我们去调用后端接口,会返回给我们文件(前端即:axios请求,设置responseType: blob,然后创建一个a标签,通过window.URL.createObjectURL将blob转为一个路径,为a标签增加download属性,给其一个文件名称,执行click事件即可下载);但是没有后端的情况下怎么做呢?下面来简单介绍一下:

首先安装两个插件

npm i file-saver -S
npm i xlsx -S

组件中使用(按需引入)

<el-button icon="el-icon-download" @click="downloadTpl()" size="small">导出</el-button>

<el-table
  id="myTable"
  :data="dataList"
  size="medium"
  border
  @selection-change="selectionChangeHandle"
  v-loading="loading"
  class="table"
>
  <!-- ... -->
</el-table>
<script>
import * as XLSX from xlsx
import FileSaver from file-saver
export default {
  methods: {
    // 导出
    downloadTpl() {
      let wb = XLSX.utils.table_to_book(document.getElementById(myTable), { raw: true })
      wb.Sheets.Sheet1 = this.delRepeat(wb.Sheets.Sheet1) // 去掉wb.Sheets.Sheet1对象中重复的value的属性
      // console.log(wb, ----->>>)
      let wbout = XLSX.write(wb, {
        bookType: xlsx,
        bookSST: true,
        type: array
      })
      // console.log(wbout, wbout----->>>)
      try {
        FileSaver.saveAs(
          //Blob 对象表示一个不可变、原始数据的类文件对象、不一定是JavaScript原生格式的数据
          //File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
          //返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
          new Blob([wbout], { type: "application/octet-stream" }),
          //设置导出文件名称
          "订单.xlsx"
        );
      } catch(e) {
        console.error(e, wbout, ----->>>)
      }
      // return wbout
    },
    // 对象去重
    delRepeat(obj) {
      let noRepeat = {}
      for(let key in obj) {
        let flag = true
        for(let k in noRepeat) {
          if(JSON.stringify(noRepeat[k]) == JSON.stringify(obj[key])) {
            flag = false
          }
        }
        if(flag) {
          noRepeat[key] = obj[key]
        }
      }
      return noRepeat
    }
  }
}
</script>

也可以把方法抽离出来,接受两个形参,分别是dom元素(table表格)的id 和导出的文件的名称

经验分享 程序员 微信小程序 职场和发展