zoukankan      html  css  js  c++  java
  • 最全总结 | 聊聊 Python 办公自动化之 PPT(上)

    image

    1. 前言

    自动化办公,非 Python 莫属!

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

    2. 准备一下

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

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

    # 安装依赖
    pip3 install python-pptx
    

    3. PPT 结构

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

    image

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

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

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

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

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

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

    image

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

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

    # 使用Presentation获取PPT内置的11种版式样式
    # 版式索引从0开始
    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,添加一张幻灯片

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

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

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

    def get_slides(presentation):
        """
        获取所有的幻灯片
        :param presentation:
        :return:
        """
        # 所有幻灯片
        slides = presentation.slides
    
        # 幻灯片数目
        slide_num = len(slides)
    
        return slides, slide_num
    
    
    def get_slide(presentation, slide_index):
        """
        根据索引,获取某一个幻灯片
        :param presentation:
        :param slide_index:页面索引,从0开始
        :return:
        """
        slides, slide_num = get_slides(presentation=presentation)
    
        return slides[slide_index]
    
    # 1.2.1 获取所幻灯片
    slides, slide_num = get_slides(self.presentation)
    print('现有幻灯片:', slides)
    print('幻灯片数目:', slide_num)
    
    # 1.2.2 获取某一个幻灯片
    slide = get_slide(self.presentation, 1)
    print(slide.shapes)
    
    

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

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

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

    5. 文字及段落

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

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

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

    add_textbox( left , top , width , height )

    该函数参数分别为:

    • left  左边距

    • top  上边距

    • width  文字框宽度

    • height  文字框高度

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

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

    def insert_textbox(slide, left, top, width, height, unit=Inches):
        """
        幻灯片中添加文本框
        :param unit: 单元,默认设置为Inches
        :param slide: 幻灯片对象
        :param left: 左边距
        :param top:  上边距
        :param  宽度
        :param height: 高度
        :return:
        """
        # 文本框
        textbox = slide.shapes.add_textbox(left=unit(left),
                                           top=unit(top),
                                           width=unit(width),
                                           height=unit(height))
        # 文本框形状
        tf = textbox.text_frame
    
        return textbox, tf
    
    

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

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

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

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

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

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

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

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

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

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

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

    其中

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

    def set_parg_font_style(paragraph, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False,
                            paragraph_alignment=PP_ALIGN.CENTER):
        """
        设置段落中文本的样式,包含:字体名称、颜色、大小、是否加粗、是否斜体
        :param paragraph_alignment: 段落对齐方式
        :param paragraph:
        :param font_name:
        :param font_color:
        :param font_size:
        :param font_bold:
        :param font_italic:
        :return:
        """
    
        # 对齐方式
        # 注意:对齐方式是针对段落的
        paragraph.alignment = paragraph_alignment
    
        # 获取段落中字体对象
        font = paragraph.font
    
        # 设置字体样式
        set_font_style(font, font_name, font_color, font_size, font_bold, font_italic)
    
        return font
    

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

    def set_font_style(font, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False):
        """
        设置字体样式
        :param font:
        :param font_name:
        :param font_color:
        :param font_size:
        :param font_bold:
        :param font_italic:
        :return:
        """
        # 字体名称
        if font_name:
            font.name = font_name
    
        # 字体颜色
        if font_color and len(font_color) == 3:
            font.color.rgb = RGBColor(font_color[0], font_color[1], font_color[2])
    
        # 字体大小
        if font_size != -1:
            font.size = Pt(font_size)
    
        # 是否加粗,默认不加粗
        font.bold = font_bold
    
        # 是否倾斜,默认不倾斜
        font.italic = font_italic
    

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

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

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

    • 设置文字框的背景颜色

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

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

    1-5 文本框的自动对齐

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

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

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

    6. 最后

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

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

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

    推荐阅读

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

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

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

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

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

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

  • 相关阅读:
    记录一次namespace 处于Terminating状态的处理方法
    Python的递归函数
    Rancher安装
    常用的正则
    Maven生命周期
    长春理工大学第十四届程序设计竞赛(重现赛)F
    长春理工大学第十四届程序设计竞赛(重现赛)B
    牛客假日团队赛1 B
    Codeforces Round #564 (Div. 2)B
    Codeforces Round #564 (Div. 2)A
  • 原文地址:https://www.cnblogs.com/xingag/p/14153498.html
Copyright © 2011-2022 走看看