Python使用docxtpl处理docx无法识别content control值的解决方案咨询
解决方案
1 纯Python脚本处理(跨平台,无Office依赖)
直接解析docx的原生XML结构,移除所有内容控件标签、保留内部文本,处理后的文件可直接被docxtpl识别。
需先安装依赖:pip install python-docx
from docx import Document def remove_content_controls(doc_path, output_path): doc = Document(doc_path) # 遍历文档所有XML元素,找到内容控件标签<w:sdt> for parent in doc.element.iter(): for child in list(parent): if child.tag.endswith('sdt'): # 提取内容控件内部的内容节点<w:sdtContent> sdt_content = child.find('.//'+child.tag.replace('sdt', 'sdtContent')) if sdt_content is not None: # 将控件内容替换到控件原来的位置 index = parent.index(child) for content_child in list(sdt_content): parent.insert(index, content_child) index += 1 # 删除原内容控件标签 parent.remove(child) doc.save(output_path) # 调用示例 remove_content_controls("你的原文件.docx", "移除控件后文件.docx")
2 COM接口自动处理(Windows环境,完全还原手动操作效果)
调用Word本地程序的COM接口执行移除操作,和手动操作的效果完全一致,不会丢失SharePoint同步的取值。
需先安装依赖:pip install pywin32
import win32com.client as win32 def remove_cc_by_word(input_path, output_path): word = win32.gencache.EnsureDispatch('Word.Application') word.Visible = False # 后台运行不弹出窗口 doc = word.Documents.Open(input_path) # 删除所有内容控件,保留文本 doc.ContentControls.DeleteAll() doc.SaveAs2(output_path, FileFormat=16) # 16对应docx格式 doc.Close() word.Quit() # 调用示例 remove_cc_by_word("你的原文件.docx", "移除控件后文件.docx")
3 手动操作方法
无需代码的手动操作步骤如下:
- 打开目标docx文件,按
Alt+F11调出VBA编辑器 - 按
Ctrl+G打开立即执行窗口 - 输入代码
ActiveDocument.ContentControls.DeleteAll后按回车执行 - 保存文档即可完成内容控件移除,所有文本会保留为普通格式
注意:此前直接用
os.rename修改后缀名不属于正规格式转换,仅修改了文件后缀标识,所以会出现内容丢失的问题,不建议使用。
处理完成后的文档即可正常使用docxtpl.DocxTemplate加载,完成变量替换操作。
内容的提问来源于stack exchange,提问作者Green_Black
相关产品推荐
相关产品推荐

