使用docxtpl的subdoc()插入子文档时格式丢失该如何解决
docxtpl插入子文档丢失格式的解决方法
问题原因
docxtpl的new_subdoc方法默认会优先使用主模板的样式,子文档中未提前导入到主模板的自定义样式、直接设置的局部字符/段落格式,默认会被主模板的默认样式覆盖,因此会出现斜体、对齐方式、字号丢失的问题。
解决方法
方法1:新增keep_styles参数(优先使用)
调用new_subdoc时增加keep_styles=True参数,开启子文档原生样式保留逻辑,修改后的代码如下:
from docxtpl import DocxTemplate tpl = DocxTemplate('tpl.docx') # 新增keep_styles参数保留子文档原有格式 sd = tpl.new_subdoc('sub_doc.docx', keep_styles=True) context = { 'sd': sd, } tpl.render(context) tpl.save('result.docx')
方法2:统一主、子文档的样式配置
如果加参数后仍有格式丢失,说明子文档用到的自定义样式和主模板重名,或主模板不存在对应样式,按以下步骤操作:
- 打开主模板
tpl.docx,依次点击「开发工具」-「模板」-「管理器」 - 选择
sub_doc.docx作为源文件,将子文档中用到的表格标题样式、表格内容样式复制到主模板中,保存主模板后重新运行代码即可。
方法3:手动补全格式(兜底方案)
如果子文档的格式是直接手动修改的局部格式,没有绑定样式,可以在render执行后,通过python-docx的API手动设置对应格式,示例代码如下:
from docxtpl import DocxTemplate from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.shared import Pt tpl = DocxTemplate('tpl.docx') sd = tpl.new_subdoc('sub_doc.docx', keep_styles=True) context = { 'sd': sd, } tpl.render(context) # 手动修正表格格式 for table in tpl.docx.tables: # 设置表格第一行(标题行)格式 title_row = table.rows[0] for cell in title_row.cells: for para in cell.paragraphs: para.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in para.runs: run.font.italic = True # 设置表格正文10号字体 for row in table.rows[1:]: for cell in row.cells: for para in cell.paragraphs: for run in para.runs: run.font.size = Pt(10) tpl.save('result.docx')
注意事项
- 子文档尽量使用自定义样式来定义格式,不要直接选中文本修改局部格式,绑定样式的格式更容易被完整保留
- 主模板和子文档的同名样式会优先使用主模板的配置,如需保留子文档样式,可修改子文档的样式名避免冲突,或调整主模板的样式配置和子文档一致
内容的提问来源于stack exchange,提问作者Oussama He
相关产品推荐
相关产品推荐

