Python-pptx教程之一从零开始生成PPT文件
简介
python-pptx是一个用于创建、读取和更新PowerPoint(.pptx)文件的python库。
典型的用途是根据动态内容(如数据库查询、分析数据等),将这些内容自动化生成PowerPoint演示文稿,将数据可视化,方便查看
我们也可以用它做办公自动化,定义一套模板,然后根据给出的内容批量生成PPT文件,大大提高我们的办公效率
Python-pptx的Github地址
https://github.com/scanny/python-pptx
开发文档
https://python-pptx.readthedocs.io/en/latest/
安装python-pptx
pip install python-pptx
本文使用的版本为0.6.21
使用python-pptx创建新的PPT
生成一个全新的PPT文件,这种方式适用于所有样式都是由代码来控制的场景
幻灯片效果

实现以上效果的代码
from pptx import Presentation# 创建一个新的 Presentation 对象
prs = Presentation()
# 获取一个包含主标题和副标题的幻灯片版式
title_slide_layout = prs.slide_layouts[0]
# 将幻灯片加入到PPT中
slide = prs.slides.add_slide(title_slide_layout)
# 获取主标题
title = slide.placeholders[0]
# 获取副标题
subtitle = slide.placeholders[1]title.text = "Hello, World!"
subtitle.text = "python-pptx create it"
# 保存创建的PPT文件
prs.save('G:/simple_ppt/test/test1.pptx')
上例中的prs.slide_layouts[0] 获取幻灯片的版式,幻灯片的版式共有11个,如下所示

从左到右依次是slide_layouts[0]、slide_layouts[1] 一直到 slide_layouts[10],通过对应的下标即可获取对应的幻灯片版式
Tips:
上面代码中的slide = prs.slides.add_slide(title_slide_layout)
即prs.slides 代表的是当前PPT中所有幻灯片的集合,通过add_slide 添加一张幻灯片后拿到的slide ,后续针对这个slide 的各种操作也就是单张幻灯片的操作
修改幻灯片大小
1、直接通过slide_width和slide_height指定
from pptx.util import Cmprs = Presentation()
prs.slide_width = Cm(33.85)
prs.slide_height = Cm(19.02)
2、通过模板指定
可以先自定义一个指定了宽高的空白页PPT模板,创建Presentation对象时引用它,后续创建的幻灯片就能继承到对应的宽高大小
prs = Presentation("G:/simple_ppt/test/template.pptx")
创建文本
段落创建
想要在幻灯片中添加文本,先要通过add_textbox创建一个文本框,然后取得text_frame来进行操作
from pptx import Presentation
from pptx.util import Cmdef test_blog_text_add():prs = Presentation()prs.slide_width = Cm(33.85)prs.slide_height = Cm(19.02)bullet_slide_layout = prs.slide_layouts[6] # 空白版式slide = prs.slides.add_slide(bullet_slide_layout)# 添加文本框tx_box = slide.shapes.add_textbox(left=Cm(2.58), top=Cm(1.16), width=Cm(28), height=Cm(2.36))tf = tx_box.text_framep0 = tf.paragraphs[0]p0.text = '这是第一行段落'p1 = tf.add_paragraph()p1.text = '这是新增的第二行段落'run = p1.add_run()run.text = '。第二行结尾直接添加文字'prs.save("G:/simple_ppt/test/blog_test.pptx")
生成效果如下

