我有一个由队友生成的漂亮的 .docx 文件,我想使用其中的样式作为我通过 python-docx 以编程方式生成的新文档的默认样式。
我可以加载现有的 docx 文件,但不清楚如何在新创建的文档中使用文档中的样式。
我需要对现有文件中使用的每种样式执行以下伪代码吗?
# Read in our template file to enable style reuse
template = Document("MyTemplate.docx")
# Create our new, empty document
doc = Document()
set_style(doc.styles['Heading 1'] = template.styles['Heading 1']
set_style(doc.styles['Title'] = template.styles['Title']
# etc
python.docx 不直接支持复制样式。当然,我们可以将一个文档中的样式 XML 复制到另一文档的样式 XML 中。看起来像这样:
from docx import Document
from copy import copy
def copy_style(source_document: Document, target_document: Document, style_name: str):
source_style_names = [style.name for style in source_document.styles]
target_style_names = [style.name for style in target_document.styles]
if style_name in source_style_names:
source_style = source_document.styles[style_name]
if style_name in target_style_names:
target_document.styles[style_name].delete()
target_document.styles.element.append(copy(source_style.element))
template = Document('MyTemplate.docx')
document = Document()
style_name = 'Heading 1'
copy_style(template, document, style_name)
style_name = 'Title'
copy_style(template, document, style_name)
document.add_paragraph('Title Text', style='Title')
document.add_paragraph('Heading 1', style='Heading 1')
document.save('output.docx')
但它并不真正可靠,因为样式可以引用具有名称的其他样式,但目标文档中未定义这些名称。
因此更好的方法是将
MyTemplate.docx
清空并仅提供样式。然后,只需使用样式即可将内容放入从 MyTemplate.docx
创建的文档中。然后使用不同的名称保存结果,以便 MyTemplate.docx
保持为空作为模板。