1. 前言

自动化办公,非 Python 莫属!

从本篇文章开始,我们继续聊聊自动化办公中另外一个常用系列:PPT

2. 准备一下

Python 操作 PPT 最强大的依赖库是:python-pptx

所以,在开始操作之前,我们需要在虚拟环境下安装这个依赖库

  1. # 安装依赖
  2. pip3 install python-pptx

3. PPT 结构

首先,我们需要了解一个 PPT 文档的页面结构

  • 一个 PPT 文档对应一个 Presentation 对象

  • 一个 Presentation 包含多个 Slide 对象,每一个 Slide 代表一个幻灯片

  • 每一张幻灯片的内容都是由各种形状 Shape 组成

其次,PPT 中的内容元素都是由各种形状构成

比如:文字框、图片、占位符、表格、普通形状等

通过翻看源码,发现他们都定义在 MSO_SHAPE_TYPE  类中

最后,我们需要了解一下 PPT 中的 版式模板

使用 Presentation 对象的 属性方法 slide_layouts 可以获取内置的 11 种母版样式

  1. # 使用Presentation获取PPT内置的11种版式样式
  2. # 版式索引从0开始
  3. slide_layout = presentation.slide_layouts[slide_style_index]

他们分别是:

  • Title Slide 标题幻灯片

  • Title and Content    标题和内容幻灯片

  • Section Header    节标题幻灯片

  • Two Content    两栏内容幻灯片

  • Comparison    比较幻灯片

  • Title Only    仅标题的幻灯片

  • Blank    空白幻灯片

  • Content with Caption    内容和标题的幻灯片

  • Picture with Caption    图片和标题的幻灯片

  • Title and Vertical Text 标题和竖排内容

  • Vertical Title and Text 竖排标题和文本

当然,也可以在 Microsoft PPT / WPS 中查看对应母版的样式

这里补充一下,除了内置的版式样式,也可以通过占位符 PlaceHolder 去自定义母版,满足一些特定的场景需求

4. 幻灯片管理

一个 PPT 文件是由一个或多张幻灯片组成

1-1  那如何添加一张一张幻灯片呢?

这里,只需要通过下面 3 个步骤

  • 实例化一个 Presentation 对象

  • 通过内置的版本样式,新建一个版本样式 Layout

  • 通过版本样式 Layout,添加一张幻灯片

  1. def add_slide(presentation, slide_style_index):
  2. """
  3. 在PPT文档中,以内置的版式添加幻灯片
  4. :param presentation:文档对象
  5. :param slide_style_index:版式索引
  6. :return:
  7. """
  8. # PPT版式样式
  9. # 内置有11种版式样式
  10. # 0:Title Slide 标题幻灯片
  11. # 1:Title and Content 标题和内容
  12. # 2:Section Header 节标题
  13. # 3:Two Content 两栏内容
  14. # 4:Comparison 比较
  15. # 5:Title Only 仅标题
  16. # 6:Blank 空白
  17. # 7:Content with Caption 内容和标题
  18. # 8:Picture with Caption 图片和标题
  19. # 9:Title and Vertical Text 标题和竖排内容
  20. # 10:Vertical Title and Text 竖排标题和文本
  21. slide_layout = presentation.slide_layouts[slide_style_index]
  22. # 通过样式Layout,新增一张幻灯片
  23. slide = presentation.slides.add_slide(slide_layout)
  24. return slide
  25. # 1.1 新增幻灯片
  26. slide1 = add_slide(self.presentation, 0)
  27. slide2 = add_slide(self.presentation, 1)
  28. slide3 = add_slide(self.presentation, 2)
  29. slide4 = add_slide(self.presentation, 3)

1-2  获取已有的幻灯片或某一张幻灯片?

