使用Python-pptx 告别繁琐的幻灯片制作
作者:Newyee 发布时间:2021-12-10 12:03:23
Python自动化:python-pptx 批量生成幻灯片
需求分析
最近遇到了制作 PPT 报告的任务,前期收集整理后的表格数据长这样:
随后要基于上述数据制作 PPT 报告,几十页的幻灯片都是下图的格式:
Well, my coding fingers got quite itchy.👋
这种繁琐的手动制作幻灯片还是交给 Python 来自动完成吧!Python 中已有第三方库很好地支持 PowerPoint 👇
python-pptx 介绍
python-pptx是用于创建和更新 PowerPoint(.pptx)文件的 Python 库。
其用途大致如下:
典型的是从数据库内容生成自定义的可用于演示的工程状态报告,可通过单击 Web 应用程序中的链接下载该演示文稿。
用于对演示文稿库进行批量更新。
自动化制作对于人工操作繁琐的幻灯片。
由于开发团队的辛勤维护,目前已具有以下功能:
打开、读取、创建、保存演示文稿(.pptx文件)
添加幻灯片
填充文本占位符,例如创建项目符号幻灯片
添加图像并调整位置和尺寸
添加文本框并调整文本的字体、大小和粗体
添加表格
添加形状,如多边形、流程图形状等
添加图表,如柱形图、条形图、折线图和饼图等
访问和修改元素属性,例如标题、主题等
……(更多功能开发ing)
python-pptx 安装
python-pptx 托管在 PyPI 上,可以很方便地用 pip 安装:
pip install python-pptx
支持 Python 2.6, 2.7, 3.3, 3.4, 3.6(测试 3.7 能正常安装和简单使用,是否会有使用异常尚未知)本文代码运行环境为 Python 3.6。
依赖库会自动安装:lxml、Pillow、XlsxWriter
Hello World! 示例
成功安装后,运行以下示例代码,体验一下效果:
# 导包
from pptx import Presentation
# 创建空白演示文稿
prs = Presentation()
# 添加标题布局的幻灯片
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
# 设置标题和副标题
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"
# 保存
prs.save('test.pptx')
更多用例请移步Getting Started
后面有空我也会整理一下学习 python-pptx 的代码笔记
需求实现
有了 python-pptx 的加持,要实现文章一开始的需求就容易多了,简单分为以下几步:
读取 Excel 数据(并预处理)—— 本例使用 pandas库读取 news.xlsx文件
创建空白演示文稿(并添加封面幻灯片)
依据数据循环添加幻灯片并设置文本格式(这一步是重点也是难点,详细说明参考代码注释)
保存演示文稿
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pptx import Presentation
from pptx.util import Pt
import pandas as pd
class WritePowerPoint:
def __init__(self, ppt_name, input_excel, title_cover, subtitle):
self.ppt_name = ppt_name
self.input_excel = input_excel
self.title_cover = self.title_per_page = title_cover
self.subtitle_cover = subtitle
# 创建空白演示文稿
self.prs = Presentation()
def add_cover(self):
# 添加封面布局幻灯片
slide_layout_cover = self.prs.slide_layouts[0]
slide = self.prs.slides.add_slide(slide_layout_cover)
# 设置标题和副标题
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = self.title_cover
subtitle.text = self.subtitle_cover
def add_slide(self, line2_texts):
# 添加布局5幻灯片
slide_layout = self.prs.slide_layouts[5]
slide = self.prs.slides.add_slide(slide_layout)
shapes = slide.shapes
# 设置标题:内容、位置、字体、大小等格式
title_shape = shapes.title
title_shape.text = self.title_per_page
title_shape.left, title_shape.top = Pt(32), Pt(22)
title_shape.width, title_shape.height = Pt(660), Pt(50)
tf0 = title_shape.text_frame
p0 = tf0.paragraphs[0]
p0.font.name = '微软雅黑'
p0.font.size = Pt(24)
# 添加文本框
left, top, width, height = Pt(32), Pt(82), Pt(665), Pt(396)
text_box = slide.shapes.add_textbox(left, top, width, height)
tf = text_box.text_frame
def add_paragraph_texts(texts):
print(texts[0])
for i, text in enumerate(texts[:-1]): # 最后的网址作为超链接
p = tf.add_paragraph()
p.text = text
if i == len(texts) - 2:
run = p.add_run()
run.text = '查看更多'
run.hyperlink.address = texts[-1] # 写入超链接
tf.add_paragraph()
# 在文本框中添加内容
for lst in line2_texts:
add_paragraph_texts(lst)
def run(self):
# 读取 Excel 数据并进行预处理
df = pd.read_excel(self.input_excel)
df['发布机构'] = '发布机构:' + df['发布机构']
df['发布时间'] = '发布时间:' + df['发布时间']
df['关键词'] = '关键词:' + df['关键词']
# 添加封面幻灯片
self.add_cover()
# 添加重复格式的幻灯片,每页写 2 条数据
for i in df.index[::2]:
self.add_slide([df.loc[i, :].tolist(), df.loc[i+1, :].tolist()])
# 保存
self.prs.save(self.ppt_name)
if __name__ == '__main__':
wpt = WritePowerPoint('news.pptx', 'news.xlsx', 'News Briefs', '2020/4/5')
wpt.run()
代码运行后便可得到若干页的 news.pptx:
代码中还可以加入更多的文本格式设置代码,美化幻灯片:
来源:https://blog.csdn.net/Newyee/article/details/105332116


