一般来讲导出都是后端完成逻辑,给接口给到前端,前端调用接口简单处理导出就可以了,但是上次我们公司做内部使用的后台,认为数据量小,前端导出实时更快,于是也有了前端导出的方式,做个总结。

先过一下后端导出的做法以及需要注意的一些点:

//我是事先封装了一个请求的方法,然后是正常的请求,只是需要注意的是要加一个responseType: 'blob',因为后端返回的就是一个blob类型
export function getDetailExcel (params) {
  return request({
    url: '/detailExcel',
    method: 'get',
    responseType: 'blob',
    params
  })
}

getDetailExcel(this.detailExcelQueryData).then(data => {
  const url = window.URL.createObjectURL(new Blob([data]))
  const link = document.createElement('a')
  link.style.display = 'none'
  link.href = url
  link.setAttribute(
    'download',
    `用户数据.xls`
  )
  document.body.appendChild(link)
  link.click()
})

前端导出的话我是通过调用查询接口,拼接数据然后导出:

// 导出数据
    exportDataFe () {
      // const tipText = this.textFormat()
      this.$confirm(`确定导出数据吗?`, '提示', {
        confirmButt·onText: '确定',
        cancelButtonText: '取消',
        closeOnClickModal: false
      }).then(() => {
        this.requestTimes = 0
        this.excelCount = 1
        this.exportList = []
        this.exporting = true
        const query = Object.assign({}, this.exportReuqireData)
        query.pageIndex = 0
        query.pageSize = this.requestSize
        getWxusers(query)
          .then((res) => {
            if (res.total <= this.requestSize) {
              this.exportList = this.formatJson(res.users)
              this.exportExcel()
            } else {
              let total = res.total
              if (res.total > this.maxSize) {
                total = this.maxSize
                this.$message({
                  message: '单次最多可下载10万条数据',
                  duration: 5000,
                  type: 'warning'
                })
              }

              // 先判断有多少个文件
              this.excelCount = Math.ceil(total / this.excelSize)
              if (this.excelCount > 1) {
                this.requestTimes = Math.ceil(
                  (total - (this.excelCount - 1) * this.excelSize) /
                    this.requestSize
                )
                for (let k = 0; k < this.excelCount - 1; k++) {
                  this.combinedData(10, k)
                }
                this.combinedData(this.requestTimes, this.excelCount - 1)
              } else {
                this.requestTimes = Math.ceil(total / this.requestSize)
                this.combinedData(this.requestTimes)
              }
            }
          })
          .catch(() => {
            this.exporting = false
          })
      })
    },

    combinedData (requestTimes, fileOrder) {
      const alOrder = fileOrder || 0
      let allRequest = []
      for (var i = 0; i < requestTimes; i++) {
        const query = Object.assign({}, this.exportReuqireData)
        query.pageSize = this.requestSize
        query.pageIndex = i * query.pageSize + alOrder * this.excelSize
        allRequest.push([i, query])
      }
      allRequest = allRequest.map((item, index) => {
        return getWxusers(item[1])
      })
      Promise.all(allRequest).then((values) => {
        values.forEach((item) => {
          const list = this.formatJson(item.users)
          this.exportList = this.exportList.concat(list)
        })
        let order
        if (fileOrder === undefined) {
          order = 0
        } else {
          order = ++fileOrder
        }
        this.exportExcel(order)
        this.excelCount = this.excelCount - 1
      })
    },

    // 下载表格
    exportExcel (fileOrder) {
      import('@/vendor/Export2Excel').then((excel) => {
        // const fileText = this.textFormat()
        const tHeader = [
          'Id',
          '手机号',
          '学生姓名',
          '学校名称',
          '学校id',
          '会员等级',
          '会员激活时间',
          '会员到期时间',
          '省份',
          '高中所在学校'
        ]
        const data = this.exportList
        // const fileName = `AI升学宝用户${fileText}数据` + (fileOrder ? '(' + fileOrder + ')' : '')
        const fileName =
          `AI升学宝用户数据` + (fileOrder ? '(' + fileOrder + ')' : '')
        excel.export_json_to_excel({
          header: tHeader,
          data,
          filename: fileName,
          autoWidth: true,
          bookType: 'xlsx'
        })
        this.downloadLoading = false
        this.exportList = []
        this.exporting = false
        this.$message({
          message: '用户数据已导出',
          duration: 5000,
          type: 'success'
        })
      })
    },
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