Presentation 对象的 slides 属性 会返回当前 PPT 文档中所有的幻灯片对象列表

  1. def get_slides(presentation):
  2. """
  3. 获取所有的幻灯片
  4. :param presentation:
  5. :return:
  6. """
  7. # 所有幻灯片
  8. slides = presentation.slides
  9. # 幻灯片数目
  10. slide_num = len(slides)
  11. return slides, slide_num
  12. def get_slide(presentation, slide_index):
  13. """
  14. 根据索引,获取某一个幻灯片
  15. :param presentation:
  16. :param slide_index:页面索引,从0开始
  17. :return:
  18. """
  19. slides, slide_num = get_slides(presentation=presentation)
  20. return slides[slide_index]
  21. # 1.2.1 获取所幻灯片
  22. slides, slide_num = get_slides(self.presentation)
  23. print('现有幻灯片:', slides)
  24. print('幻灯片数目:', slide_num)
  25. # 1.2.2 获取某一个幻灯片
  26. slide = get_slide(self.presentation, 1)
  27. print(slide.shapes)

1-3  如果需要删除某一张幻灯片,如何破?

这个也简单,只需要先获取目前幻灯片对象,然后使用下面方法移除即可

  1. def del_slide(presentation, slide_index=0):
  2. """
  3. 删除某一张幻灯片
  4. :param presentation:
  5. :param slide_index: 索引
  6. :return:
  7. """
  8. # 所有幻灯片的列表
  9. slides = list(presentation.slides._sldIdLst)
  10. # 根据索引,删除某一张幻灯片
  11. presentation.slides._sldIdLst.remove(slides[slide_index])
  12. # 1.3 根据索引,删除PPT文档中某一张幻灯片
  13. # 比如:删除第4张幻灯片
  14. del_slide(self.presentation, 3)

5. 文字及段落

我们首先需要指定一个幻灯片对象 Slide,它可以是已有的幻灯片,也可以是新建的一张幻灯片

接着,使用幻灯片对象的 slide.shapes 属性,获取当前幻灯片中的所有形状 Shape 组成的队列

最后利用形状队列的下面这个函数添加一个文本框,函数返回值为一个:文本框对象

add_textbox( left , top , width , height )

该函数参数分别为:

  • left  左边距

  • top  上边距

  • width  文字框宽度

  • height  文字框高度

这里需要引出另外一个概念:文字形状

PS:文字形状便于在文字框中添加段落和设置样式,通过「文本框对象」的属性函数 text_frame 获取

  1. def insert_textbox(slide, left, top, width, height, unit=Inches):
  2. """
  3. 幻灯片中添加文本框
  4. :param unit: 单元,默认设置为Inches
  5. :param slide: 幻灯片对象
  6. :param left: 左边距
  7. :param top: 上边距
  8. :param width: 宽度
  9. :param height: 高度
  10. :return:
  11. """
  12. # 文本框
  13. textbox = slide.shapes.add_textbox(left=unit(left),
  14. top=unit(top),
  15. width=unit(width),
  16. height=unit(height))
  17. # 文本框形状
  18. tf = textbox.text_frame
  19. return textbox, tf

为了便于使用,我对幻灯片中插入文字框这一动作进行了一次封装

长度单位默认设置为:Inches,也可以自定义为厘米等单位

接下来,我们来操作文字框及段落的常见操作

1-1  插入文本框,并设置默认段落内容

插入文本框的同时,文本框形状对象会自带一个段落,可以对这个段落设置内容

  1. # 2、往幻灯片中插入一个文本框,返回一个文本框对象和一个文本框形状对象
  2. textbox, tf = insert_textbox(slide, 8, 2, 10, 4, unit=Cm)
  3. # 2.1 默认的段落
  4. paragraph_default = tf.paragraphs[0]
  5. paragraph_default.text = "设置段落默认的内容"

1-2  文本框中新增一个段落

查看源码发现,文本框形状对象是 TextFrame 的子类,因此可以使用 TextFrame 类中的 add_paragraph() 函数添加一个新的段落

  1. # 2.2 添加一个新的段落
  2. paragraph_new = tf.add_paragraph()
  3. # 2.3 给段落设置内容
  4. paragraph_new.text = "欢迎关注公众号:AirPython\n每周分享 Python 原创技术干货!"

1-3  设置段落及文字样式

和 Word 一样,使用 python-pptx 同样可以设置 PPT 文档的段落样式

其中

