模板方法有效,其主要优势在于它是一个真正的跨平台解决方案。但是,它要求一个样式已经在文档中应用过一次。
让我们考虑来自python-docx 的玩具示例的(简化)版本
documentation page.
第一步涉及创建模板文档:
from docx import Document
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph(
'first item in unordered list', style='ListBullet'
)
document.add_paragraph(
'first item in ordered list', style='ListNumber'
)
document.save('demo.docx')
(请注意,您也可以在第一步中手动应用样式,而无需使用 python-docx,即在 Word 中。)
接下来,您在 Microsoft Word 中打开此 demo.docx,您可以:
- 添加所需的标题
- 从菜单中插入页码
- 保存文档
完成上述操作后,您只需删除demo.docx 文档的主要内容(但不删除页眉和页脚的内容!)并再次保存文件。
在第二步中,使用python-docx 调用demo.docx 进行所需的更改:
from docx import Document
document = Document('demo.docx')
document.add_heading('A New Title for my Document', 0)
p = document.add_paragraph('A new paragraph having some plain ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('New Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph(
'first new item in unordered list', style='ListBullet'
)
document.add_paragraph(
'first new item in ordered list', style='ListNumber'
)
document.save('demo.docx')
您甚至可以添加更多内容,例如具有现有表格样式的表格:
from docx import Document
document = Document('demo.docx')
document.add_page_break()
recordset = [ [1, "101", "Spam"], [2, "42", "Eggs"], [3, "631", "Spam, spam, eggs, and spam"]]
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for item in recordset:
row_cells = table.add_row().cells
row_cells[0].text = str(item[0])
row_cells[1].text = str(item[1])
row_cells[2].text = item[2]
table.style = 'ColorfulShading'
document.save('demo.docx')
当然,可以避免一直重复第一步,通过copying the customized file 然后在那里进行必要的更改(例如demo_copy.docx)而不影响模板:
import shutil
shutil.copyfile('demo.docx', 'demo_copy.docx')
最后值得一提的是,您还可以使用自定义样式!有关如何使用python-docx 和表格样式see here 执行此操作的示例。