Python自动化办公:ppt文件操作教程

4767229e1666b6ef6d0f340678bdf3ac.gif

在后台回复【阅读书籍】

即可获取python相关电子书~

Hi,我是山月。

之前和大家介绍了python操作excel和word文件的教程,今天来和大家介绍下python对ppt的操作。

在公众号后台回复【自动化办公】即可直接查看这个系列的所有教程哦~

用到的库是python-pptx,它是一个操作PPT (.pptx) 文件的 Python 库,可以创建新的演示文稿,也可以对现有的演示文稿进行修改。

安装:pip install python-pptx

官网:https://python-pptx.readthedocs.io/en/latest/

01

演示文稿 Presentation

1、创建演示文稿

代码:

from pptx import Presentation # 导入演示文稿模块
prs = Presentation() # 创建一个演示文稿对象,同时也会创建一个空白文稿
prs.save('实例.pptx') #  保存演示文稿

这会创建一个不包含任何幻灯片的、4x3长宽比的新演示文稿,并将其保存到名为“实例.pptx”的文件中。

2、打开演示文稿

如果想更改现有的演示文稿,则需要打开一个带有文件名的演示文稿:

prs = Presentation('实例.pptx')
prs.save('new-实例.pptx')

02

幻灯片 Slide

演示文稿中的每张幻灯片都基于幻灯片版式,因此,当你创建一个新的幻灯片时,必须要指定使用哪种幻灯片版式。

1、幻灯片版式基础知识

幻灯片版式就像一个幻灯片的模板。

PPT 附带的演示文稿的主题有九种幻灯片版式,每个幻灯片版式都有零个或多个占位符

  • 标题幻灯片 Title (presentation title slide)

  • 标题和内容 Title and Content

  • 节标题 Section Header (sometimes called Segue)

  • 两栏内容 Two Content (side by side bullet textboxes)

  • 比较 Comparison (same but additional title for each side by side content box)

  • 仅标题Title Only

  • 空白 Blank

  • 内容与标题 Content with Caption

  • 图片与标题 Picture with Caption

29992fad5f90bd2ec901ee7495955ed3.png

在python-pptx中,这些是prs.slide_layouts[0]到prs.slide_layouts[8]。

注意,这只是PPT中提供的主题所遵循的惯例,并没有规定必须以这种顺序出现。

因此如果你使用的模板有不同的幻灯片版式,或者它们的顺序不同的话,你可以自己找出幻灯片版式的索引数。

找出的方法也很简单,只要你在PPT的幻灯片主视图中打开它,然后从顶部开始从0数数。

2、添加幻灯片

以标题和内容幻灯片版式为例:

from pptx import Presentation
prs = Presentation()

slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)

prs.save('实例.pptx')

需要注意:

  • prs.slides 是演示文稿中幻灯片的集合,具有列表语义,并且可以使用 len() 对其进行处理。

  • prs.slide_layouts是包含在演示文稿中的幻灯片版式的集合,也具有列表语义。

  • 添加幻灯片的方法是在幻灯片集合上,而不是在演示文稿上。add_slide() 方法可以将新幻灯片附加到集合的末尾。

03

形状 Shapes

幻灯片上的几乎所有东西都是形状,可能唯一能在幻灯片上出现的不是形状的东西就是幻灯片背景了吧。

1、形状类型

严格来说,只有六种不同类型的形状可以放在幻灯片上。

1、自选形状 auto shape

自选形状是就是我们平时说的形状,如矩形、椭圆形或箭头。自选形状预设了各种各样的形状,有 182 种。

d75bf29645dc7da10ae694e13d505f6b.png

自选形状可以有填充和轮廓,也可以包含文本。

一些形状还可以进行调整,比如对于圆角矩形,你可以拖动黄色的圆来调整它角的圆度。

文本框也是一个自选形状,相当于一个矩形,只是它默认情况下没有填充和轮廓。

2、图片 picture

光栅图像(如照片或剪贴画)在 PPT 中称为图片。它是自己的一种形状,与自选形状有着不同的行为。

注意,自选形状可以设置图片填充,而不是设置填充颜色或渐变颜色,其中图片显示为形状的背景。这是另外一回事了。

3、图形框 graphic frame

图形框是包含表格、图表、SmartArt或视频文件的容器。你不能单独的添加它们,它们只会在你添加图形对象的时候显示在文件中。

4、形状组 group shape

在 PPT 中,可以对一组形状进行组合,从而可以将它们作为单个对象进行选择、移动、调整大小甚至填充。

当您对一组形状进行组合时,将创建一个形状组以包含这些成员的形状。除了在选择组的时候看到它们的边框之外,你实际上看不到这些边框。

5、线条/连线 line/connector

线条与自选形状不同,因为它们是线性的。一些线条可以连接到其他形状,并在其他形状移动时也保持着连接。

6、内容部分 content part

一般忽略它。

至于现实使用的形状,可以归纳为以下九种:

  • shape shapes 形状形状 – 具有填充和轮廓的自选形状

  • text boxes  文本框 – 没有填充和轮廓的自选形状

  • placeholders 占位符 – 可以出现在幻灯片版式或母版上并在使用该版式的幻灯片上继承的自选形状,允许添加采用占位符格式的内容

  • line/connector – 如上所述

  • picture  图片 – 如上所述

  • table 表 – 行和列

  • chart 图表 – 饼图、折线图等

  • smart art –尚不支持,但如果存在则保留

  • media clip 视频文件 – 视频或音频

2、访问幻灯片上的形状

每张幻灯片都有一个形状树,用来保存其形状。在大多数情况下,形状树具有列表语义。

可以这样访问它:

