使用Python-pptx 告别繁琐的幻灯片制作

作者:Newyee 时间:2021-12-10 12:03:23 

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

需求分析

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

使用Python-pptx 告别繁琐的幻灯片制作

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

使用Python-pptx 告别繁琐的幻灯片制作

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

使用Python-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-pptx 告别繁琐的幻灯片制作

使用Python-pptx 告别繁琐的幻灯片制作

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

使用Python-pptx 告别繁琐的幻灯片制作

来源:https://blog.csdn.net/Newyee/article/details/105332116

标签:Python-pptx,幻灯片,Python
0
投稿

猜你喜欢

  • 通过Django Admin+HttpRunner1.5.6实现简易接口测试平台

    2023-05-24 19:07:45
  • Orcale权限、角色查看创建方法

    2024-01-20 04:22:02
  • Python-split()函数实例用法讲解

    2023-12-12 07:13:20
  • pandas删除部分数据后重新生成索引的实现

    2023-11-18 04:44:13
  • Python解析多帧dicom数据详解

    2022-08-13 21:16:13
  • 使用pyecharts生成Echarts网页的实例

    2023-02-22 10:19:42
  • js如何读取csv内容拼接成json

    2023-08-13 02:20:14
  • js星级评分代码

    2008-05-02 21:07:00
  • Python 数据库操作 SQLAlchemy的示例代码

    2024-01-28 04:42:28
  • 记录无法安装mysql-Invalid GPG Key from file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql的解决办法

    2024-01-13 00:24:22
  • Pthon批量处理将pdb文件生成dssp文件

    2021-10-07 13:11:04
  • 详解Python中pyautogui库的最全使用方法

    2022-11-17 17:07:14
  • Python实战之实现获取动态图表

    2023-10-31 14:03:34
  • PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上

    2021-02-11 11:15:33
  • Python教程之Python多态的深层次理解

    2021-07-30 07:50:53
  • 基于Mysql+JavaSwing的超市商品管理系统设计与实现

    2024-01-29 00:31:46
  • 不通过数据源名DSN也能访问Access数据库吗?

    2009-10-29 12:22:00
  • 在sql Server自定义一个用户定义星期函数

    2012-02-12 15:47:28
  • Python标准库之Sys模块使用详解

    2022-03-30 04:45:59
  • Node.js服务器开启Gzip压缩教程

    2024-04-22 22:14:49
  • asp之家 网络编程 m.aspxhome.com