猜你喜欢
- 今天我们分享一个小案例,获取天气数据,进行可视化分析,带你直观了解天气情况!核心功能设计总体来说,我们需要先对中国天气网中的天气数据进行爬取
- 在学习python的过程中,用来练习代码,并且复习数据结构的#coding:utf-8#author:Elvisclass Stack(ob
- Go 语言的 sync 包提供了一系列同步原语,其中 sync.Cond 就是其中之一。sync.Cond 的作用是在多个 goroutin
- CSS是制作网页效果必不可少的东西,字体的颜色定义、表格的样式定义、图片的特效等等都少不了它。但在Dr
- 正常的页面跳转的api大家应该都清楚,但是涉及到多页面来回跳转以及返回到导航页的时候就需要一些技巧来进行处理,之前找了挺多文章也没有很详细的
- 本文主要总结了ES6正则表达式的一些新功能,分享出来供大家参考学习,下面来看看详细的介绍:一、构造函数实例化参数的变化 大家都知道,在ES5
- 在按钮旁边加文字1.打开editor/js/ 两个js文件fckeditorcode_gecko.js fckeditorcode_ie.j
- 本来想把之前对artTemplate源码解析的注释放上来分享下,不过隔了一年,找不到了,只好把当时分析模板引擎原理后,自己尝试写下的模板引擎
- matplotlib窗口图标默认是matplotlib的标志,如果想修改怎么改呢?由于我选择的matplotlib后端是PyQT5,直接查看
- 1、环境1、python 3.72、pyinstaller2、下载方式:2.1 python安装(略)2.2 安装pyinstaller打开
- 在使用python爬虫技术采集数据信息时,经常会遇到在返回的网页信息中,无法抓取动态加载的可用数据。例如,获取某网页中,商品价格时就会出现此
- 小白学习一下vue,然后了解到了webpack相关的知识,然后就各种安装cnpm 是国内的源相比国际源要快很多,不知道cnpm的自己查一下吧
- 由于想要使用pycharm连接Window子系统Ubuntu进行开发,找了很多教程都不够详细,花了点儿时间,最后配置成功。将pycharm连
- argparse 模块是Python内置的用于命令项选项与参数解析的模块,可以轻松编写友好的命令行接口,能够帮助程序员为模型定义参数。传入一
- 我一般都是通过xpath解析DOM树的时候会使用lxml的etree,可以很方便的从html源码中得到自己想要的内容。这里主要介绍一下我常用
- 一般情况下,网站的图片代码是这样的。<img src="./images/test.jpg"
- 本文实例为大家分享了微信小程序上传图片到php服务器的具体代码,供大家参考,具体内容如下js代码如下 submitPhoto(){ var
- 正常的使用方法安装npm install webpack-bundle-analyzer -Dwebpack.config.js:vue-c
- 本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的陷阱重现我们就用实际的举例来演示我们今天所
- 本文实例讲述了C#操作SQLite数据库之读写数据库的方法。分享给大家供大家参考,具体如下:这里演示读写数据库并在窗体(Form)中显示其数