vue添加excel导出

参考url:

https://xuliangzhan.github.io/vxe-table/#/table/other/xlsx

https://github.com/xuliangzhan/vxe-table/blob/master/examples/views/table/other/Xlsx.vue

1.install包

npm i xlsx

npm i file-saver

import XLSX from 'xlsx'
import FileSaver from 'file-saver'

2.添加按钮

<a-button type="primary" size="small" class="vaa" @click="exportEventSelect">Excel导出</a-button>

3.添加table

<vxe-grid
  border
  ref="xGrid2"
  height="300"
  :span-method="rowspanMethod"//定义列合并方法
  :columns="tableColumn"//定义列
  :data="reportTableData"></vxe-grid>//定义表格数据源

4.添加js,包含标题和非标题

//add start
,exportEvent () {
  // 转换数据
  let table = this.getExportDataAll(true);
  // let table = this.$refs.xGrid2.$el.querySelector('.body--wrapper>.vxe-table--body')
  let book = XLSX.utils.book_new()
  let sheet = XLSX.utils.table_to_sheet(table)
  XLSX.utils.book_append_sheet(book, sheet)
  let wbout = XLSX.write(book, { bookType: 'xlsx', bookSST: false, type: 'binary' })
  let blob = new Blob([this.toBuffer(wbout)], { type: 'application/octet-stream' })
  // 保存导出
  FileSaver.saveAs(blob, '数据导出.xlsx')
}
, getExportDataAll (isHead) {
  let datas = this.$refs.xGrid2.$el.querySelector('.body--wrapper>.vxe-table--body')
  console.log("getExportDataAll");
  console.log(datas);
  let columns = this.tableColumn.filter(item => item.field)
  let headers = isHead ? [columns.map(item => item.title)] : []
  return headers.concat(
    datas.map(row => {
      return columns.map(column => {
        return row[column.field]
      })
    })
  )
}
,exportEventSelect () {
  // 对数据预处理
  let data = this.getExportData(true)
  // 转换数据
  let book = XLSX.utils.book_new()
  let sheet = XLSX.utils.json_to_sheet(data, { skipHeader: true })
  XLSX.utils.book_append_sheet(book, sheet)
  let wbout = XLSX.write(book, { bookType: 'xlsx', bookSST: false, type: 'binary' })
  let blob = new Blob([this.toBuffer(wbout)], { type: 'application/octet-stream' })
  // 保存导出
  FileSaver.saveAs(blob, '选中数据导出.xlsx')
}

, getExportData (isHead) {
  let datas = this.$refs.xGrid2.getTableData().tableData//导出所有数据包含头
//let datas = this.$refs.xGrid1.getSelectRecords()//导出选中数据包含头
  console.log("getExportData");
  console.log(datas);
  let columns = this.tableColumn.filter(item => item.field)
  let headers = isHead ? [columns.map(item => item.title)] : []
  return headers.concat(
    datas.map(row => {
      return columns.map(column => {
        return row[column.field]
      })
    })
  )
},
toBuffer (wbout) {
  let buf = new ArrayBuffer(wbout.length)
  let view = new Uint8Array(buf)
  for (let index = 0; index !== wbout.length; ++index) view[index] = wbout.charCodeAt(index) & 0xFF
  return buf
}
,// 通用行合并函数(将相同多列数据合并为一行)
rowspanMethod ({ row, $rowIndex, column, data }) {
  let fields = ['sex']
  let cellValue = row[column.property]
  if (cellValue && fields.includes(column.property)) {
    let prevRow = data[$rowIndex - 1]
    let nextRow = data[$rowIndex + 1]
    if (prevRow && prevRow[column.property] === cellValue) {
      return { rowspan: 0, colspan: 0 }
    } else {
      let countRowspan = 1
      while (nextRow && nextRow[column.property] === cellValue) {
        nextRow = data[++countRowspan + $rowIndex]
      }
      if (countRowspan > 1) {
        return { rowspan: countRowspan, colspan: 1 }
      }
    }
  }
}
//add end

 

 

4.添加js

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值