这是自动化报告学习的第三篇了,其他系列:
- 自动化报告的前奏|使用python-pptx操作PPT(一)
- 自动化报告pptx-python|如何将pandas的表格写入PPTX(二)
- 自动化报告pptx-python|高效通过PPT模版制造报告(三)
- 自动化报告pptx-python|pptx 分析报告的工具包:reportgen(四)
本篇是笔者看到JoStudio 大佬自己写的一个jojo-office
库,基于pptx-python开发成一套试用office软件的依赖,非常给力,本篇就汇总一下大佬这个依赖库,在PPT上的应用。
大佬相关的博客:
文章目录
1 安装与初步使用
pip install jojo-office
其他依赖:
pip install python-docx openpyxl python-pptx PyPDF4 pypiwin32 reportlab playsound -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
功能:
office库,用于办公自动化,功能是很强的, 包括:PPT自动生成、PPT转长图、PPT带语音播放、Word自动生成、Excel数据处理、图片处理、视频处理、office文档转为PDF、PDF加解密、加水印等等
注意:
office库只支持新版的office文件(扩展名为 .docx, .xlsx, .pptx),不支持office2003以前的老版本office文件(扩展名为 .doc, .xls, .ppt)。
2 简单的PPT模版填充
准备PPT模版:
其中:大括号 { xxx } 包含文字叫作变量。{name}、{age}就是变量。
生成PPT的过程就是填入数据,将变量将替换为相应的值。name变量将替换为name的值。age变量将替换为age的值。
注意:要使用英文的大括号,不要使用全角字符的大括号,否则变量将无法识别,具体可以看到ppt.py
代码:
var_name = ''
for run in paragraph.runs:
old_text = run.text
text = ''
for idx, c in enumerate(old_text):
if len(var_name) == 0:
if c == '{':
var_name = c
else:
text += c
else:
if c == '}':
var_name += c
v = Variable(var_name)
# 如果有 repeat 标志,且 repeat 未开始
if v.is_repeat and row == 0:
remain_text = old_text[idx + 1:]
# 将 varname 写入 run.text
run.text = text + var_name + remain_text
return var_name
else:
if data.has_var(v):
s = process(v)
text += s
else:
text += var_name
var_name = ''
elif c == '{':
text += var_name
var_name = c
else:
var_name += c
2.1 字典Dict数据填充PPT表格
将 dictionay 作为数据源,填入PowerPoint模板文件
创建PPT模版:
代码:
import office
data = {
"姓名": "Peter",
"年龄": 18,
"相片": "peter.jpg",
'学习': {
'课程': ['语文', '数学', '英语'],
'成绩': [95.3, 68, 75],
'评价': ['优', '差', '中']
}
}
# 以 template6.pptx 为模板,创建 report.pptx 文件, 填入data dict数据, 保存
office.open_file("report.pptx", "template6.pptx").fill(data).save()
其中,data也可以包括图片路径
最后生成的效果:
2.2 DataFrame填充PPT表格
模版:
变量写法:
- 1, 变量 {课程[0]} 表示 DataFrame 的 “课程”列的第0行
- 2, 对于表格,第一行写: 以 DataFrame的列名 为变量
图表的变量输入,要右键点击图表,点击“编辑数据”菜单,在数据表第一行写入变量。以 DataFrame的列名 为变量
2.3 Dict + Excel数据同时填充PPT
有时,有多个数据源,可以多次调用 fill() 多次填入数据。
模板文件 template8.pptx 如下,
模板中, 表格中的 {Sheet1!B1} 等变量数据来自 Excel.
{姓名} {年龄} 等变量数据来自 dictionary
python 程序如下:
import office
person = {"姓名": "Peter", "年龄": 18, "相片": "peter.jpg"}
# 以template8.pptx为模板创建文件, 填入datafile.xlsx文件数据, 再填入person数据,保存
office.open_file("report.pptx", "template8.pptx").fill('datafile.xlsx').fill(person).save()
运行结果 生成report.pptx 如下:
3 Excel 与 PPT 模版 联动填充
3.1 联动案例一:excel数据填入ppt的文本框
第一步:准备excel模版
Excel文件是 datafile.xlsx,其 Sheet1工作表B2单元格内容是 ‘Peter’, C2格内容是 18:
第二步,准备pptx模版:
模板PowerPoint文件 template1.pptx 写成这样:
其中:
- 变量 {Sheet1!B2} 指明 数据来自 Excel文件的 Sheet1 工作表的 B2 单元格。
- 变量 {Sheet1!C2} 指明 数据来自 Excel文件的 Sheet1 工作表的 C2 单元格。
之后:
import office
# 以 template1.pptx 为模板,创建 output.pptx 新文件
# 如果 output.pptx 文件已存在,则将覆盖原文件
ppt = office.open_file("output.pptx", template="template1.pptx")
# 从 datafile.xlsx 文件中取数据, 填入, 保存
ppt.fill('datafile.xlsx').save()
# 写成一行的方式
office.open_file("output.pptx", "template1.pptx").fill('datafile.xlsx').save()
运行后:
注意:
- 写模版文件就是在适当的位置写入变量。变量以
{
号开头,}
号结尾。 - 指向Excel数据的变量名就是 工作表及单元格的引用地址, 如:
{Sheet1!B2}
。 - 生成PPT就是填入数据。同一模板生成不同的PPT,更换数据即可。
- 填入数据时,格式(包括字体、大小、位置、颜色)都没有变。
- 模版PPT文件可以包含多张幻灯片,每一页上都可写入变量,数量不限。
3.2 联动案例二:excel数据填入ppt的表格中
datafile.xlsx 的 Sheet1工作表有一个表格
模板文件 template2.pptx 中画了一个表格 4行 X 2列,每一列的第一行写上变量,写成这样:
python程序如下:
import office
ppt = office.open_file("output.pptx", template="template2.pptx")
# 从 datafile.xlsx 文件中取数据, 填入, 保存
ppt.fill('datafile.xlsx').save()
程序运行后,生成 output.pptx 文件, 其内容如下:
填入表格的数据行数,取决于PPT模板中表格的行数。
如果Excel表格行数大于PPT表格行数,则后面的数据不会被填入。
3.3 联动案例三:excel数据填入ppt的表格中
准备一:excel数据的格式
如下:
准备二:在PPT模板中创建图表
每个图表有一个数据表,将图表数据表每一列定义为一个变量。生成PPT时,数据将填入PPT图表的数据表,则PPT图表将更新。
在PowerPoint程序中打开模板文件 template3.pptx,创建一个直方图。
在PowerPoint程序中, 右键单击图表,选择菜单:“编辑数据", 则可以看到图表的数据表。
修改数据表的第一行,每一列的第一行修改为变量,例如:{商品销售1!B1} 表示本列的数据来自 Excel数据文件的 商品销售工作表 的 B列。 修改后数据表如下图:
python程序如下:
import office
# 以 template3.pptx 为模板,创建 output.pptx 文件, 填入datafile.xlsx 文件数据, 保存
office.open_file("output.pptx", "template3.pptx").fill('datafile.xlsx').save()
程序运行后,生成 output.pptx 文件, 其内容如下:
在PowerPoint中打开刚才生成的文件 output.pptx,右键单击图表,选择菜单:“编辑数据",
则可以看到PPT图表的数据表已经被更改为Excel文件的相应数据表,如下:
事实上, office库的处理方法,就是更新PPT图表的数据表后, 重建图表。
注:office库的图表功能目前支持2D图表,不支持3D图表。因此,模板中的图表不能是3D图表类型。
3.4 联动案例四:excel数据在ppt插入图片、视频、音频
如果数据是图片文件名,则可以在PPT中插入该图片文件。
excel模版
ppt模版
模板文件 template4.pptx 中画了一个文本框,填入文字,写上变量 {@Sheet1!D2},变量名前加上一个 ‘@’字符表明它是一个特殊变量。当它是一个图片文件名时,将插入该图片文件。模板如图:
代码:
import office
# 以 template4.pptx 为模板,创建 output.pptx 文件, 填入datafile.xlsx 文件数据, 保存
office.open_file("output.pptx", "template4.pptx").fill('datafile.xlsx').save()
注意: datafile.xlsx 文件 Sheet1!D2 单元格 的值是 “peter.jpg”,是一个图片文件名。 该文件名没有指明路径,因此这个图片文件要放在当前目录下。当然,文件名使用绝对路径则没有问题。
程序运行后,生成 output.pptx 文件, 其内容如下。可见,PPT文档插入了一张图片 peter.jpg, 图片大小和位置与变量所在的文本框一致。
同理, .mp3, .mp4 等音频、视频文件也可以插入PPT文档。
3.5 excel多种格式混合填入PPT
将上述 文字、表格、图表、图片功能合在一起,可以生成PPT综合报告了。
数据文件在 datafile.xlsx , 这个文件中有多个工作表: 商品销售、客户、库存、汇总。
模板文件 template5.pptx 是一个典型的PPT报告,有表格、图表、文字、图片等。其内容如下:
python程序如下:
import office
# 以 template5.pptx 为模板,创建 report.pptx 文件, 填入datafile.xlsx 文件数据, 保存
office.open_file("report.pptx", "template5.pptx").fill('datafile.xlsx').save()
程序运行后,生成 output.pptx 文件, 其内容如下:
4 PPT 保存为长图
将PPT存盘为一张长图
一张长图就是把PPT每一页变成图片,连接为一张长图。
注意:存盘为长图的功能,需要本机安装了Microsoft Powerpoint程序或WPS Office
打开pptx文件,存盘为一个jpg文件,即可保存为一张长图。
python程序如下:
# 打开 report.pptx, 存盘为 一张长图 (注:存盘文件名为一个jpg文件,就是保存为一张长图)
office.open_file("report.pptx").save("long.jpg")
如果长图需要加水印,则在调用save()时加上 watermark 参数, 程序如下:
# 打开 report.pptx, 存盘为 一张长图 (注:存盘文件名为一个jpg文件,就是保存为一张长图)
office.open_file("report.pptx").save("long.jpg", watermark="商业秘密,注意保管")
一张漂亮的长图就产生了。
5 将PPT存盘为PDF
# 打开 report.pptx, 存盘为PDF, 加水印
office.open_file("report.pptx").save("report.pdf", watermark="商业秘密,注意保管")
存为PDF,save()文件名取名为 .pdf 即可。 watermark是水印文字。
注意:PPTX转PDF的功能,需要本机安装了Microsoft Powerpoint程序或WPS Office
6 循环播放PPT,同步播放语音
放PPT,每隔几秒自动翻页,播放到最后一页后跳回第一页,循环播放
python程序如下:
# 循环播放PPT,打开 report.pptx, 播放PPT, 每隔3秒换到下一页
office.open_file("report.pptx").play(3)
程序运行后,将启动Microsoft Powerpoint程序(或WPS Office),自动进入全屏模式,逐页显示PPT,循环播放。上面的代码是每隔3秒换一页。播放过程中,按ESC键中断播放,退出程序。
注意:播放PPT的功能,需要本机安装了Microsoft Powerpoint程序或WPS Office
如果每一页的跳转时间不同,可以把间隔时间写成一个数组。
office.open_file("report.pptx").play([1, 3, 2, 1])
间隔时间数组 [1, 3, 2, 1] 的含义是: 第一页停1秒,第二页停3秒,第三页停2秒,第四页停1秒。
如果有更多页,把数组写长即可。
播放PPT时,可以在播放到某个页面时同步播放语音文件。
# 循环播放PPT, 在第2页时,播放语音文件 1.wav
office.open_file("report.pptx").play([
1,
[3, "1.wav"],
3,
[1, "2.wav"]
])
7 重复按模版生成PPT
datafile.xlsx 的 Sheet1工作表有一个表格
模板文件 template9.pptx 如下,
模板中, 变量名前加了 @repeat 标志,表明这个变量需要重复生成幻灯片。 Sheet1!D1变量前还有一个 @ 符, 表明这个变量值是一张图片。
python 程序如下:
# 以 template9.pptx 为模板,创建 report.pptx 文件, 填入datafile.xlsx 文件数据, 保存
office.open_file("report.pptx", "template9.pptx").fill("datafile.xlsx").save()
生成的 report.pptx 如下:
可见, 模板中的一张幻灯片,变成了3张幻灯片,分别填入了 Excel表格中各行的数据,其中: Sheet1!D1 所在的数据 是图片文件名, 插入了图片。
参考文献
Python 自动化教程(3) : 自动生成PPT文件 Part 1 (干货)
Python 自动化教程(4) : 自动生成PPT文件 Part 2 (干货)