docxtpl结合Jinja实现docx带条件表格渲染及多余空行修复
docxtpl动态表格多余空行解决办法
问题根因
{%tr %}是docxtpl针对表格行的专用控制前缀,标注该前缀的指令所在的整行都会被识别为表格控制行。你当前把循环、判断、结束指令分别放在了独立的空表格行中,这些控制行渲染后没有实际内容,就会变成多余空行。同时你的Python代码存在遗漏:context没有给x键赋值,模板循环x时会取不到数据。
方案1:仅调整模板(无需修改Python逻辑)
直接在循环语句中内置过滤条件,省略单独的if/endif指令,所有控制指令和内容合并到同一行,避免额外空行。模板修改后如下:
| C1 | c2 | c3 | c4 | c5 |
|---|---|---|---|---|
| {%tr for i in x if "arya" in i.name %}{{ i.number }} | ||||
| {%tr endfor %} | ||||
方案2:Python侧提前过滤数据(逻辑更清晰,推荐)
把数据过滤逻辑放在Python层处理,模板只负责渲染最终数据,完全避免模板层复杂判断带来的格式问题:
修正后Python代码
from docxtpl import DocxTemplate tpl = DocxTemplate('templates/dynamic_table_tpl.docx') raw_data = { 1: {"name": "aryan", "number": 1}, 2: {"name": "anand", "number": 2}, 3: {"name": "aishwarya", "number": 3} } # 提前过滤符合条件的数据 filtered_list = [item for item in raw_data.values() if "arya" in item["name"]] # 给context的x键赋值 context = {"x": filtered_list} tpl.render(context) tpl.save('output/dynamic_table.docx')
对应简化版模板
| C1 | c2 | c3 | c4 | c5 |
|---|---|---|---|---|
| {%tr for i in x %}{{ i.number }} | ||||
| {%tr endfor %} | ||||
内容的提问来源于stack exchange,提问作者arya nair
相关产品推荐
相关产品推荐

