使用python-pptx自动化批量生成PowerPoint幻灯片

竹里
竹里
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍如何利用python-pptx库通过Python脚本自动化生成PowerPoint演示文稿。文章涵盖库的安装、核心功能解析及从Excel读取数据批量创建幻灯片的完整代码示例,旨在解决手动制作几十页格式统一幻灯片的工作繁琐问题,提升办公效率。

Python自动化:python-pptx 批量生成幻灯片

需求分析

近期面临制作PPT报告的任务,前期整理收集到的表格数据呈现如下形态:

接下来需要基于上述数据制作PPT报告,其中包含几十页幻灯片,且格式均与下图一致:

好吧,我的代码手指已经按捺不住了。👋

这种繁琐的手动制作幻灯片工作,不妨交给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版本(测试显示Python 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:

代码中还可以加入更多的文本格式设置代码,美化幻灯片:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表