前言
现在我为你提供包含 班级学生姓名信息 和 学号的Excel 和 Word学生模版 ,让你在Word中生成所有同学的信息,每个同学的信息都要以"学号后两位_姓名.docx"命名,如果是你,你会选择怎么做?是使用Word中的邮件合并功能,然后再手动命名,还是采用什么样的方法?
其实可以不用那么麻烦,可以使用代码实现以上功能和要求,那该怎么写代码呢?
项目实现效果
这个项目是使用Node.js
写出来的,我们先来看看这个项目的实现效果吧!
项目目录分析

我们先来分析一下这个项目的目录吧,这个生成文件夹是用来 存放生成的文件列表 的 data文件夹里存放了 有学生学号和学生姓名的Excel文件, 一个Word模板文件,还有一个JS文件
js文件夹的KoWord.js中引入了两个模块,并使用了一个自定义函数co,co函数负责对文本内容进行信息处理,然后在终端进行彩色输出
项目逻辑代码
安装模块
在终端安装模块 使用pnpm install pizzip docxtemplater命令
PizZip
是一个用于处理 ZIP 文件的库,用于读取和操作 Word 文档的内部结构Docxtemplater
是一个用于操作 Word 模版的库,可以将模板中的占位符{name}替换为学生姓名。
代码部分
数据.js声明了一个包含全班同学信息的变量,数组stuArr,数组中包含了学生的学号num和姓名name,最后将这个数组导出
js
let stuArr = [
{ num: '235030201', name: '焦新眷' },
{ num: '235030202', name: '唐溢聪' },
{ num: '235030203', name: '沈如意' },
{ num: '235030204', name: '程杏怡' },
{ num: '235030205', name: '舒慧君' },
{ num: '235030206', name: '柳颖颖' }
//其他学生信息···
]; //全班同学信息
// 导出核心函数,供其他文件引用
module.exports = stuArr
KoWord.js 中,首先先引入模块,使用 fs
对文件进行读取和写入,然后使用fs.readFileSync
同步读取文件,使用PizZip
解压模板文件的内容,创建Docxtemplater实例,设置选项,使用传入的 数据
替换模板中的占位符,最后调用 doc.getZip().generate
方法生成新的 ZIP 文件,将生成的内容写入到指定文件。
js
const PizZip = require("pizzip"); // 引入PizZip模块
const Docxtemplater = require("docxtemplater"); // 引入Docxtemplater模块
const fs = require("fs");
const { styleText } = require('util')
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 和随机背景颜色,然后输出到控制台,最后,将 KoWord
和 co
函数导出,供 考试.js 引用。
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( 背景颜色,内容 )) // 移除分号并简化空格
}//信息处理
// 导出核心函数,供其他文件引用
module.exports = { KoWord, co }
考试.js 为 数据.js
里的每个学生生成一份单独的文档,文档命名遵循 "学号后两位_姓名.docx" 格式,保存于 生成
文件夹中,同时在终端输出进行提示。
使用for
循环遍历 stuArr
数组,对每个学生信息进行处理。
let stu = stuArr[i];:获取当前学生信息对象。
let num = stu.num.slice(-2);:截取学生学号的后两位。
let 文件名 = {num}_{stu.name}:根据学号后两位和学生姓名生成文件名。
let 输出文件 = ./生成/${文件名}.docx:定义输出文件的路径。
let 数据 = stu;:将当前学生信息对象赋值给
数据
变量。KoWord(模版文件, 输出文件, 数据);:调用
KoWord
函数,依据模板文件、输出文件路径和学生信息生成Word文档。co(生成文件 ${输出文件} 成功);:调用
co
函数,在终端输出文件生成成功的提示信息。
js
//引入自定义模块 数据.js
let stuArr = require(`./data/数据.js`);
// 引入自定义模块 KoWord.js 并使用pnpm安装相应的依赖
const { 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文件并以要求的格式命名的功能,通过代码,批量使用模版生成文档,避免了手动一个一个进行操作,并保证了所有简历格式的一致,大大提升了办公的效率。