shapes = slide.shapes

3、添加自选形状

下面的代码添加了一个一英寸的圆角矩形的形状,形状的水平/垂直位置距幻灯片左上角2英寸。

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)

shapes = slide.shapes
left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

prs.save('实例.pptx')

效果:

c5ba6dfe6cdfa27fe892d91e1be64b36.png

MSO_AUTO_SHAPE_TYPE上列出了包含的182种自选形状。

由于图片实在太长,山月就不放上来了,有兴趣的在后台回复【自选形状】获取。

4、英国公制单位 English Metric Units

在前面的例子中,我们将尺寸值设置为表达式 Inches(1.0)。这是什么意思呢?

PPT 存储的长度值是英国公制单位 (EMU) ,Office 文档中的大多数长度也都默认为 EMU 。

英国公制单位 (EMU) 是长度的整数单位,914400 EMU =1 英寸。

取914400 的优点是它可以被许多公因数整除,例如可以在英寸和厘米之间进行精确转换。

但是直接用EMU工作也是不方便的,所以为了更方便,python-pptx提供了一个数值类型的集合,这样可以轻松地指定和转换EMU为方便的单位了。

from pptx.util import Inches, Pt
length = Inches(1)
print(length)   # 914400
print(length.inches)   # 1.0
print(length.cm)   # 2.54
print(length.pt)   # 72.0
length = Pt(72)
print(length)   # 914400

常见的长度单位和它们之间的转换:

emu:英国公制,以 整数表示的等效长度
inches:英寸 ,以浮点数表示的等效长度。
cm:厘米,以浮点数表示的等效长度。
mm:毫米,以浮点数表示的等效长度。
Pt:磅 ,以浮点数表示的等效长度。
twips:缇,以 整数表示的等效长度。

1 英寸 = 2.54 厘米  = 72磅 = 914400英国公制
1缇=1/20磅=1/1440英寸

5、形状位置和尺寸

所有的形状在其幻灯片上都有一个位置和大小,通常在创建形状时就会指定位置和大小。

不过位置和大小也可以从现有形状中读取并更改:

from pptx.util import Inches
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes

left = top = width = height = Inches(1.0)
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

print(shape.left, shape.top, shape.width, shape.height) # (914400, 914400, 914400, 914400)
print(shape.left.inches)    # 1.0
shape.left = Inches(2.0)
print(shape.left.inches)    # 2.0

6、填充

自选形状的外边缘叫轮廓,出现在轮廓内的内容被称为形状的填充。

最常见的填充类型是纯色填充。但形状也可以用渐变、图片、图案填充,或者可以没有填充。

使用颜色时,可以将其指定为特定的 RGB 值或主题调色板中的颜色。

此代码将形状的填充设置为红色(代码的17-20行):

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)

shapes = slide.shapes
left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

# 设置填充颜色为红色
from pptx.dml.color import RGBColor
fill = shape.fill
fill.solid()
fill.fore_color.rgb = RGBColor(255, 0, 0)

prs.save('实例.pptx')

效果:

a3106ccc129f7e5a17b105acc9054e68.png

此代码的17-21行将颜色设置成在工具栏上主题颜色的 "个性色1,深色25%":

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)

shapes = slide.shapes
left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

# 设置填充颜色为主题色的个性色1,深色25%
from pptx.enum.dml import MSO_THEME_COLOR
fill = shape.fill
fill.solid()
fill.fore_color.theme_color = MSO_THEME_COLOR.ACCENT_1
fill.fore_color.brightness = -0.25

prs.save('实例.pptx')

效果:

7601edd53b98cc6594f5923e2fcafc7c.png

此代码的17行将形状填充设置为透明即在PPT用户界面中调用“无填充”:

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)

shapes = slide.shapes
left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

# 设置填充颜色为无填充
shape.fill.background()

prs.save('实例.pptx')

效果:

0b66511f636e108bc16eddc83e935930.png

根据这三个例子,我们可以发现,设置填充的第一步是通过调用相应的填充方法来指定所需的填充类型。

这样做实际上会更改填充对象上可用的属性。

比如,在调用 .background() 方法后在填充对象上引用 .fore_color 将引发异常:

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)

shapes = slide.shapes
left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)


fill = shape.fill
fill.solid()
print(fill.fore_color)  # <pptx.dml.color.ColorFormat object at 0x00000241AE8CEBA8>
fill.background()
print(fill.fore_color) # 返回一个错误:【TypeError: a transparent (background) fill has no foreground color】

7、形状轮廓

自选形状的轮廓也可以设置格式。

比如可以设置它的颜色color、宽度width、短划线类型dash、复合类型line style、 端点类型end cap、联接类型join type等。

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)

shapes = slide.shapes
left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

# 设置轮廓
from pptx.dml.color import RGBColor
from pptx.util import Pt
line = shape.line
line.color.rgb = RGBColor(255, 0, 0)
line.color.brightness = 0.5  # 50%的亮度
line.width = Pt(2.5)

prs.save('实例.pptx')

效果:

2ca70277300a132fb4218e6ec46feec5.png

轮廓的颜色也可以使用主题色:

line.color.theme_color = MSO_THEME_COLOR.ACCENT_6 # 个性色6,也就是橙色

Shape.line的属性是.color。这对轮廓的格式是有意义的,因为形状的轮廓最常被设置成纯色,所以能直接访问填充是必要的。

比如,将轮廓设置为透明:

line.fill.background()

形状的轮廓还具有读/写轮廓宽度属性:

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
from pptx.util import Inches, Pt

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)

shapes = slide.shapes
left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

