通过xlsx库实现将数据生成excel

  1. 数据生成excel
  2. 自定义表头
  3. 合并单元格
  4. 最后一行求和
  5. 在这里插入图片描述
import * as XLSX from 'xlsx'
/**
 * 下载excel
 * @param {Array} data 下载的数据
 * @param {String} filename 文件名
 * @param {Object} headerMapping 表头 例如:{name:'姓名'}
 * @param {Array} mergeCell 合并单元格 例如:[ { s: { r: 1, c: 7 }, e: { r: 3, c: 7 }}]
 *  s 代表开始 e代表结束  r代表行 c代表列
 * @param {Boolean} isSum 是否求和
 */
export function exportToExcel(data, filename, headerMapping = null, mergeCell = null, isSum = false) {
  const worksheet = XLSX.utils.json_to_sheet(data)
  // 修改表头
  if (headerMapping) {
    const headerRange = XLSX.utils.decode_range(worksheet['!ref'])
    for (let col = headerRange.s.c; col <= headerRange.e.c; col++) {
      const headerCell = XLSX.utils.encode_cell({ r: 0, c: col })
      const headerCellValue = worksheet[headerCell].v
      if (headerMapping.hasOwnProperty(headerCellValue)) {
        worksheet[headerCell].v = headerMapping[headerCellValue]
      }
    }
  }
  // 合并单元格
  if (mergeCell) {
    worksheet['!merges'] = mergeCell
  }
  if (isSum) {
    const range = XLSX.utils.decode_range(worksheet['!ref'])
    // 插入总和行
    const totalRow = range.e.r + 1 // 最后一行的下一行
    const totalCell = XLSX.utils.encode_cell({ r: totalRow, c: 0 }) // 第一列的单元格
    worksheet[totalCell] = { t: 's', v: '总和' }
    worksheet['!ref'] = `A1:${String.fromCharCode(range.e.c + 65)}${totalRow + 1}`
    // 求和
    for (let i = 1; i <= range.e.c; i++) {
      let sum = 0
      for (let j = 1; j <= range.e.r; j++) {
        const cel = XLSX.utils.encode_cell({ r: j, c: i })// 每一列的的每一个单元格
        if (worksheet[cel].t !== 'n') { // 如果不是数值类型不累加
          break
        }
        sum += worksheet[cel].v
      }
      const c = XLSX.utils.encode_cell({ r: totalRow, c: i })
      worksheet[c] = { t: 'n', v: sum || '' }
    }
  }
  const workbook = XLSX.utils.book_new()
  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
  XLSX.writeFile(workbook, `${filename}.xlsx`)
}

例子:

export default {
  data() {
    return {
      tableData: [
        {
          project: '过磅费',
          openingBalance: 10,
          shouldMoney: 10000,
          realityMoney: 8000,
          closeBalance: 9,
          remark: '无',
          order: 1,
          createBy: '小李',
          financeLeader: '财务主管',
          checkPerson: '财务小张',
          manager: '张经理',
          editable: false
        },
        {
          project: '临时摊位费',
          openingBalance: 10,
          shouldMoney: 10000,
          realityMoney: 8000,
          closeBalance: 9,
          remark: '无',
          order: 1,
          createBy: '小李',
          financeLeader: '财务主管',
          checkPerson: '财务小张',
          manager: '张经理',
          editable: false
        },
        {
          project: '保证金',
          openingBalance: 10,
          shouldMoney: 10000,
          realityMoney: 8000,
          closeBalance: 9,
          remark: '无',
          order: 1,
          createBy: '小李',
          financeLeader: '财务主管',
          checkPerson: '财务小张',
          manager: '张经理',
          editable: false
        }
      ]
    }
  },
  methods: {
    downLoad() {
      const fields = {
        project: '项目',
        openingBalance: '期初数',
        shouldMoney: ' 本月应收',
        realityMoney: ' 本月实收',
        closeBalance: '期末数',
        remark: '备注',
        order: '明细表序列:',
        createBy: '创建人',
        financeLeader: '财务部负责人',
        checkPerson: '核对人',
        manager: '部门经理'
      }
      const mergeCells = [
        { s: { r: 1, c: 7 }, e: { r: 3, c: 7 }},
        { s: { r: 1, c: 8 }, e: { r: 3, c: 8 }},
        { s: { r: 1, c: 9 }, e: { r: 3, c: 9 }},
        { s: { r: 1, c: 10 }, e: { r: 3, c: 10 }}
      ]
      exportToExcel(this.tableData, 'user', fields, mergeCells, true)
    }
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值