我正在参加Trae「超级体验官」创意实践征文,本文所使用的 Trae 免费下载链接:www.trae.com.cn/?utm_source…、
序章、Word之罪
2025人工智能元年,天下苦Word久矣。时至今日,不少企事业单位仍然使用Word群发模版的形式收集数据。甚至还有win7系统和各种不同的WORD版本,尤其涉及表格、图文插入,因为格式问题耽误了千万人无数个“两分钟”。不统一的坏处,联想到《过秦论》。本文将使用Node.js的docxtemplater铜鼓代码的方法操作Word动态内容的生成。
————— 指导AI模仿《过秦论》
- 格式不统之害:仿《过秦论》「仁义不施」之叹,指Word版本迭代导致格式混乱,用户被迫「学习成本」激增。
- 跨平台裂隙:类比战国诸侯割据,Windows与Mac系统差异使文档生态分裂。
- 协作之弊:以秦「法令滋彰」反讽Word文档当百万问卷,致办公效率低下。
- 末段警语:化用「攻守之势异也」,呼吁统一标准、简化设计。
零、实战演示
一、利器docxtemplater
docxtemplater——“使用模版语法{变量名}插值形式, 强大的Word、PPT、Excel生成器。”
准备Node.js开发环境,和pnpm包管理工具。这里只用到Word功能,基础插值、循环插值可以解决90%的问题,剩下的用程序反而不值得。
特别注意:docxtemplater图片插入模块、EXCEL等模块是收费模版,完全可以用其他开源模块代替,这里只演示其好用的生成Word功能。
pnpm i pizzip docxtemplater
二、基础插值
准备一个 Word模版,进行{变量名}插值占位即可。有观众可能要问,那我非要全用Word生成样式+代码怎么办?不要没苦硬吃,能用Word自身设置的样式先预设模板。
let 数据 ={
员工编号:`0001`,
姓名:`张三`,
部门:`百万前端向前冲`,
职位:`经理`,
入职日期:`2025-05-17`,
}
目标结果:
三、表格循环一行插值
首先对数据进行处理,数据源头为 数组格式,这里取键名C。
let 数据 = {
C: [
{ 员工编号: `0001`, 姓名: `张三`, 部门: `百万前端向前冲`, 职位: `经理`, 入职日期: `2025-05-17` },
{ 员工编号: `0002`, 姓名: `李四`, 部门: `百万前端向前冲`, 职位: `工程师`, 入职日期: `2025-05-17` },
{ 员工编号: `0003`, 姓名: `王五`, 部门: `百万前端向前冲`, 职位: `HR`, 入职日期: `2025-05-17` }
]
}
WORD模版修改。在需要循环的行前面使用{#C} 循环体 {/C}
,这里C
是由上面数据的键名决定的,是自定义的,我这里为了演示定义为字母C,用中文命名变量同样可以。
输出结果:
主函数语句:
// 引入自定义模块 KoWord
const { KoWord, co } = require(`./js/KoWord.js`)
let 模版文件 = `./模版/掘金社区.docx`
let 输出文件 = `./生成/基础演示.docx`
let 数据 = {
C: [
{ 员工编号: `0001`, 姓名: `张三`, 部门: `百万前端向前冲`, 职位: `经理`, 入职日期: `2025-05-17` },
{ 员工编号: `0002`, 姓名: `李四`, 部门: `百万前端向前冲`, 职位: `工程师`, 入职日期: `2025-05-17` },
{ 员工编号: `0003`, 姓名: `王五`, 部门: `百万前端向前冲`, 职位: `HR`, 入职日期: `2025-05-17` }
]
}
KoWord(模版文件,输出文件,数据)
co(`汇总完成生成完成:${输出文件}`)
四、表格循环自身插值
我们要得到下面的效果,根据每个员工循环表格整体。
数据格式同上,主函数语句完全一致。只需要修改WORD模版,将{#C} 循环体 {/C}
循环外置。
表格无法循环小技巧:注意表格多用必须占位,不要浮动在页面。如果遇到表格无法循环,可以回车到输入光标,在复制整个表格重新占位。
五、基础循环
1. 在{变量名}直接插入的都是普通字符。
2.特别注意多层对象的循环
属性写法仍然是{#A}{属性名}{/A},不可以直接使用{A.属性名}
let 数据 = {
A: { 员工编号: `0001`, 姓名: `张三`, 部门: `百万前端向前冲`, 职位: `经理`, 入职日期: `2025-05-17` },
B:{
name:`百万前端向前冲`,
age:18,
},
C:[`0001`, `张三`, `百万前端向前冲`, `经理`, `2025-05-17`]
}
如果子数据是 数组结构,可以用 {.}
代替
附录
1. 自定义模块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 }
2、使用Trae 列举Word罪状
总结 祛WORD
某些功能WORD的邮件合并
也能做,只是不喜欢WROD,发WORD模版甚至远不如HTML+CSS静态网页采集。
祛WORD化!