# 设置轮廓
line = shape.line
line.color.rgb = RGBColor(255, 0, 0)
line.color.brightness = 0.5  # 50%的亮度
line.width = Pt(2.5)

# 读/写线条宽度属性
print(line.width)   # 31750
print(line.width.pt)    # 2.5
line.width = Pt(2.0)
print(line.width.pt)    # 2.0

8、调整自选形状

许多自选形状都有调整的功能。在PPT 中,你可以拖动黄色圆形以更改形状的外观。

调整标注形状的标注线位置的示例:

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5] #仅标题版式
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes

left = top = Inches(2.0) # 设置形状的位置
width = height = Inches(1.0) # 设置形状的大小
callout_sp = shapes.add_shape(
    MSO_SHAPE.LINE_CALLOUT_2_ACCENT_BAR, left, top, width, height
)   # 添加一个线性标注2的形状

# 将标注线从正确的位置引出
adjs = callout_sp.adjustments
adjs[0] = 0.5   # 标注线与标注框连接处的垂直位置,顶部是0
adjs[1] = 0.0   # 标注线标注框宽度上的水平位置, 左边是0
adjs[2] = 0.5   # 标注线拐头的垂直位置, 顶部是0
adjs[3] = -0.1  # 标注线拐头宽度的水平位置, 标注线与标注框相交的位置是0
adjs[4] = 3.0   # 线条末端与标注框的垂直位置, 顶部是0
a5 = adjs[3] - (adjs[4] - adjs[0]) * height/width
adjs[5] = a5    # 标注线拐头宽度的水平位置, 标注线与标注框相交的位置是0

# 逆时针旋转45度
callout_sp.rotation = -45.0

prs.save('实例.pptx')

效果:

00ed631f355be5803c8d0c07be551a4c.png

9、实例参考

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes

shapes.title.text = 'Adding an AutoShape' # 标题

left = Inches(0.93)
top = Inches(3.0)
width = Inches(1.75)
height = Inches(1.0)

shape = shapes.add_shape(MSO_SHAPE.PENTAGON, left, top, width, height)
shape.text = 'Step 1'

left = left + width - Inches(0.4)
width = Inches(2.0)  # V形形状需要更大的宽度来保持视觉平衡

for n in range(2, 6):
    shape = shapes.add_shape(MSO_SHAPE.CHEVRON, left, top, width, height)
    shape.text = 'Step %d' % n
    left = left + width - Inches(0.4)

prs.save('实例.pptx')

效果:

72af99cf71e06bc85bf01eadebaa58a6.png

04

占位符 placeholder

占位符就是先占住一个固定的位置,然后再往里面添加内容的符号。

1、了解占位符

1)占位符与形状

占位符是形状的正交类别,有一些形状可以成为占位符。

比如自选形状、图片和图形框形状可以成为占位符,但形状组、连线和内容部分形状不能成为占位符。

一个图形框占位符可以包含一个表格、一个图表或SmartArt。

2)未填充、填充模式

幻灯片上的占位符可以是空的或者填充的,这在图片占位符上表现得最为明显。

当未填充时,占位符显示设置的提示文本。

纯文本占位符在输入文本的第一个字符时进入“填充”模式,并在删除文本的最后一个字符时返回“未填充”模式。

为了删除填充的占位符,必须删除该形状两次。

第一次删除将删除内容并将占位符恢复为未填充模式,第二次删除将删除占位符本身。也可以通过重新应用版式来恢复已删除的占位符。

3)继承占位符 Placholders inherit

出现在幻灯片上的占位符只是整个占位符机制的一部分。

占位符行为需要三类不同的占位符形状:存在于幻灯片母版上的占位符、存在于幻灯片版式上的占位符,以及最终出现在演示文稿中的幻灯片上的占位符。

这三类占位符参与属性继承层次结构,可以作为继承者、被继承者,或者两者兼而有之。

母版上的占位符形状仅是被继承者,幻灯片上的占位符形状只是继承者。

幻灯片版式上的占位符既是幻灯片母版占位符的可能继承者,也是链接到该版式的幻灯片上占位符的继承者。

版式从其母版继承的方式不同于幻灯片从其版式继承的方式。

版式占位符继承自共享相同类型的主占位符,幻灯片占位符继承自具有相同idx值的版式占位符。

通常,所有格式属性都继承自“父”占位符。这包括位置和大小以及填充、线条和字体。

任何直接应用的格式都会覆盖相应的继承值。通过重新应用版式,可以删除直接应用的格式。

2、占位符类型

占位符一共有18 种占位符:

1)Title, Center Title, Subtitle, Body 标题、中心标题、副标题、正文

这些占位符通常出现在传统的 "文字图表 "上,只包含文本,通常被设计成一个标题和一系列的要点。所有这些占位符都可以只接受文本。

2)Content 内容

这种多用途占位符是最常用于幻灯片主体的。未填充时,它显示 6 个按钮以允许插入表格、图表、SmartArt、图片、剪贴画或视频文件。

3)Picture, Clip Art 图片,剪贴画

允许插入图像。剪贴画占位符上的插入按钮会调出剪贴画库而不是图像文件选择器,但除此之外它们的行为相同。

4)Chart, Table, Smart Art 图表、表格、Smart Art 图形

这三个允许插入相应类型的图形内容。

5)Media Clip 视频文件

允许插入视频或录音。

6)Date, Footer, Slide Number 日期、页脚、幻灯片编号

这三种情况出现在大多数幻灯片母版和幻灯片版式上,也可能出现在备注母版Notes Master和讲义母版Notes Master上。

7)Header 页眉

只对备注母版和讲义母版有效。

8)Vertical Body, Vertical Object, Vertical Title 垂直正文、垂直对象、垂直标题

