自动化办公,非 Python 莫属!
从本篇文章开始,我们继续聊聊自动化办公中另外一个常用系列:PPT
Python 操作 PPT 最强大的依赖库是:python-pptx
所以,在开始操作之前,我们需要在虚拟环境下安装这个依赖库
# 安装依赖
pip3 install python-pptx
首先,我们需要了解一个 PPT 文档的页面结构
其次,PPT 中的内容元素都是由各种形状构成
比如:文字框、图片、占位符、表格、普通形状等
通过翻看源码,发现他们都定义在MSO_SHAPE_TYPE类中
最后,我们需要了解一下 PPT 中的版式模板
使用Presentation对象的属性方法slide_layouts可以获取内置的11种母版样式
# 使用Presentation获取PPT内置的11种版式样式
# 版式索引从0开始
slide_layout = presentation.slide_layouts[slide_style_index]
他们分别是:
当然,也可以在Microsoft PPT / WPS 中查看对应母版的样式
这里补充一下,除了内置的版式样式,也可以通过占位符 PlaceHolder 去自定义母版,满足一些特定的场景需求
一个 PPT 文件是由一个或多张幻灯片组成
1-1那如何添加一张一张幻灯片呢?
这里,只需要通过下面3个步骤
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)
我们首先需要指定一个幻灯片对象 Slide,它可以是已有的幻灯片,也可以是新建的一张幻灯片
接着,使用幻灯片对象的 slide.shapes属性,获取当前幻灯片中的所有形状 Shape 组成的队列
最后利用形状队列的下面这个函数添加一个文本框,函数返回值为一个:文本框对象
add_textbox( 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 width: 宽度
: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\n每周分享 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
受限于篇幅,本篇文章仅聊到了 PPT 的结构、幻灯片管理、段落及文字;更多复杂操作、项目实战,会在后面的文章中进行说明
获取全部源码:https://github.com/xingag/test_auto/tree/master/office_auto/PPT