对齐方式:对齐方式是针对段落的,只需要指定段落对象的 alignment 的属性值即可

  1. def set_parg_font_style(paragraph, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False,
  2. paragraph_alignment=PP_ALIGN.CENTER):
  3. """
  4. 设置段落中文本的样式,包含:字体名称、颜色、大小、是否加粗、是否斜体
  5. :param paragraph_alignment: 段落对齐方式
  6. :param paragraph:
  7. :param font_name:
  8. :param font_color:
  9. :param font_size:
  10. :param font_bold:
  11. :param font_italic:
  12. :return:
  13. """
  14. # 对齐方式
  15. # 注意:对齐方式是针对段落的
  16. paragraph.alignment = paragraph_alignment
  17. # 获取段落中字体对象
  18. font = paragraph.font
  19. # 设置字体样式
  20. set_font_style(font, font_name, font_color, font_size, font_bold, font_italic)
  21. return font

段落文字属性:使用段落对象的 font 属性获取字体对象,接着设置字体名称、大小、颜色、是否斜体、加粗

  1. def set_font_style(font, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False):
  2. """
  3. 设置字体样式
  4. :param font:
  5. :param font_name:
  6. :param font_color:
  7. :param font_size:
  8. :param font_bold:
  9. :param font_italic:
  10. :return:
  11. """
  12. # 字体名称
  13. if font_name:
  14. font.name = font_name
  15. # 字体颜色
  16. if font_color and len(font_color) == 3:
  17. font.color.rgb = RGBColor(font_color[0], font_color[1], font_color[2])
  18. # 字体大小
  19. if font_size != -1:
  20. font.size = Pt(font_size)
  21. # 是否加粗,默认不加粗
  22. font.bold = font_bold
  23. # 是否倾斜,默认不倾斜
  24. font.italic = font_italic

1-4  设置文字框的背景颜色

设置文字框背景颜色只需要 2 步

  • 将形状的填充类型设置为纯色

  • 设置文字框的背景颜色

  1. def set_widget_bg(widget, bg_rgb_color=None):
  2. """
  3. 设置【文本框textbox/单元格/形状】的背景颜色
  4. :param widget:文本框textbox、单元格、形状
  5. :param bg_rgb_color:背景颜色值
  6. :return:
  7. """
  8. if bg_rgb_color and len(bg_rgb_color) == 3:
  9. # 1、将形状填充类型设置为纯色
  10. widget.fill.solid()
  11. # 2、设置文本框的背景颜色
  12. widget.fill.fore_color.rgb = RGBColor(bg_rgb_color[0], bg_rgb_color[1], bg_rgb_color[2])
  13. # 4、设置文字框的背景颜色
  14. set_widget_bg(textbox, [0, 255, 0])

需要指出的是,该方法同样适用于设置表格单元格、普通形状的背景颜色

1-5 文本框的自动对齐

一旦文本框设置一段很长的文字,单行可能显示不完全

这时候,我们只需要设置文字形状的 word_wrap 值为 True,则可以让文本框的文字自动换行显示

  1. # 5、设置文本框的文字自动对齐
  2. tf.word_wrap = True

6. 最后

受限于篇幅,本篇文章仅聊到了 PPT 的结构、幻灯片管理、段落及文字;更多复杂操作、项目实战,会在后面的文章中进行说明

要获取全部源码,关注公众号「 AirPython 」,后台回复「 ppt 」即可获得全部源码

如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

推荐阅读

最全总结 | 聊聊 Python 办公自动化之 Excel(上)

最全总结 | 聊聊 Python 办公自动化之 Excel(中)

最全总结 | 聊聊 Python 办公自动化之 Excel(下)

最全总结 | 聊聊 Python 办公自动化之 Word(上)

最全总结 | 聊聊 Python 办公自动化之 Word(中)

最全总结 | 聊聊 Python 办公自动化之 Word(下)

