前段时间我已经写过2篇 Word 模板自动填充的文章
[dify实战]用 Dify 实现「带格式 Word 模板自动填充」的一次实践复盘
主要解决两类最常见的问题:
·【数字序号】填充:比如 【1】、【2】… 这种表单式占位
·【下划线空】填充:模板里一串“_____”或下划线样式空格,按顺序把值写进去
这两块跑通后,绝大多数“固定字段”都能自动生成了。
但在真正的业务材料里,还有两块一直绕不过去——也是最容易让自动化“卡壳”的地方:
1.勾选框:Word 里那堆 □/☑ 选项
2.动态表格:表格行数不固定
这篇文章就专门讲:我如何在 Dify 里把这两块打通,做到:
输入 JSON → 输出已填好的 docx 勾选框自动勾选、表格按数据条数自动扩展行,并且保留模板样式。

一、先说结论:为什么这两块是“硬骨头”?
1)勾选框难在“看起来简单,但容易混乱”
·选项多、编号多,人工勾选极易出错
·模板改一版,选项顺序变了,之前的脚本就对不上
2)动态表格难在“它不是替换文字,是改结构”
普通 {{key}} 只是“替换文本”。 动态表格要做的是:
·找到“模板行”
·按数据条数复制行
·每行填不同数据
·删除模板行
·表格线、字体、底纹、对齐要保持模板不变
一句话:动态表格是“结构级”生成,不是“文本级”替换。

二、能力 1:勾选框自动勾选(☑ / □)
1)模板怎么写?用占位符把勾选框“变成可计算的”
在 Word 模板里,我把每个选项写成:
·{{CHECK_1}} 选项A·{{CHECK_2}} 选项B·…·{{CHECK_8}} 选项H
也就是:勾选框本身不写死,而是留给程序决定是 ☑ 还是 □。
模板中是这样填写的

2)Dify 入参怎么传?
我在 Dify 里约定:
"checks": {"selected":[1, 4, 6],"total": 8}
工具端生成映射:
·CHECK_1 → ☑·CHECK_2 → □·…·CHECK_8 → □
然后走一遍普通 {{key}} 替换即可,模板里的勾选框就会自动“亮起来”。
这样做的好处是:模板只要保持 CHECK 编号一致,后续增删选项也不影响主逻辑。

三、能力 2:动态表格按行扩展(保留表格线与样式)
1)模板怎么做?关键是“模板行 + marker”
每张需要动态扩展的表格,预留一行“模板行”,并放一个 marker(行标记):
比如贷款融资情况这张表:
·第一列:{{ROW_LOAN}}{{org}}
·第二列:{{amount}}
·第三列:{{guarantee}}
·第四列:{{bank_level}}
·第五列:{{term}}
模板里是这样的定义的

一个非常重要的约定:marker({{ROW_LOAN}})只放一次(建议第一列)。 这会让定位模板行、复制行、清理 marker 变得非常稳定。
2)Dify 入参怎么传?(tables 结构)
我在 Dify 里约定:所有动态表格都放在 tables:
"tables": {"ROW_LOAN":[{"org":"工行", "amount": "1000", "guarantee": "信用", "bank_level": "正常", "term": "1年"},{"org":"建行", "amount": "2000", "guarantee": "抵押", "bank_level": "正常", "term": "2年"}],"ROW_CTRL_LOAN":[{"org":"张三", "amount": "300", "guarantee": "信用", "bank_level": "正常", "term": "6个月"}]}
根据表格的个数修改模板中的占位符
工具端做的事其实很“模板引擎”:
1.遍历所有表格
2.找到包含 {{ROW_xxx}} 的模板行
3.永远从模板行 XML 克隆出新行(样式完全保留)
4.替换每行字段占位符
5.删除模板行
四、把能力放到 Dify 里:为什么更适合“业务落地”?
因为 Dify 的价值不只是“能跑脚本”,而是它能把能力变成一个可复用的节点/工具:
·上游:从业务系统/接口取数(或让智能体生成结构化 JSON)
·中间:Word 模板填充工具(输出 base64)
·下游:下载、归档、发送 OA、推送到流程系统
最终的工作流就是:


五、总结:这篇解决了哪两件事?
如果把我这个系列文章当成“逐步补齐 Word 自动化能力”,那么:
·前几篇:解决 【数字序号】、【下划线空】 —— 固定字段基本自动化
·这一篇:补齐 【勾选框】、【动态表格】 —— 结构级填表也能自动化
到这里,常见的业务 Word 模板基本就能“全自动生成”了。
如果你觉得这篇对你有帮助,欢迎 点赞、在看、转发、收藏
夜雨聆风