用于垂直方向的语言,例如日语。

3、访问占位符

每个占位符也是一个形状,因此可以使用幻灯片的形状属性进行访问。

但在查找特定占位符时,可以使用placeholders 属性。

访问已知占位符的最可靠方法是通过其 idx 值,占位符的 idx 值是它继承属性的幻灯片版式占位符的整数键。

因此,它在幻灯片的整个生命周期中保持稳定,并且对于使用该版式创建的任何幻灯片都是相同的。

通常很容易查看幻灯片上的占位符并选择您想要的占位符:

from pptx import Presentation
prs = Presentation()

slide = prs.slides.add_slide(prs.slide_layouts[8])
for shape in slide.placeholders:
    print('%d %s' % (shape.placeholder_format.idx, shape.name))

'''
0  Title 1
1  Picture Placeholder 2
2  Text Placeholder 3
'''

这样就有了已知的索引在手,就可以直接访问它了。

from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[8])

print(slide.placeholders[1])    # <pptx.shapes.placeholder.PicturePlaceholder object at 0x000001BEB645F7B8>
print(slide.placeholders[2].name)   # Text Placeholder 3

注意:

  • 对占位符集合项目的访问是类似于字典而不是列表,所以虽然上面使用的键是一个整数,但查找的是 idx 值,而不是序列中的位置。

  • 如果提供的值与占位符之一的 idx 值不匹配,则会引发 KeyError。

  • idx 值不一定是连续的。

一般来说,来自内置幻灯片版式(PPT中提供的版式)的占位符的idx值将在0和5之间。

如果标题占位符存在的话,它的idx值总是为0,其他占位符将按从上到下、从左到右的顺序排列。

用户在PPT中添加到幻灯片版式中的占位符将得到一个从10开始的idx值。

4、识别和表征占位符

在某些方面,占位符的行为与其他形状不同。

比如它 shape_type 属性的值无条件为 MSO_SHAPE_TYPE.PLACEHOLDER,无论它是什么类型的占位符或它包含什么类型的内容:

from pptx import Presentation
prs = Presentation()

slide = prs.slides.add_slide(prs.slide_layouts[8])
for shape in slide.shapes:
    print('%s' % shape.shape_type)

'''
PLACEHOLDER (14)
PLACEHOLDER (14)
PLACEHOLDER (14)
'''

想要了解更多信息,可以通过占位符的 placeholder_format 属性,所有形状都有此属性,但在非占位符形状上访问它会引发 ValueError。

而 is_placeholder 属性可用于确定形状是否为占位符:

from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[8])

for shape in slide.shapes:
    if shape.is_placeholder:
        phf = shape.placeholder_format
        print('%d, %s' % (phf.idx, phf.type))
'''
0, TITLE (1)
1, PICTURE (18)
2, BODY (2)
'''

占位符的另一种行为方式是它可以从版式占位符中继承其位置和大小。

但如果一个占位符的位置和大小被改变了,这种继承就会被覆盖。

5、将内容插入占位符

某些占位符类型具有插入内容的专门方法,比如图片、表格和图表占位符。

而对于标题和正文占位符,可以将文本像插入到自选形状中一样插入到它们中。

1)图片占位符

图片占位符有一个 insert_picture() 方法:

from pptx import Presentation
prs = Presentation()

slide = prs.slides.add_slide(prs.slide_layouts[8]) # 图片与标题版式
placeholder = slide.placeholders[1]  # 1是idx值, 不是序列的位置

print(placeholder.name) # Picture Placeholder 2
print(placeholder.placeholder_format.type)  # PICTURE (18)

picture = placeholder.insert_picture('白敬亭.png')

prs.save('实例.pptx')

效果:

bf2565eea0eb82ba87b9b985b925c43e.png

注意:

在调用 insert_picture() 方法后,对图片占位符的引用变得无效。

这是因为插入图片的过程将原始 p:sp XML 元素替换为包含图片的新 p:pic 元素。调用后任何尝试使用原始占位符引用都会引发 错误AttributeError。

新占位符是 insert_picture() 调用的返回值,也可以使用相同的 idx 键从占位符集合中获取。

以这种方式插入的图片会按比例拉伸并裁剪以填充整个占位符。当源图像和占位符的纵横比相同时,可获得最佳效果。

但如果图片的纵横比高于占位符,则会均匀裁剪其顶部和底部;如果图片更宽,它的左右两侧会被均匀裁剪。

也可以使用占位符上的裁剪属性来调整裁剪,例如crop_bottom。

2)标题占位符

几乎所有的幻灯片版式都有一个标题占位符,任何基于该版式的幻灯片在应用版式时都会继承该占位符。

设置幻灯片的标题:

from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])

title_placeholder = slide.shapes.title
title_placeholder.text = '我是标题'

prs.save('实例.pptx')

效果:

af90bbcef7497cdebe29e49186c8c7d6.png

05

文本

自选形状和表格的单元格可以包含文本,其他形状则不能。

所有的文本都是以同样的方式操作的,不管它的容器是什么。

文本存在于三个级别的层次结构中:

  • Shape.text_frame

  • TextFrame.paragraphs

  • _Paragraph.runs

形状中的所有文本都包含在文本框中。

文本框具有垂直对齐、边距、换行和自动调整行为;旋转角度、一些可能的 3D 视觉特征;并且可以设置为将其文本格式化为多列。

文本框包含了一系列的段落,即使是空的文本框,也始终包含至少一个段落。

段落有行距、前空格、后空格、可用的项目符号格式、制表符、大纲/缩进水平和水平对齐。

一个段落可以是空的,但如果它包含了任何文本,该文本就包含在一个或多个运行中。

