Docxtpl模板条件语句失效及空值样式设置求助
问题1:条件语句失效的原因及解决方法
你在Python脚本里把Personal_Age用RichText(18, ...)包装成了RichText对象,但模板里的{% if Personal_Age ==18 %}是拿这个对象和整数18做比较——两者类型完全不同,判断结果必然是False,所以会执行else分支显示Adult。
有两种解决思路:
- 若不需要Age的富文本样式,直接传整数即可:
模板里的条件判断无需修改。context={'Personal_name':'Charlie','Personal_Age':18} - 若要保留富文本样式,在模板里判断RichText对象的
value属性:Teenager/Adult: {% if Personal_Age.value ==18 %} Teenager {% else %} Adult {% endif %}
问题2:Age为空时设置红色背景并添加注释框的实现
结合RichText设置背景色,再利用python-docx的注释功能(docxtpl基于python-docx)即可实现,具体步骤如下:
1. 修改Python脚本
from docxtpl import DocxTemplate, RichText from docx.enum.text import WD_COLOR_INDEX from docx.oxml.ns import qn from docx.oxml import OxmlElement def add_paragraph_comment(paragraph, comment_text): # 创建注释核心元素 comment = OxmlElement('w:comment') comment.set(qn('w:id'), '1') comment.set(qn('w:author'), '提示') comment.set(qn('w:date'), '2024-05-20T12:00:00Z') # 添加注释内容 text_node = OxmlElement('w:t') text_node.text = comment_text comment.append(text_node) # 将注释关联到目标段落 paragraph._p.append(comment) ref_node = OxmlElement('w:commentReference') ref_node.set(qn('w:id'), '1') paragraph._p.append(ref_node) doc = DocxTemplate('test_word_2.docx') # 模拟Age为空的场景 personal_age = '' if not personal_age: # 创建带红色背景的占位文本 rt = RichText() rt.add('(未填写)', color='000000', bold=True, highlight=WD_COLOR_INDEX.RED) context = {'Personal_name':'Charlie', 'Personal_Age': rt} else: # 正常情况保留富文本样式 context = {'Personal_name':'Charlie', 'Personal_Age': RichText(personal_age, color='FF0000', bold=True)} doc.render(context) # 给Age所在段落加注释(注意:索引需根据你的模板结构调整,示例中Age是第2个段落,索引从0开始) age_paragraph = doc.paragraphs[1] if not personal_age: add_paragraph_comment(age_paragraph, '年龄未填写,请补充完善') doc.save('test_word_2_test.docx')
2. 模板保持原结构
Name: {{ Personal_name }} Age:{{ Personal_Age }} Teenager/Adult: {% if Personal_Age.value ==18 %} Teenager {% else %} Adult {% endif %}
注意:段落索引需要根据你的实际模板内容调整,如果Age放在表格中,需要遍历表格单元格定位目标段落。
内容的提问来源于stack exchange,提问作者Tony Tang
相关产品推荐
相关产品推荐

