xlsx-template
根据template.xlsx导出Excel
createExcelByTemplate
js
import fs from 'fs';
import XlsxTemplate from 'xlsx-template';
/**
* 指定模板导出Excel
* @param {string} templateName 模板文件名
* @param {object|Array<object>} data 数据
* @param {string} name 导出文件名
*/
const createExcelByTemplate = (templateName, data, name = "") => {
//没指定文件名就随机一个文件名
if (!name) {
name = "template-output " + new Date().toISOString().split('T')[0];
}
try {
// 读取 Excel 模板文件
const templateFile = fs.readFileSync(`./template/${templateName}`);
const template = new XlsxTemplate(templateFile);
// 将数据应用到模板中
if (Array.isArray(data)) {
data.map((sheet, index) => {
try {
template.substitute(index + 1, sheet)
} catch (error) {
console.warn(
'\x1b[31m\x1b[1m', `表${index + 1} 超出表索引边界!请核对 数据表 与 模板表 是否一致`, '\x1b[0m',
'\x1b[34m', `操作将会继续进行,超出索引边界数据表将丢失`, '\x1b[0m'
);
}
})
} else {
//只有一个对象是放入第1个sheet中
template.substitute(1, data);
}
// 生成 Excel 文件
const result = template.generate();
// 保存(导出) Excel 文件
fs.writeFileSync(`./${name}.xlsx`, result, 'binary');
} catch (error) {
console.error(error);
}
}
export default createExcelByTemplateapp.js
js
// 定义要替换的数据 严格按顺序存放。 data[0]第1个sheet表、data[1]第2个sheet表
const data = [
{
date: new Date().toLocaleDateString(),
list:['列1','列1','列2','列3','列4','列5'],
tlistTable: [ { name: '张三', age: 16, }, { name: '李四', age: 17, } ],
image:"./template/templateExcelImg.jpg"
},
{ tlist2: [ { name: '王五', age: 19, }, { name: '赵六', age: 20, } ] }
]
// ${date} 数据
// ${list} 列
// ${table:tlistTable} 表格 行
// ${image:image} 图片
createExcelByTemplate("template.xlsx", data, "新文件名测试")