文本框存在着一个运行,可以设置字体格式。

包括字体类型、大小和颜色,一个可选的超链接目标URL,粗体、斜体和下划线样式,删除线、角线和一些大写字母样式,如全大写字母。

1、访问文本框

并非所有形状都有文本框。

因此,如果你不确定是否有文本框,并且不想获得异常,可以在访问它之前进行检查:

for shape in slide.shapes:
    if not shape.has_text_frame:
        continue  
    text_frame = shape.text_frame
    # 使用文本框进行操作   
    ...

2、访问段落

一个文本框架总是至少包含一个段落,这导致将多个段落纳入一个形状的过程是比较笨重的。

比如,当你想要一个有三个段落的形状:

from pptx import Presentation

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])  # 标题和内容版式

shape = slide.shapes[1]

text_frame = shape.text_frame
text_frame.clear()  # 删除现有的所有段落,只留下一个空段落

paragraph_strs = [
    'Egg, bacon, sausage and spam.',
    'Spam, bacon, sausage and spam.',
    'Spam, egg, spam, spam, bacon and spam.'
]

p = text_frame.paragraphs[0]
p.text = paragraph_strs[0]

for para_str in paragraph_strs[1:]:
    p = text_frame.add_paragraph()
    p.text = para_str

prs.save('实例.pptx')

效果:

f0e8c10212cb5e1fee3187ecad06a0ac.png

3、添加文本

只有运行可以包含文本。但通过将字符串分配给形状、文本框架或段落的 .text 属性,可以将文本放置在这些对象包含的运行中。

以下两个片段产生相同的结果:

shape.text = 'foobar'

# 相当于

text_frame = shape.text_frame
text_frame.clear()
p = text_frame.paragraphs[0]
run = p.add_run()
run.text = 'foobar'

4、设置文本框格式

下面将生成一个写有单个段落的文本框。

其中文本框的下边距为0.08英寸(0.20厘米),左边距为0,上边距默认为 0.05 英寸(0.13厘米),右边距默认为 0.1 英寸(0.25厘米);

文本顶端对齐(在文本框上设置的),文字不自动换行,会根据文字调整文本框大小:

from pptx import Presentation
from pptx.util import Inches
from pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZE

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])  # 标题和内容版式
shape = slide.shapes[1]

text_frame = shape.text_frame
text_frame.text = 'Spam, eggs, and spam' # 文本框内容
text_frame.margin_bottom = Inches(0.08)  # 文本框下边距0.08英寸=0.20厘米
text_frame.margin_left = 0 # 文本框左边距0
text_frame.vertical_anchor = MSO_ANCHOR.TOP # 文本框中文本的垂直对齐方式:顶端对齐
text_frame.word_wrap = False # 不设置文字自动换行
text_frame.auto_size = MSO_AUTO_SIZE.SHAPE_TO_FIT_TEXT # 根据文字调整形状大小

prs.save('实例.pptx')

效果:

d3dcea81982a2628b6283f45521f7f8b.png

TextFrame.auto_size 和 TextFrame.vertical_anchor 的值分别为 MSO_AUTO_SIZE 和 MSO_VERTICAL_ANCHOR 里的选项。

MSO_AUTO_SIZE可选项:

NONE:不自动调整
SHAPE_TO_FIT_TEXT:溢出时缩排文字
TEXT_TO_FIT_SHAPE: 根据文字调整形状大小

注意,如果TextFrame.auto_size 的属性是 None,表示没有设置自动调整大小。

这样自动调整大小的设置要从版式占位符(在占位符形状的情况下)或主题继承。也可以通过设置成 None 来删除设置自动调整大小。

MSO_VERTICAL_ANCHOR可选项:

TOP :顶端对齐
MIDDLE:中部对齐
BOTTOM:底端对齐

注意,vertical_anchor 的属性也可以是 None,表示没有指定垂直对齐方式。

这样垂直对齐方式的设置要从占位符(如果有一个)或主题继承。也可以通过设置成 None 来删除设置的垂直对齐方式。

5、设置段落格式

此代码会生成一个包含三个左对齐段落的文本框,第二、三个段落在第一个段落下缩进(子项目符号):

from pptx import Presentation
from pptx.enum.text import PP_ALIGN
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])  # 标题和内容版式
shape = slide.shapes[1]

paragraph_strs = [
    'Egg, bacon, sausage and spam.',
    'Spam, bacon, sausage and spam.',
    'Spam, egg, spam, spam, bacon and spam.'
]

text_frame = shape.text_frame
text_frame.clear()

p = text_frame.paragraphs[0]
p.text = paragraph_strs[0]
p.alignment = PP_ALIGN.LEFT # 设置段落的水平对齐方式为左对齐

for para_str in paragraph_strs[1:]:
    p = text_frame.add_paragraph()
    p.text = para_str
    p.alignment = PP_ALIGN.LEFT # 设置段落的水平对齐方式为左对齐,也可以用p.alignment = 1
    p.level = 1

prs.save('实例.pptx')

效果:

ed77c266f3eff4532222f76b89254da5.png

其中段落的水平对齐方式的设置值,可以是 PP_PARAGRAPH_ALIGNMENT 的选项或 None。

值 None 表示段落的水平对齐方式从样式层次结构中“继承”,也就是说值 None 会删除设置的值,从而使用继承的值。

PP_PARAGRAPH_ALIGNMENT可选项:

LEFT:左对齐(1)
CENTER:居中(2)
RIGHT:右对齐(3)
JUSTIFY:两端对齐(4)
DISTRIBUTE:分散对齐(5)
THAI_DISTRIBUTE:泰语分散对齐(6)
JUSTIFY_LOW:和两端对齐没有什么区别,只是这是为阿拉伯语特别做的(7)

