思路:
1、使用 new ExcelJS.Workbook() 创建一个工作簿
2、使用 workbook.addWorksheet('Sheet1') 创建一个工作表
3、处理worksheet 表数据+样式
代码:
// 引入依赖
import ExcelJS from 'exceljs'
import { saveAs } from 'file-saver'
// 方法
async function exportTableToExcel(tableData) {
const workbook = new ExcelJS.Workbook() // 创建一个工作簿
const worksheet = workbook.addWorksheet('Sheet1') // 创建一个工作表 // 添加表头
// 添加表头
worksheet.columns = [
{ header: '列1', key: 'prop1' },
{ header: '列2', key: 'prop2' },
...
]
// 添加数据行
tableData.forEach((data) => {
worksheet.addRow(data)
})
//如有需要可以添加备注
worksheet.addRow(['我是备注行,只有一列'])
// 设置单元格样式,例如将第一行第一列(A1)的部分文字设置为红色
const richText = {
richText: [
{ text: '这是颜色', font: { color: { argb: 'FF0000' } } }, // 红色文字
{ text: '设置的文字' } // 默认颜色文字
]
}
worksheet.getCell('A1').value = richText
//设置备注行样式
const richText2 = {}
worksheet.getCell('A' + (tableData.length + 2)).value = richText2
// 获取每列最大宽度
const columnWidths = {}
tableData.forEach((row) => {
const newArr = [row.prop1, row.prop2,...]
newArr.forEach((cell, index) => {
if (!columnWidths[index]) {
columnWidths[index] = cell.length
} else {
columnWidths[index] = Math.max(columnWidths[index], cell.length)
}
})
})
Object.entries(columnWidths).forEach(([index, width]) => {
worksheet.getColumn(Number(index) + 2).width = width * 2 // 考虑到字符宽度与字符数的比例,可能需要乘以某个系数
})
// 使用file-saver保存文件
const buffer = await workbook.xlsx.writeBuffer()
saveAs(
new Blob([buffer], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}),
'example.xlsx'
)
}