【Node.js】依据.xlsx模板批量生成复杂表格单据,POI替代品

2 篇文章 0 订阅
2 篇文章 0 订阅

前言

客户提了个需求,提供已知单据模板,想导出excel单据文件并批量打印,表头和表尾通用一致,中间列表为数据清单,单据包含背景色、合并单元格、图片等样式内容。尝试过java的POI包,感觉性能不太好,下边做了node版和java版的性能对比,可见node版耗时是java版的四分之一,就很棒!!!

在这里插入图片描述

在这里不得不去感谢下exceljs包,确实是个很不错的东西。但是由于exceljs并不提供POI中类似copyrows()的方法,所以需要自己写,逻辑不复杂,思路比较重要,直接上代码。当然我相信用POI也能写出类似的性能的程序,可能需要绕过copyrows()自己写方法,在此不做讨论。

let start = Date.now()
const tmpPath = `./static/year_maintain_plan_tmp.xlsx`
const tmpSheetName = 'templates'
const groupsCount = 116
const groupRowsCount = 36
let workbook = new Excel.Workbook()
await workbook.xlsx.readFile(tmpPath)
let worksheet = workbook.getWorksheet(tmpSheetName)
let imageId1 = workbook.addImage({
  filename: './static/logo.jpg',
  extension: 'jpeg'
})
let imageId2 = workbook.addImage({
  filename: './static/Mnumber.jpg',
  extension: 'jpeg'
})
let workbookTmp = new Excel.Workbook()
const rs = []
for (let i = 0; i < groupRowsCount; i++) {
  rs.push([])
}
for (let j = 0; j < groupsCount; j++) { // table groups
  worksheet.insertRows(1, rs) // insert empty rows
  worksheet.getRow(36 * (j + 1)).addPageBreak() // add page break
  await workbookTmp.xlsx.readFile(tmpPath)
  let worksheetTmp = workbookTmp.getWorksheet(tmpSheetName)
  let rows = worksheetTmp.getRows(1, groupRowsCount) // get tmp
  // set row
  for (let i = 0; i < groupRowsCount; i++) {
    worksheet._rows[i] = rows[i]
  }
  // set img
  worksheet.addImage(imageId1, {
    tl: { col: 0.1, row: 36 * j + 0.3 },
    ext: { width: 60, height: 45 }
  })
  worksheet.addImage(imageId2, {
    tl: { col: 22, row: 36 * j + 0.6 },
    ext: { width: 160, height: 35 }
  })
}
worksheet.pageSetup.printArea = `A1:Y${groupsCount * groupRowsCount}` // print area
worksheet._rows.splice(groupsCount * groupRowsCount) // remove tmp
await workbook.xlsx.writeFile(`./static/year_maintain_plan_${year}.xlsx`)
let end = Date.now()
console.log(`复制模板+复制行+设置图片耗时=======${end - start}ms`)

新手勿喷,有更好的解决方案可以一起讨论。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饺子大魔王12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值