6、设置字体格式

使用 .font 属性可以在运行级别设置字体格式。

以下代码将字体设置成18磅的 Calibri字体,加粗, 颜色设置成 Accent 1:

from pptx import Presentation
from pptx.enum.dml import MSO_THEME_COLOR
from pptx.util import Pt

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])  # 版式设置为标题和内容
shape = slide.shapes[1]

text_frame = shape.text_frame
text_frame.clear()  # 新创建的形状不需要

p = text_frame.paragraphs[0]
run = p.add_run()
run.text = 'Spam, eggs, and spam'

font = run.font
font.name = 'Calibri'
font.size = Pt(18)
font.bold = True
font.italic = None  # 使值从主题继承
font.color.theme_color = MSO_THEME_COLOR.ACCENT_1

prs.save('实例.pptx')

效果:

12d46891f8481b3fd09fe36c105a0933.png

也可以将字体颜色设置为绝对 RGB 值。这样当主题更改时,也不会改变颜色:

from pptx.dml.color import RGBColor
font.color.rgb = RGBColor(0xFF, 0x7F, 0x50)

也可以提供URL,将文字设置成超链接:

run.hyperlink.address = 'https://github.com/scanny/python-pptx'

06

图表 chart

python-pptx 可以添加图表和修改已有的图表,支持除 3D 类型之外的大多数图表类型。

1、添加图表

下面的代码在一个新的演示文稿中添加了一个柱形图。

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题

# 定义图表数据
chart_data = CategoryChartData()
chart_data.categories = ['East', 'West', 'Midwest']
chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

# 将图表添加到幻灯片
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)

prs.save('实例.pptx')

效果:

c9a075298516e51937785ed46dbe3760.png

2、自定义组合

创建一个多系列组合图表:

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题

# 定义图表数据
chart_data = ChartData()
chart_data.categories = ['East', 'West', 'Midwest']
chart_data.add_series('Q1 Sales', (19.2, 21.4, 16.7))
chart_data.add_series('Q2 Sales', (22.3, 28.6, 15.2))
chart_data.add_series('Q3 Sales', (20.4, 26.3, 14.2))

# 将图表添加到幻灯片
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
graphic_frame = slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)

chart = graphic_frame.chart

prs.save('实例.pptx')

效果:

4c7d27040583f3f392ce58138b8b8bfd.png

注意:add_chart()方法并不直接返回图表对象。

因为图表不是一个形状,只是一个包含在图形框形状中的图形(DrawingML)对象。表格也一样包含在图形框形状中。

所以我们需要捕获由add_chart()调用返回的形状参考作为graphic_frame,然后使用graphic_frame的chart属性从图形框中提取图表对象。

3、XY图和气泡图 XY and Bubble charts

创建一个XY(又称散点)图:

from pptx import Presentation
from pptx.chart.data import XyChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)

chart_data = XyChartData()
series_1 = chart_data.add_series('Model 1')
series_1.add_data_point(0.7, 2.7)
series_1.add_data_point(1.8, 3.2)
series_1.add_data_point(2.6, 0.8)

series_2 = chart_data.add_series('Model 2')
series_2.add_data_point(1.3, 3.7)
series_2.add_data_point(2.7, 2.3)
series_2.add_data_point(1.6, 1.8)

chart = slide.shapes.add_chart(
    XL_CHART_TYPE.XY_SCATTER, x, y, cx, cy, chart_data
).chart

prs.save('实例.pptx')

效果:

24a87066d345a11c84f290deec12e9e6.png

气泡图本质上是一个XY图,只是每个数据点都有一个附加值来指定气泡大小:

from pptx import Presentation
from pptx.chart.data import BubbleChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)

chart_data = BubbleChartData()
series_1 = chart_data.add_series('Series 1')
series_1.add_data_point(0.7, 2.7, 10)
series_1.add_data_point(1.8, 3.2, 4)
series_1.add_data_point(2.6, 0.8, 8)

chart = slide.shapes.add_chart(
    XL_CHART_TYPE.BUBBLE, x, y, cx, cy, chart_data
).chart

prs.save('实例.pptx')

效果:

dee497bb8518449f1f5372d88beff225.png

4、轴 Axes

我们可以设置横坐标轴(category)和纵坐标轴(value):

from pptx import Presentation
from pptx.chart.data import XyChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
from pptx.enum.chart import XL_TICK_MARK
from pptx.util import Pt

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)

chart_data = XyChartData()
series_1 = chart_data.add_series('Model 1')
series_1.add_data_point(0.7, 2.7)
series_1.add_data_point(1.8, 3.2)
series_1.add_data_point(2.6, 0.8)

series_2 = chart_data.add_series('Model 2')
series_2.add_data_point(1.3, 3.7)
series_2.add_data_point(2.7, 2.3)
series_2.add_data_point(1.6, 1.8)

chart = slide.shapes.add_chart(
    XL_CHART_TYPE.XY_SCATTER, x, y, cx, cy, chart_data
).chart

# 设置横坐标轴(category)
category_axis = chart.category_axis
category_axis.has_major_gridlines = True
category_axis.minor_tick_mark = XL_TICK_MARK.OUTSIDE
category_axis.tick_labels.font.italic = True
category_axis.tick_labels.font.size = Pt(24)

# 设置纵坐标轴(value)
value_axis = chart.value_axis
value_axis.maximum_scale = 50.0
value_axis.minor_tick_mark = XL_TICK_MARK.OUTSIDE
value_axis.has_minor_gridlines = True
tick_labels = value_axis.tick_labels
tick_labels.number_format = '0"%"'
tick_labels.font.bold = True
tick_labels.font.size = Pt(14)