最全总结 | 聊聊 Python 办公自动化之 PDF(上)的更多相关文章

  1. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  2. 最全总结 | 聊聊 Python 办公自动化之 Excel(下)

    1. 前言 前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt.openpyxl ​其中, xlrd/xlwt 这一组合,xlrd 可以负责读取数据,而 xlwt ...

  3. 最全总结 | 聊聊 Python 办公自动化之 Word(上)

    1. 前言 日常自动化办公中,使用 Python 真的能做到事半功倍! 在上一个系列中,我们对 Python 操作 Excel 进行了一次全面总结 最全总结 | 聊聊 Python 办公自动化之 Ex ...

  4. 最全总结 | 聊聊 Python 办公自动化之 Word(中)

    1. 前言 上一篇文章,对 Word 写入数据的一些常见操作进行了总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 相比写入数据,读取数据同样很实用! 本篇文章,将谈谈如何全面读取 ...

  5. 最全总结 | 聊聊 Python 办公自动化之 Word(下)

    1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...

  6. 最全总结 | 聊聊 Python 办公自动化之 PPT(中)

    1. 前言 上一篇文章简单地介绍了 PPT 的文档结构,并使用 python-pptx 这个依赖库完成对 PPT 文档最基本的操作 最全总结 | 聊聊 Python 办公自动化之 PPT(上) 作为 ...

  7. 最全总结 | 聊聊 Python 办公自动化之 Excel(上)

    1. 前言 在我们日常工作中,经常会使用 Word.Excel.PPT.PDF 等办公软件 但是,经常会遇到一些重复繁琐的事情,这时候手工操作显得效率极其低下:通过 Python 实现办公自动化变的很 ...

  8. 最全总结 | 聊聊 Python 数据处理全家桶(PgSQL篇)

    1. 前言 大家好,我是安果! Python 数据处理全家桶,截止到现在,一共写过 6 篇文章,有兴趣的小伙伴可以去了解一下! 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇) 最全 ...

  9. 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)

    1. 前言 在爬虫.自动化.数据分析.软件测试.Web 等日常操作中,除 JSON.YAML.XML 外,还有一些数据经常会用到,比如:Mysql.Sqlite.Redis.MongoDB.Memch ...

随机推荐

  1. v-echarts安装

    npm install v-echarts echarts --save

  2. IntelliJ IDEA 2020.2.3永久破解激活教程 - 2020.10.27

    申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除 不花钱 的方式 IDEA 2020.2 激活到 2089 年 注意:教程适 ...

  3. 使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。

    一.安装所需要的第三方库 jieba (jieba是优秀的中文分词第三分库) pyecharts (一个优秀的数据可视化库) <三国演义>.txt下载地址(提取码:kist ) 使用pyc ...

  4. 如何使用ABBYY FineReader处理文档图像的缺陷?

    通过扫描仪或者数码相机获取的图像文件,容易出现文本扭曲.页面歪斜等缺陷,会影响到OCR的识别质量.此时,用户可使用ABBYY FineReader 15(Windows系统)OCR文字识别软件的自动和 ...

  5. laravel数据填充

    post表有这2个字段 填充20条数据, 执行 php artisan tinker 执行预览 factory(App\Post::class,20)->make(); 插入数据库 factor ...

  6. vulnhub: DC 2

    首先地址探测找到主机IP: root@kali:~# nmap -sn 192.168.74.139/24 Starting Nmap 7.80 ( https://nmap.org ) at 202 ...

  7. web服务器是啥

    什么是web服务器 参考 https://www.cnblogs.com/zhaoyl/archive/2012/10/10/2718575.html 了解nginx之前,先了解下什么是web服务器吧 ...

  8. C语言入门最后一阶,掌握这门知识,你就进入提高阶段~

    哈喽,伙伴们,我们前面讲了C语言的发展史,基本数据类型,变量与常量,表达式,基本结构等等,今天是作为C语言基础入门的最后一个阶段:输入与输出. 以上这些知识你能够掌握好,就可以开始进入C语言的进阶提高 ...

  9. rocketmq的吞吐量为什么小于kafka

    转载: https://www.jianshu.com/p/c474ca9f9430

  10. 自学linux——18.FTP服务器的搭建

    Centos7下FTP服务器的搭建 一.FTP的作用 文件传输协议(File Transfer Protocol,FTP),是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20. ...