Tips:
上面代码中的:tx_box = slide.shapes.add_textbox(…
slide.shapes代表的是当前幻灯片中所有元素的集合,如文本框、图片、图标、视频等等可框选的东西,都是shapes,所以若要添加什么东西,也是通过shapes.add_xxx的方式来实现
文本样式添加
一、自动换行
如果我们输入的文本大于文本框的长度时,默认是不会换行的,可以使用tf.word_wrap来指定自动换行
tf = tx_box.text_frame
tf.word_wrap = True
二、文本布局样式
文本框中的文本默认是上方对齐,可以使用tfvertical_anchor来指定文本的布局方式
from pptx.enum.text import MSO_ANCHORtf = tx_box.text_frame
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- TOP:将文本与文本框顶部对齐
- MIDDLE:垂直居中文本
- BOTTOM:将文本与文本框底部对齐
参考:https://python-pptx.readthedocs.io/en/latest/api/enum/MsoVerticalAnchor.html
注意,这个只是指定了文本垂直方向上的移动,如想文本基于整个文本框居中需要指定段落的布局方式
设置文本段落布局可以通过设置p.alignment 的方式
from pptx.enum.text import MSO_ANCHOR, PP_ALIGNtf = tx_box.text_frame
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p0 = tf.paragraphs[0]
p0.text = '这是第一行段落'
p0.alignment = PP_ALIGN.CENTER
效果如图

PP_ALIGN的参数有以下几个
- CENTER:居中对齐
- DISTRIBUTE:在一行中从左到右均匀分布
- JUSTIFY:每行都在页边空白处开始和结束,并调整单词之间的间距,使该行正好填满段落的宽度
- JUSTIFY_LOW:在单词之间使用少量空格进行对齐
- LEFT:默认的,左对齐
- RIGHT:右对齐
- THAI_DISTRIBUTE:泰语分散对齐,输入泰语时候指定
以上效果就不一一演示了,自己尝试下选择合适的就行
参考:
https://python-pptx.readthedocs.io/en/latest/api/enum/PpParagraphAlignment.html
三、文字样式修改
文字的字体、字号、加粗、斜体、下划线、颜色、超链接等,这些样式通过font 来设置
参数较多,直接上代码
from pptx import Presentation
from pptx.util import Cm, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import MSO_ANCHOR, PP_ALIGNdef test_blog_text_add():prs = Presentation()prs.slide_width = Cm(33.85)prs.slide_height = Cm(19.02)bullet_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(bullet_slide_layout)# 添加文本框tx_box = slide.shapes.add_textbox(left=Cm(2.58), top=Cm(1.16), width=Cm(28.47), height=Cm(5))tf = tx_box.text_frametf.word_wrap = True # 自动换行tf.vertical_anchor = MSO_ANCHOR.MIDDLE # 垂直居中p0 = tf.paragraphs[0] # 第一行段落p0.alignment = PP_ALIGN.CENTER # 设置段落文字居中p0.line_spacing = 1.3 # 间距p0.font.name = 'Arial Black' # 字体p0.font.size = Pt(40) # 字号p0.font.italic = True # 斜体p0.font.bold = True # 粗体p0.font.underline = True # 显示下划线p0.font.color.rgb = RGBColor(255, 0, 0) # 设置红色p0.text = 'Hello World!'p1 = tf.add_paragraph() # 添加新段落p1.text = '这是第二行段落'run = p1.add_run()run.text = "。第二行结尾直接添加文字"run.hyperlink.address = 'https://www.baidu.com' # 添加超链接prs.save("G:/simple_ppt/test/blog_test.pptx")
生成的效果

注意,当给一个文本添加了超链接后,文字的颜色就无法指定了,会变成图中这种蓝色加下划线的样式
段落间距设置
可通过line_spacing指定
p0.line_spacing = 1.3
文字大小自动改变
有时候我们要输入的文本太长,而文本框区域有限,此时可以指定文字的大小根据文本框的大小自动调整文字的大小
from pptx.enum.text import MSO_AUTO_SIZEtf = tx_box.text_frame
tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
MSO_AUTO_SIZE还有其它三个参数
- NONE:不进行任何自动调整,文字可以超出文本框的边界
- SHAPE_TO_FIT_TEXT:根据文字的内容自动调整文本框的宽度和高度,这样可以保持文字的大小不变
- TEXT_TO_FIT_SHAPE:根据文本框的大小自动调整文字的大小,这样可以让文字完全填充文本框
参考:
https://python-pptx.readthedocs.io/en/latest/api/enum/MsoAutoSize.html
文本层级设置
文字层级一般用来处理段落的缩进,对内容进行层级管理,通过level 来指定,每个paragraph的level默认就是0
p2 = tf.add_paragraph()
p2.text = '第一层'
p2.level = 0p3 = tf.add_paragraph()
p3.text = '第二层'
p3.level = 1p4 = tf.add_paragraph()
p4.text = '第三层'
p4.level = 2
效果如下

创建图片
使用add_picture 可以添加图片,指定对应的坐标即可
img_path = 'G:/simple_ppt/res/picture.png'
slide.shapes.add_picture(img_path, left=Cm(2.58), top=Cm(6.16), width=Cm(8.3), height=Cm(5.13))
left和top表示图片左上角顶点分别距离幻灯片左边框和上边框的距离,width和height表示图片的宽和高
创建视频或音频
添加视频使用add_movie
video_path = 'G:/simple_ppt/res/movie.mp4'
slide.shapes.add_movie(video_path, Cm(11.66), Cm(6.22), Cm(8.11), Cm(5.07), mime_type='video/mp4')
视频显示的时候不会自动获取视频里的画面作为预览图,只会显示一个默认的喇叭图标,若想要根据视频的画面来生成预览图,可以借助OpenCV工具来获取视频帧存为图片,然后通过poster_frame_image参数来指定
import cv2video_path = 'G:/simple_ppt/res/movie.mp4'
cap = cv2.VideoCapture(video_path)
cap.set(cv2.CAP_PROP_POS_FRAMES, 0) # 设置要获取的帧
ret, frame = cap.read()
cv2.imwrite(save_poster_temp, frame)
cap.release()slide.shapes.add_movie(video_path, Cm(11.66), Cm(6.22), Cm(8.11), Cm(5.07), mime_type='video/mp4', poster_frame_image=save_poster_temp)
Python-pptx中并没有直接提供添加音频的方法,不过其实音频也可以通过add_movie来指定,只需要修改ime_type参数为audio/mp3
audio_path = 'G:/simple_ppt/res/audio.mp3'
slide.shapes.add_movie(audio_path, Cm(19.77), Cm(6.22), Cm(8.11), Cm(5.07), mime_type='audio/mp3')
效果如下

创建形状图形
Python-pptx中支持添加形状图形,也就是下面这些

可通过add_shape来添加
from pptx.enum.shapes import MSO_SHAPEslide.shapes.add_shape(MSO_SHAPE.STAR_5_POINT, left=Cm(28.83), top=Cm(6.87), width=Cm(3.7), height=Cm(3.7))
STAR_5_POINT表示一个五角星,更多形状参数可查看以下链接
https://python-pptx.readthedocs.io/en/latest/api/enum/MsoAutoShapeType.html#msoautoshapetype
形状图形的一些属性设置
shape = slide.shapes.add_shape(MSO_SHAPE.STAR_5_POINT, left=Cm(28.83), top=Cm(6.87), width=Cm(3.7), height=Cm(3.7))
shape.rotation = 45 # 旋转图标45°
shape.shadow.inherit = True # 是否取消倒影显示
shape.fill.solid() # 设置这个后才能通过下面的fore_color来设置颜色
shape.fill.fore_color.rgb = RGBColor(255, 255, 0) # 修改填充颜色
shape.line.color.rgb = RGBColor(255, 0, 0) # 修改边框颜色
shape.line.width = Cm(0.1) # 修改边框宽度
还可以通过dash_style来指定边框的线条样式
from pptx.enum.dml import MSO_LINEshape.line.dash_style = MSO_LINE.DASH # 设置边框为虚线
MSO_LINE其它参数:
- MSO_LINE.SOLID:实线
- MSO_LINE.DASH:短划线
- MSO_LINE.DASH_DOT:点划线
- MSO_LINE.DASH_DOT_DOT:双点划线
- MSO_LINE.LONG_DASH:长划线
- MSO_LINE.LONG_DASH_DOT:长点划线
- MSO_LINE.ROUND_DOT:圆点线
- MSO_LINE.SQUARE_DOT:方点线
五角星显示的效果
如果不想要图形的边框,可以使用以下方法将边框指定为透明
shape.line.fill.background()
创建幻灯片背景
可以通过slide的background来指定纯色背景
bg = slide.background
bg.fill.solid()
bg.fill.fore_color.rgb = RGBColor(219, 238, 244)
python-pptx库并没有直接提供设置图片作为幻灯片背景的方法,但可以通过将图片设置为铺满整个幻灯片来达到同样的效果
img_path = "G:/bg_image.png"
slide.shapes.add_picture(img_path, Cm(0), Cm(0), width=prs.slide_width, height=prs.slide_height)
slide_width和slide_height获取的分别是整张幻灯片的宽和高
这里要注意图片的层级问题,由于没有提供设置图片层级的方法,所以作为背景的图片应该放在构建幻灯片的第一位
纯色背景效果

创建幻灯片备注信息
幻灯片底部的备注信息,在分屏预览时可用于提示演讲人更详细的幻灯片内容细节
通过has_notes_slide来判断幻灯片是否有备注,通过以下代码可以获得幻灯片的备注信息
if slide.has_notes_slide:text_frame = slide.notes_slide.notes_text_frameprint("备注文本:", text_frame.text)
若想修改备注信息,直接通过text指定即可
text_frame = slide.notes_slide.notes_text_frame
text_frame.text = "被修改的备注信息"
备注修改效果

总结
本篇文章介绍了如何使用python-pptx框架生成PPTX文件的方法,通过以上学习,可以掌握如何通过Python-pptx框架控制幻灯片大小、创建各种样式的文本、在幻灯片中添加图片、视频和音频,添加形状图形及如何修改它的样式,如何设置幻灯片的背景和备注信息等技能
下一篇将会介绍如何针对已有的PPT模板进行修改
相关文章:
Python-pptx教程之一从零开始生成PPT文件
简介 python-pptx是一个用于创建、读取和更新PowerPoint(.pptx)文件的python库。 典型的用途是根据动态内容(如数据库查询、分析数据等),将这些内容自动化生成PowerPoint演示文稿,将数据可视化,…...
k8s 使用ingress-nginx访问集群内部应用
k8s搭建和部署应用完成后,可以通过NodePort,Loadbalancer,Ingress方式将应用端口暴露到集群外部,提供外部访问。 缺点: NodePort占用端口,大量暴露端口非常不安全,并且有端口数量限制【不推荐】…...
企业数据泄露怎么办?
随着数字化时代的到来,威胁企业数据安全的因素越来越多。一旦机密数据泄露,不仅会对企业造成巨大的经济损失,还会对企业的声誉和客户信任度造成严重影响。发生数据泄露情况时,企业该怎样应对? 1.确认数据泄露 确认是…...
GoLong的学习之路(一)语法之变量与常量
目录 GoLang变量批量声明变量的初始化类型推导短变量声明匿名变量 常量iota(特殊)(需要重点记忆) GoLang go的诞生为了解决在21世纪多核和网络化环境越来越复杂的变成问题而发明的Go语言。 go语言是从Ken Thomepson发明的B语言和…...
Go-Python-Java-C-LeetCode高分解法-第十一周合集
前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接:LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏,每日一题,和博主一起进步 LeetCode专栏 我搜集到了50道精选题,适合速成概览大部分常用算法 突…...
封装axios的两种方式
作为前端工程师,经常需要对axios进行封装以满足复用的目的。在不同的前端项目中使用相同的axios封装有利于保持一致性,有利于数据之间的传递和处理。本文提供两种对axios进行封装的思路。 1. 将请求方式作为调用参数传递进来 首先导入了axios, AxiosIn…...
【自然语言处理】NLTK库的概念和作用
文章目录 一、NLTK库介绍二、NLTK库的使用2.1 初级使用2.2 中级使用 参考资料 一、NLTK库介绍 Natural Language Toolkit (NLTK)是一个广泛使用的Python自然语言处理工具库,由Steven Bird、Edward Loper和Ewan Klein于2001年发起开发。NLTK的目的是为自然语言处理&…...
Python爬虫如何解决提交参数js加密
注意!!!! 仅做知识储备莫拿去违法乱纪,有问题指出来,纯做笔记记录 由于¥%…………&&%#%** 所以!#¥……&*……* 啥也不说直接上代码 import execjs js_ji…...
云数据库及RDS数据库介绍
1.云数据库概念 云数据库是指被优化或部署到一个虚拟计算环境中的数据库,具有按需付费、按需扩展、高可用性以及存储整合等能力。 2.云数据库特性 云数据库的特性有:实例创建快速、支持只读实例、读写分离、故障自动切换、数据备份、Binlog备份、SQL审…...
c语言进阶部分详解(详细解析自定义类型——枚举,联合(共用体))
上篇文章介绍了结构体相关的内容,大家可以点击链接进行浏览:c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)-CSDN博客 各种源码大家可以去我的gitee主页进行查找:唔姆 (Nerow…...
使用 Requests 库和 PHP 的下载
以下是一个使用 Requests 库和 PHP 的下载器程序,用于从 www.people.com.cn 下载音频。此程序使用了 https://www.duoip.cn/get_proxy 这段代码。 import requests from bs4 import BeautifulSoup import pafy import timedef get_proxy():url "https://www.…...
ConcurrentHashMap底层具体实现知道吗?实现原理是什么
从这三个方面来回答: ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构,它是由数组、单向链表、红黑树组成. 当我们初始…...
Go语言“Go语言:掌握未来编程的利器“
Go语音的发展史可以追溯到2009年,当时谷歌公司推出了一款名为“Google Assistant”的智能助手,它使用自然语言处理技术来与用户进行交互。随后,Go语音逐渐发展成为一种广泛使用的语音技术,其发展历程如下: 起步阶段&a…...
达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”
在使用达梦数据库管理工具时,我们测试过程中时常需要更新表数据,有时为了便捷,会直接使用管理工具修改表数据的值,但偶尔会遇到“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”的报…...
TensorFlow2从磁盘读取图片数据集的示例(tf.keras.utils.image_dataset_from_directory)
import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50#数据所在文件夹 base_dir ./data/cats_and_dogs train_dir os…...
Unity开发过程中的一些小知识点
1、如何查询挂载了指定脚本的游戏物体 可以直接在Hierarchy面板上,搜索想要找的脚本名 2、如何将Unity生成的多个相同游戏物体获得序号 可以使用Unity的API Transform.GetSiblingIndex() 实现。 Transform.GetSiblingIndex()gameobject.idTransform.GetSiblingI…...
大语言模型(LLM)综述(一):大语言模型介绍
A Survey of Large Language Models 前言1. INTRODUCTION2. OVERVIEW2.1 大语言模型的背景2.2 GPT系列模型的技术演变 前言 随着人工智能和机器学习领域的迅速发展,语言模型已经从简单的词袋模型(Bag-of-Words)和N-gram模型演变为更为复杂和…...
在Ubuntu上安装和挂载NFS
在Ubuntu上安装和挂载NFS可以按照以下步骤进行: 安装NFS客户端工具:在Ubuntu上,可以使用以下命令安装NFS客户端工具: shell复制代码 sudo apt-get install nfs-common 创建挂载点:在本地Ubuntu计算机上,…...
Python 实现的简易数据库管理系统 (DBMS)
在这篇文章中,我们将深入探讨如何使用 Python 从头开始实现一个简易的数据库管理系统 (DBMS)。这不是一个生产级的 DBMS,但它为我们提供了一个如何构建数据库系统的基础概念。 1. 数据表的实现 首先,我们定义了一个 Table 类来模拟数据库中…...
1.初识MySQL
初识 MySQL 1.服务器处理客户端请求2.常用存储引擎3.关于存储引擎的一些操作3.1 查看当前服务器程序支持的存储引擎3.2 设置表的存储引擎3.2.1 创建表时指定存储引擎3.2.2 修改表的存储引擎 4.总结 MySQL 默认采用 TCP/IP 的方式来处理客户端与服务器连接过程。 1.服务器处理客…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
