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

需求分析

最近遇到了制作 PPT 报告的任务,前期收集整理后的表格数据长这样:

Excel 数据

随后要基于上述数据制作 PPT 报告,几十页的幻灯片都是下图的格式:

幻灯片示例1

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')

Hello World

更多用例请移步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:

运行结果1

运行结果2

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

幻灯片示例2

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

使用Python-pptx 告别繁琐的幻灯片制作的更多相关文章

  1. 在两个屏幕上运行的iOS应用程序(无镜像)

    我创建了一个包含幻灯片的iPad应用程序,当用户点击此幻灯片时,他/她可以输入一些信息.我现在要做的是在通过AirPlay连接电视和iPad时在电视上显示幻灯片显示内容可以这样做吗?如何在iOS中完成?所以不要反映整个应用程序.解决方法您可以使用Airplay和AppleTV编写应用程序以处理2个UIScreens,然后为电视UIScreen和iPadUIScreen设置单独的根视图控制器.然后在电视的视图控制器上显示图像或幻灯片,并从iPad视图控制器的事件中运行该图像或幻灯片!

  2. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  3. iOS 7在右侧添加了幻灯片,可以将视图控制器从堆栈中弹出.是否可以通过向左滑动将其添加回去?

    或者有关于如何完成它的任何信息?

  4. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  5. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  6. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  9. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  10. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部