prs.save('实例.pptx')

效果:

2ba3eb00c0d473436b99e5bc786ca938.png

5、数据标签 Data Labels

可以给图表添加一些数据标签,这样就可以清楚地看到每个条形图的数值是什么。

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches,Pt
from pptx.dml.color import RGBColor
from pptx.enum.chart import XL_LABEL_POSITION

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题

# 定义图表数据
chart_data = ChartData()
chart_data.categories = ['East', 'West', 'Midwest']
chart_data.add_series('Q1 Sales', (19.2, 21.4, 16.7))
chart_data.add_series('Q2 Sales', (22.3, 28.6, 15.2))
chart_data.add_series('Q3 Sales', (20.4, 26.3, 14.2))

# 将图表添加到幻灯片
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
graphic_frame = slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)
chart = graphic_frame.chart

# 设置数据标签
plot = chart.plots[0] # 通过Plot 对象来访问数据标签
plot.has_data_labels = True
data_labels = plot.data_labels
data_labels.font.size = Pt(13)
data_labels.font.color.rgb = RGBColor(0x0A, 0x42, 0x80)
data_labels.position = XL_LABEL_POSITION.INSIDE_END

prs.save('实例.pptx')

效果:

6e515cad44823ebd49e5d1060d9a6bce.png

6、图例 Legend

图例可以为每个系列命名并帮助分辨哪个是哪个:

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
from pptx.enum.chart import XL_LEGEND_POSITION

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题

# 定义图表数据
chart_data = ChartData()
chart_data.categories = ['East', 'West', 'Midwest']
chart_data.add_series('Q1 Sales', (19.2, 21.4, 16.7))
chart_data.add_series('Q2 Sales', (22.3, 28.6, 15.2))
chart_data.add_series('Q3 Sales', (20.4, 26.3, 14.2))

# 将图表添加到幻灯片
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
graphic_frame = slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)
chart = graphic_frame.chart

# 设置图例
chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.RIGHT
chart.legend.include_in_layout = False

prs.save('实例.pptx')

效果:

baa224fc073fcd053ca4744a670c194b.png

7、折线图 Line Chart

添加折线图的方式与柱形图几乎相同,主要区别在于 add_chart() 方法中提供的图表类型:

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题

chart_data = ChartData()
chart_data.categories = ['Q1 Sales', 'Q2 Sales', 'Q3 Sales']
chart_data.add_series('West',    (32.2, 28.4, 34.7))
chart_data.add_series('East',    (24.3, 30.6, 20.2))
chart_data.add_series('Midwest', (20.4, 18.3, 26.2))

x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(
    XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data
).chart

chart.has_legend = True
chart.legend.include_in_layout = False
chart.series[0].smooth = True

prs.save('实例.pptx')

效果:

cfe3b4dc73648f29383e7056822d62f3.png

8、饼图 Pie Chart

饼图有点特别,因为它只有一个系列并且没有任何轴:

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
from pptx.enum.chart import XL_LEGEND_POSITION
from pptx.enum.chart import XL_LABEL_POSITION

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 版式设置为仅标题

chart_data = ChartData()
chart_data.categories = ['West', 'East', 'North', 'South', 'Other']
chart_data.add_series('Series 1', (0.135, 0.324, 0.180, 0.235, 0.126))

x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(
    XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data
).chart

chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.BOTTOM
chart.legend.include_in_layout = False

chart.plots[0].has_data_labels = True
data_labels = chart.plots[0].data_labels
data_labels.number_format = '0%'
data_labels.position = XL_LABEL_POSITION.OUTSIDE_END

prs.save('实例.pptx')

效果:

8e523915e6cc898ed4519023ffdf2290.png

07

表格 tables

PPT 允许以表格形式(对齐的行和列)显示文本和数字。

虽然PPT 表格的功能不是很多,但它还是适用于大多数演示目的的。

1、添加表格

以下代码在一个新的演示文稿中添加了一个 3×3 表格:

from pptx import Presentation
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# 添加表格
x, y, cx, cy = Inches(2), Inches(2), Inches(4), Inches(1.5)
shape = slide.shapes.add_table(3, 3, x, y, cx, cy)

print(shape)    # <pptx.shapes.graphfrm.GraphicFrame object at 0x000001AF1A8BE9E8>
print(shape.has_table)  # True
table = shape.table
print(table)    # <pptx.table.Table object at 0x000001AF1A8BEBA8>

prs.save('实例.pptx')

效果:

2a02359d82009d787982b32cc35527dd.png

注意:

  • SlideShapes.add_table() 返回的是一个包含表格的形状,而不是表格本身。在 PPT 中,表格包含在图形框形状中,图表或 SmartArt 也是如此。

  • 可以使用其 has_table 属性确定形状是否包含表格,并使用形状的 table 属性访问表格对象。

2、访问单元格

表格中的所有内容都在一个单元格中,所以最好能获得对单元格的引用:

from pptx import Presentation
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# 添加表格
x, y, cx, cy = Inches(2), Inches(2), Inches(4), Inches(1.5)
shape = slide.shapes.add_table(3, 3, x, y, cx, cy)

# 访问单元格
table = shape.table
cell = table.cell(0, 0)   
cell.text = 'Unladen Swallow'
print(cell.text) # Unladen Swallow

prs.save('实例.pptx')

效果:

add71d2891d71ca24ef408313a73cc13.png

单元格是由行、列坐标的偏移量(从零开始)组成的元组,左上角的单元格位于 (0, 0)。

