Python 自动化教程(5) : 自动生成Word文件

 系列教程:

Python 自动化教程(1) 概述,第一篇 Excel自动化

Python 自动化教程(2) : Excel自动化:使用pandas库

Python 自动化教程(3) : 自动生成PPT文件 Part 1

Python 自动化教程(4) : 自动生成PPT文件 Part 2

Python 自动化教程(5) : 自动生成Word文件

本篇介绍使用  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 文件, 如下:

Python 自动化教程(5) : 自动生成Word文件_第1张图片

一张漂亮的考试卷就产生了, 有单选题、多选题、简答题、编程题等等

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区域有一个表格。

Python 自动化教程(5) : 自动生成Word文件_第2张图片

模板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  的 '试卷'工作表中。

Python 自动化教程(5) : 自动生成Word文件_第3张图片

模板文件为 试卷模板.docx, 内容大致如下。

Python 自动化教程(5) : 自动生成Word文件_第4张图片

模板说明:

{日期} 是从 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 文件, 其内容如下:

Python 自动化教程(5) : 自动生成Word文件_第5张图片

一张漂亮的考试卷就产生了, 有单选题、多选题、简答题、编程题等等。

Word模板文件只是定义了试卷的组成部分和格式、变量。

试卷的所有数据内容都是在Excel文件中定义。

以上方法是通用的, 可以生成任何试卷、或其他类型的文档。

小结:

1, office库提供了 Word生成功能。

2, 写一个模板Word文件,编写变量。填入数据,即可生成Word文件.

3,  数据可以放在Excel文件中。变量为 Excel的 {工作表!单元格}。

4, 数据可以是 dictionary。变量为  键名,如:{key}。

5,段落可以重复生成

6,  Word可以存为PDF。

本文数据及源码文件下载请点这里

续篇:

office库还有其他许多功能,下节课再讲。

office库还在开发完善中,偶有bug请见谅、或提改进。

有兴趣深入研究的,可以看office.py的源码。

你可能感兴趣的:(Python,自动化,python)