如何使用Docxtemplater在Word表格中横向展开嵌套循环实现动态适配列的填充
如何使用Docxtemplater在Word表格中横向展开嵌套循环实现动态适配列的填充
嘿,我之前也折腾过类似的需求,Docxtemplater处理这种带动态适配列的嵌套数据表格,直接硬套多级循环确实容易卡壳,给你几个实用的解决方案,亲测有效:
方案一:提前预处理数据(最省心的思路)
既然你的列是固定的(First Name、Last Name、Age/Hair Color、Email/Costume Color),不如先把嵌套的meta数据转换成模板能直接用的扁平结构,避免在模板里写复杂的判断。
代码示例(数据预处理)
// 原始数据 const rawData = [ { firstName: 'Susan', lastName: 'Storm', meta: [ { age: 30, email: 'susan.storm@example.com' } ] }, { firstName: 'Peter', lastName: 'Parker', meta: [ { hairColor: 'Brown', costumeColor: 'Red' } ] } ]; // 预处理成模板需要的结构 const processedData = rawData.map(item => { const metaInfo = item.meta[0]; // 取meta数组里的唯一对象 return { firstName: item.firstName, lastName: item.lastName, // 优先取age,没有就用hairColor ageOrHair: metaInfo.age || metaInfo.hairColor, // 优先取email,没有就用costumeColor emailOrCostume: metaInfo.email || metaInfo.costumeColor }; });
Word模板表格写法
在Word里先画好表头,然后在表头下方的行里写循环标签:
| First Name | Last Name | Age OR Hair Color | Email OR Costume Color | |------------|-----------|-------------------|------------------------| {#processedData} | {firstName} | {lastName} | {ageOrHair} | {emailOrCostume} | {/processedData}
这样渲染出来的表格会自动生成两行对应你的数据,完全匹配需求。
方案二:模板内用表达式直接取值(不用修改原始数据)
如果你不想动原始数据,可以开启Docxtemplater的表达式功能,直接在模板里写逻辑判断取对应的值。
第一步:初始化Docxtemplater时开启表达式
const Docxtemplater = require('docxtemplater'); const PizZip = require('pizzip'); const zip = new PizZip(fs.readFileSync('template.docx')); const doc = new Docxtemplater(zip, { expressions: true // 开启表达式支持 }); doc.render({ data: rawData }); // 直接传入原始数据
Word模板表格写法
同样先画好表头,然后在数据行里用表达式判断:
| First Name | Last Name | Age OR Hair Color | Email OR Costume Color | |------------|-----------|-------------------|------------------------| {#data} | {firstName} | {lastName} | {meta[0].age || meta[0].hairColor} | {meta[0].email || meta[0].costumeColor} | {/data}
这里meta[0]直接取数组里的第一个对象,||表示优先取前面的属性,不存在就用后面的。
方案三:自定义过滤器(适合复杂逻辑场景)
如果以后你的meta字段可能变化,或者逻辑更复杂,自定义过滤器会更灵活。
第一步:注册自定义过滤器
const doc = new Docxtemplater(zip, { filters: { // 处理第三列的过滤器 getThirdColumn: function(metaArray) { const meta = metaArray[0]; return meta.age || meta.hairColor || 'N/A'; // 可以加默认值 }, // 处理第四列的过滤器 getFourthColumn: function(metaArray) { const meta = metaArray[0]; return meta.email || meta.costumeColor || 'N/A'; } } }); doc.render({ data: rawData });
Word模板表格写法
用|符号调用过滤器:
| First Name | Last Name | Age OR Hair Color | Email OR Costume Color | |------------|-----------|-------------------|------------------------| {#data} | {firstName} | {lastName} | {meta | getThirdColumn} | {meta | getFourthColumn} | {/data}
小提示
- 不管用哪种方案,都要确保Word模板里的表格结构完整,循环标签
{#data}和{/data}要包裹住整个数据行,不要拆在单元格里。 - 如果你的
meta数组可能有多个元素,可以在预处理或过滤器里调整逻辑(比如取第一个、合并所有值等),根据实际需求来。
内容来源于stack exchange
相关产品推荐
相关产品推荐

