系列教程:
Python 自动化教程(1) 概述,第一篇 Excel自动化
Python 自动化教程(2) : Excel自动化:使用pandas库
Python 自动化教程(3) : 自动生成PPT文件 Part 1
Python 自动化教程(4) : 自动生成PPT文件 Part 2
四、自动生成PPT文件
自动化办公中,经常要批量处理office文件。
比如:每月花很多时间写PPT,能自动生成PPT,就好了。
1、office库简介
本人用 python 写了一个 office库,用于办公自动化,功能是很强的, 包括:PPT自动生成、PPT转长图、PPT带语音播放、Word自动生成、Excel数据处理、图片处理、视频处理、office文档转为PDF、PDF加解密、加水印等等,都是实用的干货。
使用方法极简,大多数功能只需一行、两行代码。
1.1、一行代码自动生成PPT的实战效果
import office
# 以 template.pptx 为模板,创建 output.pptx 文件, 填入datafile.xlsx文件数据, 保存
office.open_file("output.pptx", "template.pptx").fill('datafile.xlsx').save()
代码简单,但生成的PPT效果却是不简单的。如图:
本教程将office库源码、例程、使用方法分享给大家。
1.2、使用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)。
2、自动生成PPT文件的原理
自动生成PowerPoint文件的方法是:首先写一个模板PowerPoint文件,复制模板创建新文件,再填入数据。 填入不同的数据,则产生不同的PPT文件,从而实现批量生成, 比如:使用每个月的Excel报表文件数据,生成当月的PPT。
模板PPT文件就是一个普通的PPT文件,内容和格式按需要写。只不过在要填入数据的地方,写入变量即可。变量的写法如下:
比如:模板PowerPoint文件 template.pptx, 幻灯片中的文字内容如下:
其中:大括号 { xxx } 包含文字叫作变量。{name}、{age}就是变量。
生成PPT的过程就是填入数据,将变量将替换为相应的值。name变量将替换为name的值。age变量将替换为age的值。
注意:要使用英文的大括号,不要使用全角字符的大括号,否则变量将无法识别。
3、将Excel文件作为数据源,填入PowerPoint模板文件
3.1 文字
Excel文件是 datafile.xlsx,其 Sheet1工作表B2单元格内容是 'Peter', C2格内容是 18。
模板PowerPoint文件 template1.pptx 写成这样:
变量 {Sheet1!B2} 指明 数据来自 Excel文件的 Sheet1 工作表的 B2 单元格。
变量 {Sheet1!C2} 指明 数据来自 Excel文件的 Sheet1 工作表的 C2 单元格。
生成PPT的python程序如下:
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()
程序运行后,生成 output.pptx 文件, 其内容如下:
小结:
写模版文件就是在适当的位置写入变量。变量以 { 号开头,} 号结尾。
指向Excel数据的变量名就是 工作表及单元格的引用地址, 如: {Sheet1!B2} 。
生成PPT就是填入数据。同一模板生成不同的PPT,更换数据即可。
填入数据时,格式(包括字体、大小、位置、颜色)都没有变。
模版PPT文件可以包含多张幻灯片,每一页上都可写入变量,数量不限。
3.2 表格
在模板PPT中创建表格,表格的每一列定义一个变量,可以把多行数据填入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 文件, 其内容如下:
可见,Excel的表格数据,填入到PPT表格中了。
注:填入表格的数据行数,取决于PPT模板中表格的行数。如果Excel表格行数大于PPT表格行数,则后面的数据不会被填入。
3.3 图表
在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 文件, 其内容如下:
可见, PPT图表已更新。
在PowerPoint中打开刚才生成的文件 output.pptx,右键单击图表,选择菜单:“编辑数据",
则可以看到PPT图表的数据表已经被更改为Excel文件的相应数据表,如下:
事实上, office库的处理方法,就是更新PPT图表的数据表后, 重建图表。
注:office库的图表功能目前支持2D图表,不支持3D图表。因此,模板中的图表不能是3D图表类型。
3.4 插入图片、视频、音频
如果数据是图片文件名,则可以在PPT中插入该图片文件。
模板文件 template4.pptx 中画了一个文本框,填入文字,写上变量 {@Sheet1!D2},变量名前加上一个 ‘@’字符表明它是一个特殊变量。当它是一个图片文件名时,将插入该图片文件。模板如图:
python程序如下:
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 生成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 文件, 其内容如下:
3.6 将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="商业秘密,注意保管")
一张漂亮的长图就产生了。
3.6 将PPT存盘为PDF
# 打开 report.pptx, 存盘为PDF, 加水印
office.open_file("report.pptx").save("report.pdf", watermark="商业秘密,注意保管")
存为PDF,save()文件名取名为 .pdf 即可。 watermark是水印文字。
注意:PPTX转PDF的功能,需要本机安装了Microsoft Powerpoint程序或WPS Office
4、循环播放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"]
])
把间隔时间数组中,需要播放语音的页面位置写成 数组, 形如: [间隔秒数,语音文件名]。
如上, 当播放到第二页时,播放 1.wav, 停留3秒。 当播放到第四页时,播放 2.wav, 停留1秒。
也可以把播放间隔写成一个文本文件。 比如: play.txt,内容如下:
1
3 1.wav
3
1 2.wav
格式为: 每一行表示一页PPT的播放 间隔秒数 + 空格 + 语音文件名。
则,python程序中, 引用这个文件即可。
office.open_file("report.pptx").play("play.txt")
效果与之前用数组表达的是一样的。
播放PPT带语音的应用场景:例如: 开展览会时,自动放PPT+语音。省去解说人员。
小结:
1, office库提供了强大的PPT生成功能。
2, 写一个模板PPT文件,编写变量。填入数据,即可生成PPT.
3, 数据可以放在Excel文件中。变量为 Excel的 {工作表!单元格} 即可。
4,PPT可以存为长图。可以带语音播放。
续篇:
office库还有其他许多功能,下节课再讲。
office库还在开发完善中,偶有bug请见谅、或提改进。
有兴趣深入研究的,可以看office.py的源码。