这个男人叫小帅,要批量做上百份标准化word简历,只因不想学Word,他决定用Node.js封装一个KoWord函数,只为干掉困扰千万人的Word...
成立 信息支援小组 ,让天下人不再碰Word、不再被格式为难,格式和内容彻底分离,提升中华办公效率200%

〇、任务目标
根据data文件夹
提供的全部人员名单。为每个学生 生成Word简历,并在建立中填写姓名
和学号
,命名格式为学号后两位_姓名.docx
,在[生成]
文件夹显示。接下来用 邮件合并 和 Node.js对比进行同样操作。

得到所有人员的word格式简历。 接下来对比 人工队 和 代码队两种方式对比,直接给出结论:
- 共同:都需要再Word模版中挖空,人工队是《变量》,代码是{变量}。
- 差异:代码初次成本高,但有更好的修改灵活和弹性,能够适应未来更广泛的个性化修改场景。
- 效率:代码>人工。
一、邮件合并功能
以WPS为例,数据必须使用 .xls格式才能作为数据源, .docx- 待插入数据样式模版
1.在【引用】选项卡找到 【邮件合并】功能,

2.【打开数据源】选择.xls格式数据,选择数据源之后会自动识别第一行字段。

3. 选择【插入合并区域】→在下方要插入选择字段占位<<学号>>
、<<姓名>>
(不要手动输入)
依次在你需要的位置插入和EXCEL数据第一行中相同的字段,学号,姓名。

4. 选择合并到不同的新文档。

生成效果如下:

思考:那么 学号后两位+姓名.docx的格式该如何做
交给各位看管解决,因为我不想学邮件合并。

接下来我们用代码方式实现! 接下来我们用代码方式实现!
二、⚔️ 我会出手的KoWord
准备数据文件和 word模版,挖好变量插值的空。Node.js使用模块docxtemplater、pizzip
。更多插值语法可以参考为了不碰Word,程序员必学docxtemplater - 掘金

2.1 主函数代码

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 name = stu.name
// 文件名格式为 学号后两位_姓名.docx
let 输出文件 = `./生成/${num}_${name}.docx`
let 数据 = stu
//使用 KoWord函数 输出
KoWord(模版文件,输出文件,数据) // 移除分号
//使用co函数 在终端输出 "生成文件 01_张三.docx 成功" 文件提示
co(`生成文件 ${输出文件} 成功`)
}

2.2 自定义模块KoWord
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
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 }
让Tare进行代码分析:
KoWord.js
是一个文档生成与控制台输出美化工具,主要包含两个核心函数:
1) DOCX文档生成函数KoWord
- 功能:基于模板文件和数据生成新的Word文档
- 实现流程 :
- 使用
fs.readFileSync
读取模板文件内容- 通过
PizZip
模块解压DOCX文件(DOCX本质是ZIP压缩包)- 使用
Docxtemplater
引擎解析模板并渲染数据- 生成Node.js缓冲区数据并通过
fs.writeFileSync
写入输出文件- 参数 :
模版文件
:模板DOCX文件路径输出文件
:生成的目标文件路径数据
:用于填充模板的JavaScript对象
2) 控制台输出美化函数co
- 功能:为控制台输出添加随机颜色和表情符号装饰
- 实现流程 :
- 定义颜色数组(
colorArr
、fontColorArr
)和表情符号数组(emojiArr
)- 生成随机索引选择颜色和表情符号
- 使用
util.styleText
设置文本样式- 在文本前添加3个重复的随机表情符号并输出到控制台
技术依赖
pizzip
:处理ZIP格式文件(DOCX文件的基础格式)docxtemplater
:DOCX模板引擎,支持变量替换和循环等功能fs
:Node.js文件系统模块,用于文件读写util.styleText
:Node.js内置工具,用于设置控制台文本样式
3 功能演示

三、相关文章
《为了不碰Word,程序员必学docxtemplater》 [为了不碰Word,程序员必学docxtemplater - 掘金]
juejin.cn/post/750557...
