一、项目目的
现有问题
想必大家都知道word是一款强大的文字处理软件,因为其直观的功能选项卡区域,不管是学生,还是上班族,用起来都非常容易上手。但是这只基于制作少量的word的文件。假设是让你收集班上所有同学用word文档写的基本信息,你会如何去收集?那我们先来谈谈传统方法------邮件合并,邮件合并确实可以实现多个格式相同的word文档,但只局限于那些姓名、地址、性别等文本类的基础信息,而且一旦生成,像什么个人照片、样式呀都只能手动去改。往小的说,利用邮件合并生成了100份word文件,修改其照片信息,可想而知其工作的艰难。那么,现在淘汰了邮件合并的方法,你还能想到哪些轻量快速的方法?
实现意义
所以我们要找到更快捷的方法------利用word文档的强大功能和Node.js结合形成一个可以自动生成以多名学生姓名为文件名的word文档。它不仅可以为我们节约时间,更提高了工作效率,此外文件格式也是统一化的,使人看起来更赏心悦目。
呈现效果

二、项目目录
前端准备好学生信息数据和包含了学生学号姓名的excel文件以及word模板,后端实现项目功能。

三、后端实现
这里是新建了一个KoWord函数,其功能是利用pizzip解析word文件,利用docxtemplater创建Docxtemplater实例,并将内容引入到word模板中,渲染word文档数据,最后将渲染后的文档写入output.docx文件。 想要完成以上功能需要安装两个模块:pnpm install pizzip docxtemplater
js
async function KoWord(模版文件,输出文件,数据){
const content = fs.readFileSync(模版文件, "binary");
// 解压文件的内容
const zip = new PizZip(content); // 创建一个新的PizZip实例
// 解析模板,并在模板无效时抛出错误,例如,如果模板是"{user"(没有闭合标签)
const doc = new Docxtemplater(zip, { // 创建Docxtemplater实例
paragraphLoop: true, // 允许段落循环
linebreaks: true, // 保持换行符
});
doc.render(数据);
// 获取zip文档并将其生成为Node.js缓冲区
const buf = doc.getZip().generate({ // 生成文档的zip格式
type: "nodebuffer", // 生成类型为nodebuffer
compression: "DEFLATE", // 压缩类型为DEFLATE
});
fs.writeFileSync(输出文件, buf); // 将渲染后的文档写入到output.docx文件
}//KoWord
co函数主要是完成终端带emoji的前缀和随机文本颜色效果。
js
function co(文本内容){
// 定义随机背景颜色组(移除分号)
const colorArr = ['bgBlack', 'bgRed', 'bgGreen', 'bgYellow', 'bgBlue', 'bgMagenta', 'bgCyan', 'bgWhite', 'bgGray', 'bgRedBright', 'bgGreenBright', 'bgYellowBright', 'bgBlueBright', 'bgMagentaBright', 'bgCyanBright', 'bgWhiteBright']
const fontColorArr = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'gray', 'redBright', 'greenBright', 'yellowBright', 'blueBright', 'magentaBright', 'cyanBright', 'whiteBright']
// 修改:将Emoji表情加载到数组中并保持一行
const emojiArr = ['🌰','🌱','🌲','🌳','🌴','🌵','🌷','🌸','🌹','🌺','🌻','🌼','🌽','🌾','🌿','🍀','🍁','🍂','🍃','🍄','🍅','🍆','🍇','🍈','🍉','🍊','🍋','🍌','🍍','🍎','🍏','🍐','🍑','🍒','🍓','🍔','🍕','🍖','🍗','🍘','🍙','🍚','🍛','🍜','🍝','🍞','🍟','🍠','🍡','🍢','🍣','🍤','🍥','🍦','🍧','🍨','🍩','🍪','🍫','🍬','🍭','🍮','🍯','🍰','🍱','🍲','🍳','🍴','🍵','🍶','🍷','🍸','🍹','🍺','🍻','🍼','🍾','🍿','🎀','🎁','🎂']
// 生成随机索引(移除分号)
const i = Math.floor(Math.random() * fontColorArr.length)
const j = Math.floor(Math.random() * emojiArr.length)
// 获取随机背景颜色(移除分号)
const 背景颜色 = fontColorArr[i]
let 内容 = `${emojiArr[j].repeat(3)} ${文本内容}`
console.log(styleText( 背景颜色,内容 )) // 移除分号并简化空格
}//信息处理
引入已有的数据(学生信息)和所需的KoWord函数后调用,循环学生姓名(在前端data中stuArr就是存储了学生信息),实现以学生姓名为文件名的word文档。
js
//引入自定义模块 数据.js
let stuArr = require("./data/数据.js");
// 引入自定义模块 KoWord.js 并使用pnpm安装相应的依赖
let {KoWord,co} = require('./js/KoWord.js');
let 模版文件 = `./data/学生模版.docx`
//补全代码,完成for循环
for(let i=0;i<stuArr.length;i++){
let stu = stuArr[i];
let num=stu.num.slice(-2);
let 文件名=`${num}_${stu.name}`
// 在 生成/
let 输出文件 = `./生成/${文件名}.docx`;
let 数据 = stu;
//使用 koWord输出
KoWord(模版文件,输出文件,数据);
//使用co输出 文件生成提示
co(`生成文件:${输出文件}成功`);
}
四、结言
当时运行效果出来的时候,就觉得很神奇,第一次发现word文档竟然能以这种方式生成,不仅节省人力,还提升了办公效率,如果你也有独特的想法或者有趣的项目实践,期待你的分享!