使用python-docx 0.8.6读取文档文本缺失,缺失内容在邮件合并字段
为啥python-docx读不到邮件合并字段里的内容?
哈哈,这个问题我之前踩过坑!你用doc.paragraphs遍历然后取para.text,确实会漏掉邮件合并字段的内容——因为这些字段属于Word文档里的域(Field)对象,不是普通的静态段落文本,para.text根本不会把它们包含进去,这就是你只读到一半内容的原因。
怎么才能读取到这些内容?
你需要单独遍历每个段落里的fields集合,提取域的相关信息。给你改一下代码试试:
from docx import Document doc = Document(input_file) fullText = [] for para in doc.paragraphs: # 先把普通段落文本加进去 fullText.append(para.text) # 再遍历段落里的所有域,专门处理邮件合并字段 for field in para.fields: # 邮件合并字段的代码开头都是"MERGEFIELD" if field.code.text.strip().startswith("MERGEFIELD"): # 从域代码里提取字段名称,比如从"MERGEFIELD 客户名称 \* MERGEFORMAT"里抠出"客户名称" field_name = field.code.text.split()[1] # 如果要拿字段当前显示的内容,就用field.result.text fullText.append(f"[邮件合并字段]: {field_name} - 当前显示值: {field.result.text}") print('\n'.join(fullText))
要是想替换邮件合并字段的内容怎么办?
同样不能用普通的查找替换,得直接操作域对象:
from docx import Document doc = Document(input_file) for para in doc.paragraphs: for field in para.fields: if field.code.text.strip().startswith("MERGEFIELD"): # 设置字段显示的内容 field.result.text = "你想要替换成的内容" # 可选:更新域,这样Word打开时会自动刷新(有些版本可能需要手动刷新) field.update() doc.save("替换后的文档.docx")
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

