自动化报告pptx-python|高效通过PPT模版制造报告(三)

本文介绍了如何使用python-pptx和JoStudio的库进行PPT自动化制作,包括字典、DataFrame填充模版,Excel与PPT联动填充,以及PPT保存为长图、PDF和循环播放等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是自动化报告学习的第三篇了,其他系列:

本篇是笔者看到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 (干货)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值