docxtemplater与Word文档页眉:如何实现整文档按数组项重复
解决docxtemplater遍历数组生成带独立页眉+正文的Word文档问题
docxtemplater的循环标签无法跨Word文档的不同XML块(页眉和正文属于不同的XML文件),所以直接把循环起始标签放页眉、结束标签放正文的方法行不通。要实现每个数组项对应一份完整的Word文档(含专属页眉和正文),可以通过在代码层面对每个数据项单独渲染模板的方式解决,具体如下:
核心思路
不再依赖docxtemplater的循环标签,而是遍历你的数据数组,对每个数据项单独加载模板、渲染内容、生成独立文档。这样每个文档的页眉和正文都会对应当前数据项的内容,完全独立。
代码示例(Node.js环境)
假设你的模板template.docx中,页眉包含{title}标签,正文包含{content}标签:
const fs = require('fs'); const JSZip = require('jszip'); const docxtemplater = require('docxtemplater'); // 读取模板文件 const templateContent = fs.readFileSync('./template.docx', 'binary'); // 你的数据数组,每个对象对应一份文档的内容 const documentData = [ { title: "项目报告1", content: "这是第一份报告的正文内容,包含项目进度、成果等信息。" }, { title: "项目报告2", content: "这是第二份报告的正文内容,重点说明后续规划与风险评估。" }, { title: "项目报告3", content: "这是第三份报告的正文内容,涵盖客户反馈与优化方案。" } ]; // 遍历数据生成独立文档 documentData.forEach((item, index) => { // 每次循环重新加载模板副本,避免数据污染 const zip = new JSZip(templateContent); const doc = new docxtemplater(); // 加载模板并设置当前数据项 doc.loadZip(zip); doc.setData(item); try { // 渲染文档 doc.render(); } catch (error) { console.error(`生成第${index+1}份文档失败:`, error); return; } // 生成输出文件 const outputFileName = `项目报告_${index+1}.docx`; const outputBuffer = doc.getZip().generate({ type: 'nodebuffer' }); fs.writeFileSync(`./${outputFileName}`, outputBuffer); console.log(`${outputFileName} 已成功生成`); });
关键说明
- 模板无需循环标签:模板里只需要放单个数据项对应的标签(比如
{title}、{content}),循环逻辑由代码实现,这样就能避免跨XML块的标签闭合问题。 - 每次循环重新初始化模板:确保每个文档都是基于原始模板生成,不会受到前一个数据项渲染的影响。
- 支持多页眉场景:如果模板包含首页页眉、奇偶页页眉等,只要这些页眉里都包含对应的标签,渲染时会自动替换所有页眉的内容。
内容的提问来源于stack exchange,提问作者TimH
相关产品推荐
相关产品推荐