像自选形状一样,单元格也有一个文本框,可以包含分成段落和运行的任意文本。

任何所需的字体格式都可以单独应用于每次运行。

然而通常,单元格文本只是一个简单的字符串。对于这些情况,读/写 _Cell.text 属性可能是设置单元格内容的最快方法。

3、合并单元格

可以通过指定两个对角单元格来生成合并单元格,合并的单元格将占据该对角线指定的矩形区域中的所有单元格:

from pptx import Presentation
from pptx.util import Inches

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# 添加表格
x, y, cx, cy = Inches(2), Inches(2), Inches(4), Inches(1.5)
shape = slide.shapes.add_table(3, 3, x, y, cx, cy)

table = shape.table
cell = table.cell(0, 0)
other_cell = table.cell(1, 1)
print(cell.is_merge_origin) # False
cell.merge(other_cell)
print(cell.is_merge_origin) # True
print(cell.is_spanned)  # False
print(other_cell.is_spanned)    # True
print(table.cell(0, 1).is_spanned)  # True

prs.save('实例.pptx')

效果:

bca88e9e667121173945486c6f2c7bfa.png

需要注意的几点:

  • 合并的单元格显示为单个单元格,占据了指定矩形区域中其他单元格以前占用的空间。

  • 合并单元格的格式(背景颜色、字体等)取自合并源单元格(矩形区域左上角单元格)。

  • 合并单元格中的内容已迁移到合并源单元格,不再出现在跨越的单元格中。每个单元格的内容在合并单元格中显示为单独的段落,而不是连接成一个段落。内容按原始单元格的从左到右、从上到下的顺序迁移。

  • 调用 other_cell.merge(cell) 将具有完全相同的效果。合并原点始终是指定矩形区域中的左上角单元格。有四种不同的方法来指定给定的矩形区域(两条对角线,每条有两种排序)。

4、取消合并单元格

合并的单元格可以通过在其合并源单元格上调用 split() 方法恢复到其底层单元格。

cell = table.cell(0, 0)
print(cell.is_merge_origin) # True
cell.split()
print(cell.is_merge_origin)  # False
print(table.cell(0, 1).is_spanned)  # False

注意,在不是合并源的单元格上调用 split() 会引发 ValueError。

08

备注幻灯片 Notes Slides

一张幻灯片可以有与之相关的备注。

选择普通视图的幻灯片下面的备注,会出现备注窗格。备注窗格里会显示 "点击添加备注"。

每当该幻灯片出现在主窗格中时,这里添加的备注就会出现,它们也会出现在 "大纲视图 "和 "备注页视图 "中。

备注可以包含项目符号、粗体、不同的字体大小和颜色等。

1、备注幻灯片基础知识

查看是否有备注幻灯片:

from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

print(slide.has_notes_slide) # False

添加一些备注:

from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

print(slide.has_notes_slide) # False

notes_slide = slide.notes_slide # 创建备注幻灯片
text_frame = notes_slide.notes_text_frame # 创建包含实际备注的 TextFrame 对象
text_frame.text = 'foobar' # 备注幻灯片中的文本框与普通幻灯片中的文本框是相同的

print(slide.has_notes_slide) # True

prs.save('实例.pptx')

效果:

fe0b986fbac8be12960a66213911315b.png

2、备注幻灯片占位符

备注占位符:

notes_placeholder = notes_slide.notes_placeholder

其他占位符:

from pptx import Presentation

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

notes_slide = slide.notes_slide
for placeholder in notes_slide.placeholders:
    print(placeholder.placeholder_format.type)

'''
SLIDE_IMAGE (101)
BODY (2)
SLIDE_NUMBER (13)
'''

形状(占位符的超级集合):

from pptx import Presentation

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

notes_slide = slide.notes_slide
for shape in notes_slide.shapes:
   print(shape)

'''
<pptx.shapes.placeholder.NotesSlidePlaceholder object at 0x000001E4A356EDD8>
<pptx.shapes.placeholder.NotesSlidePlaceholder object at 0x000001E4A356EF28>
<pptx.shapes.placeholder.NotesSlidePlaceholder object at 0x000001E4A356EE48>
'''

在常见情况下,备注幻灯片仅包含占位符。但如果你把图像添加到备注幻灯片中,它也会显示出来。

09

实例

1、添加图片

在占位符的使用里我们学习了通过占位符添加图片的方式,现在来看看第二种:

from pptx import Presentation
from pptx.util import Inches

prs = Presentation()
blank_slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank_slide_layout)

img_path = '白敬亭.png'

top = Inches(1)
left = Inches(5)
height = Inches(5.5)
pic = slide.shapes.add_picture(img_path, left, top, height=height)

prs.save('实例.pptx')

效果:

c88dc497300afd7f57be85888be63b31.png

2、从幻灯片中提取所有文本

假设现在有一个名为【实例.pptx】的ppt,它的内容如图:

2c17cc9d2a6b812365aff457ad27c417.png

现在我们需要提取幻灯片里所有的文本内容:

from pptx import Presentation
prs = Presentation('实例.pptx')

text_runs = []

for slide in prs.slides:
    for shape in slide.shapes:
        if not shape.has_text_frame:
            continue
        for paragraph in shape.text_frame.paragraphs:
            for run in paragraph.runs:
                text_runs.append(run.text)

print(text_runs )   # ['标题', '这是内容']

关于python-pptx的教程就到这啦,感谢观看~

已经到底啦~(≧▽≦*)/~

5cee8ee4e3124f286807ff80b59135c6.gif

您的“点赞”、“在看”和 “分享”是我们产出的动力。

  • 18
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值