在2017年暑假绿盟实习期间,部门做的一个项目需要用到docx格式的word文档模板操作,现在有如下记录:
关于python操作docx格式文档,我用到了两个python包,一个便是python-docx包,另一个便是python-docx-template;,同时我也用到了很出名的一个工具"pandoc,下面我会对他们各自进行介绍。
下面便会相应介绍他们各自的大概的用法。还是按照上面的顺序进行介绍,:
from docx import Document
from docx.shared import Inches
document = Document() # 首先这是包的主要接口,这应该是利用的设计模式的一种,用来创建docx文档,里面也可以包含文档路径(d:\\2.docx)
document.add_heading('Document Title', 0) # 这里是给文档添加一个标题,0表示 样式为title,1则为忽略,其他则是Heading{level},具体可以去官网查;
p = document.add_paragraph('A plain paragraph having some ') # 这里是添加一个段落
p.add_run('bold').bold = True # 这里是在这个段落p里文字some后面添加bold字符
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1) # 这里是添加标题1
document.add_paragraph('Intense quote', style='IntenseQuote') # 这里是添加段落,style后面则是样式
document.add_paragraph(
'first item in unordered list', style='ListBullet' # 添加段落,样式为unordered list类型
)
document.add_paragraph(
'first item in ordered list', style='ListNumber' # 添加段落,样式为ordered list数字类型
)
document.add_picture('monty-truth.png', width=Inches(1.25)) # 添加图片
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.qty)
row_cells[1].text = str(item.id)
row_cells[2].text = item.desc
document.add_page_break() # 添加分页符
document.save('demo.docx') # 保存这个文档
具体样式请看:
关于更多细节希望大家还是去他的官网python-docx;看,介绍的还是很详细
关于python-docx-template,他的官网名称便是“像jinjia2一样来操作docx文档”,因此这个包对于用来进行文档修改时很强大的下面是一个简单例子:
from docxtpl import DocxTemplate
doc = DocxTemplate("1.docx") # 对要操作的docx文档进行初始化
context = { 'company_name' : "World company" } # company_name 是存在于1.docx文档里面的变量,就像这样{{company_name}},直接放在1.docx文件的明确位置就行
doc.render(context) # 这里是有jinjia2的模板语言进行变量的替换,然后便可以在1.docx文档里面看到{{company_name}}变成了World company
doc.save("generated_doc.docx") # 保存
当然,这个包的功能远远不止上面例子中的一些,可以包含图片
myimage = InlineImage(doc,'test_files/python_logo.png',width=Mm(20)) # tpl便是上面例子中的doc对象
也可以包含另一个docx文档,
sub = doc.new_subdoc()
sub.subdocx = Document('d:\\2.docx')
doc.render({'sub': sub})
这里操作之后便可以把2.docx文件里面的内容直接插入到doc对象(也就是1.docx)文档中{{sub}}这个变量处,被替换为2.docx中的,基本上用到的都是这两个部分,
关于更多的特性,可以访问官网的example,里面涵盖了几乎所有的特性,地址是https://github.com/elapouya/python-docx-template/tree/master/tests
这是用到的命令,而由于使用pandoc是在控制台下cmd或者shell使用的,因此要用到python的另一个包subprocess
import subprocess
subprocess.call('pandoc --latex-engine=xelatex temp.html -o temp.text', cwd='d:\\python', shell=True)
subprocess.call('pandoc --latex-engine=xelatex temp.text -o t1.text', cwd='d:\\python', shell=True)
或者
subprocess.call('pandoc temp.html -o temp.docx', cwd='d:\\python', shell=True)
首先里面的cwd参数设置后,会把这个命令执行环境调到cwd所设置的参数路径处,就如同执行命令前,如同先执行了 cd d:\\python命令一样,shell=True相当于新开了一个shell或者cmd控制台,而关于更多例子,可以去官网的在线转换器 https://pandoc.org/try/ 或者官网的例子 https://pandoc.org/demos.html
好了,主要便是这些了,谢谢查看!