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


     系列教程:

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

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

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

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

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

    Python 自动化教程(6) : PDF文件处理

    四、自动生成PPT文件 

    自动化办公中,经常要批量处理office文件。

    比如:每月花很多时间写PPT,能自动生成PPT,就好了。

    本文的源码和文件下载请点这里

    1、office库简介

        本人用 python 写了一个 office库,用于办公自动化,功能是很强的, 包括:PPT自动生成、PPT转长图、PPT带语音播放、Word自动生成、Excel数据处理、图片处理、视频处理、office文档转为PDF、PDF加解密、加水印等等,都是实用的干货。

    使用方法极简,大多数功能只需一行、两行代码。

    1.1、一行代码自动生成PPT的实战效果

    1. import office
    2. # 以 template.pptx 为模板,创建 output.pptx 文件, 填入datafile.xlsx文件数据, 保存
    3. 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程序如下:

    1. import office
    2. # 以 template1.pptx 为模板,创建 output.pptx 新文件
    3. # 如果 output.pptx 文件已存在,则将覆盖原文件
    4. ppt = office.open_file("output.pptx", template="template1.pptx")
    5. # 从 datafile.xlsx 文件中取数据, 填入, 保存
    6. 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程序如下:

    1. import office
    2. ppt = office.open_file("output.pptx", template="template2.pptx")
    3. # 从 datafile.xlsx 文件中取数据, 填入, 保存
    4. 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程序如下:

    1. import office
    2. # 以 template3.pptx 为模板,创建 output.pptx 文件, 填入datafile.xlsx 文件数据, 保存
    3. 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程序如下:

    1. import office
    2. # 以 template4.pptx 为模板,创建 output.pptx 文件, 填入datafile.xlsx 文件数据, 保存
    3. 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程序如下:

    1. import office
    2. # 以 template5.pptx 为模板,创建 report.pptx 文件, 填入datafile.xlsx 文件数据, 保存
    3. office.open_file("report.pptx", "template5.pptx").fill('datafile.xlsx').save()

    程序运行后,生成 output.pptx 文件, 其内容如下:

      

    3.6 将PPT存盘为一张长图 

    一张长图就是把PPT每一页变成图片,连接为一张长图。

    注意:存盘为长图的功能,需要本机安装了Microsoft Powerpoint程序或WPS Office

    打开pptx文件,存盘为一个jpg文件,即可保存为一张长图。

    python程序如下:

    1. # 打开 report.pptx, 存盘为 一张长图 (注:存盘文件名为一个jpg文件,就是保存为一张长图)
    2. office.open_file("report.pptx").save("long.jpg")

     如果长图需要加水印,则在调用save()时加上 watermark 参数, 程序如下:

    1. # 打开 report.pptx, 存盘为 一张长图 (注:存盘文件名为一个jpg文件,就是保存为一张长图)
    2. office.open_file("report.pptx").save("long.jpg", watermark="商业秘密,注意保管")

    一张漂亮的长图就产生了。

    3.6 将PPT存盘为PDF

    1. # 打开 report.pptx, 存盘为PDF, 加水印
    2. office.open_file("report.pptx").save("report.pdf", watermark="商业秘密,注意保管")

    存为PDF,save()文件名取名为 .pdf 即可。 watermark是水印文字。

    注意:PPTX转PDF的功能,需要本机安装了Microsoft Powerpoint程序或WPS Office

    4、循环播放PPT,同步播放语音

    放PPT,每隔几秒自动翻页,播放到最后一页后跳回第一页,循环播放

    python程序如下:

    1. # 循环播放PPT,打开 report.pptx, 播放PPT, 每隔3秒换到下一页
    2. 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时,可以在播放到某个页面时同步播放语音文件。

    1. # 循环播放PPT, 在第2页时,播放语音文件 1.wav
    2. office.open_file("report.pptx").play([
    3. 1,
    4. [3, "1.wav"],
    5. 3,
    6. [1, "2.wav"]
    7. ])

    把间隔时间数组中,需要播放语音的页面位置写成 数组, 形如: [间隔秒数,语音文件名]。

    如上, 当播放到第二页时,播放 1.wav, 停留3秒。 当播放到第四页时,播放 2.wav, 停留1秒。 

    也可以把播放间隔写成一个文本文件。 比如: play.txt,内容如下:

    1. 1
    2. 3 1.wav
    3. 3
    4. 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的源码。

  • 相关阅读:
    ZEMAX | 在OpticStudio中通过几何光线追迹来模拟杨氏双缝干涉实验
    卷积神经网络实践-猫狗分类
    Momenta“飞轮式L4”接受夜间长尾场景「像素级」挑战,表现堪比老司机
    关于js_节流的介绍和简单的使用
    通过Redis实现一个异步请求-响应程序
    springboot项目的配置和基本案例练习
    2022CTF培训(二)Hook进阶&反调试
    DSU ON TREE
    大一Web课程设计:企业网站——HTML+CSS+JavaScript电子购物商城(37页面)
    从接口中返回二进制数据
  • 原文地址:https://blog.csdn.net/c80486/article/details/126434547