前言
客户提了个需求,提供已知单据模板,想导出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`)
新手勿喷,有更好的解决方案可以一起讨论。