系列教程:
Python 自动化教程(1) 概述,第一篇 Excel自动化
Python 自动化教程(2) : Excel自动化:使用pandas库
Python 自动化教程(3) : 自动生成PPT文件 Part 1
Python 自动化教程(4) : 自动生成PPT文件 Part 2
本篇介绍使用 office 库处理 Word文件.
office库简介
office库是笔者写的python库,用于办公自动化,功能是很强的, 包括:PPT自动生成、PPT转长图、PPT带语音播放、Word自动生成、Excel数据处理、图片处理、视频处理、office文档转为PDF、PDF加解密、加水印等等,都是实用的干货。
使用方法极简,大多数功能只需一行、两行代码。
使用PIP 安装office库:
请在命令行,通过PIP安装:
pip install jojo-office
office库的安装名称是 jojo-office
使用时: import office 即可。
import office
office库依赖库包括:python-docx, openpyxl, python-pptx, PyPDF4, reportlab, playsound等, 安装时将自动安装完成。
如需要导入导出DataFrame, 则依赖 pandas 库,请按需要安装
pip install pandas -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
office库只支持新版的office文件(扩展名为 .docx, .xlsx, .pptx),不支持office2003以前的老版本office文件(扩展名为 .doc, .xls, .ppt)。
五、自动生成Word文件
1、一行代码自动生成Word的实战效果
import office
# 以 试卷模板.docx为模板,生成output.docx, 填入datafile.xlsx文件数据,保存
office.open_file("output.docx", "试卷模板.docx").fill("datafile.xlsx").save()
生成了一张试卷 output.docx 文件, 如下:
一张漂亮的考试卷就产生了, 有单选题、多选题、简答题、编程题等等
2、自动生成Word文件的原理
自动生成Word文件的方法是:首先写一个模板Word文件,复制模板创建新文件,再填入数据。
填入不同的数据,则产生不同的文件内容。
例如:模板Word文件 template.docx 的文字内容如下:
姓名 : {name}
年龄 : {age}
大括号 { } 中包含的叫变量, 上例中的:name, age。
在填入数据时,变量将替换为相应的值。
2.1 将Excel数据填入Word文件
Excel文件 datafile.xlsx 中,Sheet1工作表B2单元格内容是 'Peter', C2格内容是 18。
则,模板Word文件 template1.docx 写成这样:
姓名 : {Sheet1!B2}
年龄 : {Sheet1!C2}
python程序如下:
import office
# 以 template1.docx 为模板,创建 output.docx 文件
wd = office.open_file("output.docx", template="template1.docx")
# 从 datafile.xlsx 文件中取数据, 填入, 保存
wd.fill('datafile.xlsx').save()
上述程序也可以连写为一行:
office.open_file("output.docx", template="template1.docx").fill('datafile.xlsx').save()
程序运行后,生成 output.docx 文件, 其内容如下:
姓名 : Peter
年龄 : 18
可见,Excel文件中的数据,替换了 Word文档中的变量,生成了Word文档内容。
小结:
写模版文件就是在适当的位置写入变量。变量以 { 号开头,} 号结尾。
指向Excel数据的变量名就是 工作表及单元格的引用地址, 如: {Sheet1!B2} 。
生成Word就是填入数据。同一模板生成不同的Word文件,更换数据即可。
填入数据时, Word 文字格式(包括字体、大小、位置、颜色)都没有变。
2.2 将dictionary数据 填入Word文件
模板Word文件 template3.docx 写成这样:
姓名 : {name}
年龄 : {age}
即: 有两个变量 name, age
python程序如下:
import office
# 数据
data = {'name': 'Peter', 'age': 18}
# 以 template3.docx 为模板,创建 output.docx 文件
wd = office.open_file("output.docx", template="template3.docx")
# 填入数据data, 保存
wd.fill(data).save()
上述程序也可以连写为一行:
office.open_file("output.docx", template="template3.docx").fill(data).save()
程序运行后,生成 output.docx 文件, 其内容如下:
姓名 : Peter
年龄 : 18
如果 dictionary 是多层级的,比如:
data = { 'friend': { 'name': 'Mary', 'age': 19} }
则模板写为:
姓名:{friend.name}
年龄:{friend.age}
2.3 多次填入数据
如果数据分布在多个Excel文件或 dictionary 中,可以多次调用fill()填充数据,例如:
wd = office.open("output.docx", "template.docx")
# 先填充 1.xlsx Excel数据,再填充 dict1 数据
wd.fill('1.xlsx').fill(dict1).save()
2.4 重复书写文字段落
有时,我们需要重复写某些文字段落,比如:列出人员名单。
Excel文件 datafile.xlsx 的 Sheet1工作表B2:C4区域有一个表格。
模板Word文件 template2.docx 写成这样:
{@repeat 姓名 : {Sheet1!B2}, 年龄 : {Sheet1!C2} }
'{@repeat' 表明需要重复,重复部分为 '姓名 : {Sheet1!B2}, 年龄 : {Sheet1!C2}'。
注意最后有一个 } 符号,与 {@repeat 形成闭环。
重复次数由其中的变量决定。 从 Sheet1!B2 开始,每次向下读取一行 Sheet1!B3、Sheet1!B4 ... 直达空值为止。
python程序如下:
import office
wd = office.open_file("output.docx", template="template2.docx")
# 从 datafile.xlsx 文件中取数据, 填入, 保存
wd.fill('datafile.xlsx').save()
程序运行后,生成 output.docx 文件, 其内容如下:
姓名 : Peter, 年龄 : 18
姓名 : Sam, 年龄 : 19
姓名 : Mary, 年龄 : 2
因为Excel表格数据有三行,所以重复了3次。
2.5 将Word文件另存为PDF
python程序如下:
# 打开 output.docx 文件, 另存为 output.pdf
office.open_file("output.docx").save("output.pdf")
注: 存为PDF的功能需要本机安装有Microsoft Word或 WPS,(Windows环境)。
3、应用示例:
3.1 应用示例:邀请函
开大会,每个客户要打印一张纸的邀请函。
把客人姓名、称谓写入列表,写一个循环,生成一批word文件, 打印它们即可。
模板文件见邀请函模板.docx, 大致内容如下:
尊敬的{name}{title}:
您好!我们很荣幸地邀请您...
python代码如下:
import office
persons = [
["张三", "先生"],
["李四", "女士"],
["王五", "总经理"],
]
filenames = []
for person in persons:
data = {'name': person[0], 'title': person[1]}
filename = person[0] + ".docx"
office.open_file(filename, "邀请函模板.docx").fill(data).save()
filenames.append(filename)
# 可以使用 print_files() 批量打印文件
office.print_files(filenames)
程序运行后,生成了 3个Word文件。
3.2 应用示例:生成一张考试卷
一张考试卷, 有多道选择题、多道简答题等等。
将题目、选项等数据写在Excel文件 datafile.xlsx 的 '试卷'工作表中。
模板文件为 试卷模板.docx, 内容大致如下。
模板说明:
{日期} 是从 dict 数据中填入的。
其他数据均来自 Excel数据的 '试卷'工作表
'一' 这个部分的 重复段落 '{@repeat .... }' 中包括四行。
第一行是 {@index}序号、{试卷!A6}题目、{试卷!F6}答案。
{@index} 是一个特殊变量,表示重复的序号。
第二行是 {试卷!B6} 选项A 、 {试卷!C6} 选项B。
第三行是 {试卷!D6} 选项C 、 {试卷!E6} 选项D。
第四行是一个空行。表示每道题之间空一行。
'二' 这个部分类似... ...
python程序如下:
import office
wd = office.open_file("output.docx", "试卷模板.docx")
wd.fill('datafile.xlsx') # 填入Excel数据
wd.fill({'日期': '2022年'}) # 填入变量 '日期'
wd.save()
程序运行后,生成 output.docx 文件, 其内容如下:
一张漂亮的考试卷就产生了, 有单选题、多选题、简答题、编程题等等。
Word模板文件只是定义了试卷的组成部分和格式、变量。
试卷的所有数据内容都是在Excel文件中定义。
以上方法是通用的, 可以生成任何试卷、或其他类型的文档。
小结:
1, office库提供了 Word生成功能。
2, 写一个模板Word文件,编写变量。填入数据,即可生成Word文件.
3, 数据可以放在Excel文件中。变量为 Excel的 {工作表!单元格}。
4, 数据可以是 dictionary。变量为 键名,如:{key}。
5,段落可以重复生成
6, Word可以存为PDF。
续篇:
office库还有其他许多功能,下节课再讲。
office库还在开发完善中,偶有bug请见谅、或提改进。
有兴趣深入研究的,可以看office.py的源码。