首页Python【Python计算生态】p...

【Python计算生态】python-pptx——PowerPoint文档操作库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

python-pptx是一个用于创建、读取和更新PowerPoint (.pptx)文件的 Python库。它提供了丰富的功能和灵活的API,支持自动化生成幻灯片、添加内容、调整格式等操作,适用于报告生成、数据可视化等场景。
  • 支持处理任何 Open XML 演示文稿(.pptx 文件),包括其所有元素;
  • 添加幻灯片;
  • 填充文本占位符,例如创建项目符号幻灯片;
  • 在任意位置和大小添加图片到幻灯片;
  • 添加文本框到幻灯片,操作文本的字体大小和加粗。
  • 添加表格到幻灯片;
  • 添加自选图形(例如多边形、流程图形状等)到幻灯片;
  • 添加并操作柱状图、条形图、折线图和饼图;
  • 访问并更改核心文档属性,例如标题和主题;
  • 其他许多功能……
直接使用pip安装:
pip install python-pptx
GitHub页面:
https://github.com/scanny/python-pptx

02
使用

以下是一些使python-pptx操作PowerPoint的示例。

  • 示例 1:创建演示文稿:

创建一个包含标题和副标题的 PowerPoint 幻灯片。

from pptx import Presentation

# 创建一个Presentation对象,表示一个新的PowerPoint演示文稿
# 如果需要基于现有的.pptx文件操作,可以传递文件路径
prs = Presentation()

# 选择幻灯片布局
# prs.slide_layouts是一个列表,包含了演示文稿中所有可用的幻灯片布局。每个布局都有不同的占位符(如标题、副标题、内容等)。
# 索引 0 通常代表标题幻灯片布局,也就是演示文稿的封面幻灯片布局。
title_slide_layout = prs.slide_layouts[0]

# 添加一张幻灯片
# 使用add_slide()方法向演示文稿中添加一个幻灯片,并指定其布局为title_slide_layout。
# add_slide() 方法返回一个 Slide 对象,表示新添加的幻灯片。
slide = prs.slides.add_slide(title_slide_layout)

# 获取标题和副标题占位符
# slide.shapes是幻灯片上所有形状的集合,title属性可以直接获取幻灯片的标题占位符
title = slide.shapes.title
# slide.placeholders是幻灯片上所有占位符的集合,索引1通常代表副标题占位符
subtitle = slide.placeholders[1]

# 设置标题和副标题的文本内容
title.text = "Hello, World!"
subtitle.text = "This is a sample presentation."

#  保存演示文稿
prs.save('example_1.pptx')

生成的演示文稿效果:

  • 示例 2:项目符号幻灯片示例

创建一个新的 PowerPoint 演示文稿,添加一张带有项目符号列表的幻灯片,设置幻灯片的标题和正文内容,并为正文添加不同级别的项目符号段落。

from pptx import Presentation

prs = Presentation()
# 索引 1 通常代表带有项目符号列表的幻灯片布局
bullet_slide_layout = prs.slide_layouts[1]

#  添加一张幻灯片
slide = prs.slides.add_slide(bullet_slide_layout)
# 获取幻灯片上的形状集合
# slide.shapes是幻灯片上所有形状的集合,包括文本框、图片、图表等
shapes = slide.shapes

# 获取标题和正文占位符
title_shape = shapes.title
body_shape = shapes.placeholders[1]

# 设置标题文本
title_shape.text = 'Adding a Bullet Slide'

#  获取正文文本框并设置初始文本
# text_frame 属性用于获取正文占位符的文本框对象
tf = body_shape.text_frame
# 通过文本框的 text 属性设置正文的第一行文本
tf.text = 'Find the bullet slide layout'

# 添加新的段落并设置项目符号级别
p = tf.add_paragraph()
p.text = 'Use _TextFrame.text for first bullet'
# 设置段落的项目符号级别,level = 1 表示一级项目符号
p.level = 1

p = tf.add_paragraph()
p.text = 'Use _TextFrame.add_paragraph() for subsequent bullets'
# level = 2 表示二级项目符号
p.level = 2

prs.save('example_2.pptx')

生成的演示文稿效果:

  • 示例 3:添加文本框

创建一个新的 PowerPoint 演示文稿,添加一张空白幻灯片,在幻灯片上添加一个文本框,并在文本框内设置初始文本、添加新段落,同时对段落的字体样式进行设置。

add_textbox()方法用于在幻灯片上添加一个文本框,该方法接受四个参数,分别是文本框的左偏移量、上偏移量、宽度和高度。

from pptx import Presentation
# Inches 用于以英寸为单位指定长度,Pt 用于以磅为单位指定字体大小
from pptx.util import Inches, Pt

prs = Presentation()
# 索引 6 通常对应空白幻灯片布局,即没有预设标题、正文等占位符的幻灯片
blank_slide_layout = prs.slide_layouts[6]
# 添加幻灯片
slide = prs.slides.add_slide(blank_slide_layout)

# 定义文本框的位置和大小,这里将文本框的左偏移量、上偏移量、宽度和高度都设置为 1 英寸
left = top = width = height = Inches(1)
# 使用 add_textbox() 方法添加文本框到幻灯片
txBox = slide.shapes.add_textbox(left, top, width, height)
# text_frame属性用于获取文本框的文本框架对象,通过该对象可以对文本框内的文本进行操作,如设置文本内容、添加段落等。
tf = txBox.text_frame

#  设置文本框的初始文本
tf.text = "This is text inside a textbox"

# 添加新段落并设置字体样式
p = tf.add_paragraph()
p.text = "This is a second paragraph that's bold"
p.font.bold = True # 字体设置为粗体

p = tf.add_paragraph()
p.text = "This is a third paragraph that's big"
p.font.size = Pt(40) # 字体大小设置为 40 磅

prs.save('example_3.pptx')

生成的演示文稿效果:

  • 示例 4:插入图片

创建一个新的 PowerPoint 演示文稿,添加一张空白幻灯片,然后在幻灯片上插入两张相同的图片。

add_picture()方法用于在幻灯片上插入图片,该方法接受图片文件路径、图片的左偏移量和上偏移量作为参数,返回插入的图片对象。

from pptx import Presentation
from pptx.util import Inches

# 要插入到幻灯片中的图片文件的路径
img_1_path = '1.jpg'
img_2_path = '2.jpg'

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

# 插入第一张图片
# add_picture()方法用于在幻灯片上插入图片。该方法接受图片文件路径、图片的左偏移量和上偏移量作为参数,返回插入的图片对象
left = top = Inches(0.5)
pic = slide.shapes.add_picture(img_1_path, left, top)

# 插入第二张图片
left = Inches(5)
height = Inches(4.5) # 图片的高度
pic = slide.shapes.add_picture(img_2_path, left, top, height=height)

prs.save('example_4.pptx')

生成的演示文稿效果:

  • 示例 5:插入形状

创建一个新的 PowerPoint 演示文稿,添加一张仅包含标题的幻灯片,在幻灯片上添加一个五边形形状和四个箭头形状,并为每个形状设置相应的文本。

add_shape()方法用于在幻灯片上添加各种预设的自动形状,如矩形、圆形、三角形等。该方法接受形状的类型(通常使用pptx.enum.shapes.MSO_SHAPE枚举类中的常量来表示)、左偏移量、上偏移量、宽度和高度作为参数。该方法返回一个表示所添加形状的 Shape 对象,通过这个对象可以进一步对形状进行设置,如设置文本、填充颜色、边框样式等。

以下是一些常见的 MSO_SHAPE 枚举常量及其对应的形状:

  • MSO_SHAPE.RECTANGLE:标准的矩形形状。
  • MSO_SHAPE.ROUNDED_RECTANGLE:带有圆角的矩形。
  • MSO_SHAPE.SNIP_RECTANGLE:裁剪过的矩形,通常有一个角被切掉。
  • MSO_SHAPE.CIRCLE:正圆形。
  • MSO_SHAPE.ELLIPSE:椭圆形。
  • MSO_SHAPE.TRIANGLE:普通的三角形。
  • MSO_SHAPE.RIGHT_TRIANGLE:直角三角形。
  • MSO_SHAPE.LEFT_ARROW:向左的单箭头。
  • MSO_SHAPE.RIGHT_ARROW:向右的单箭头。
  • MSO_SHAPE.UP_ARROW:向上的单箭头。
  • MSO_SHAPE.DOWN_ARROW:向下的单箭头。
  • MSO_SHAPE.BIDIRECTIONAL_ARROW:双向箭头,两端都有箭头。
  • MSO_SHAPE.CHEVRON:V 形箭头,常用于流程图中的步骤指示。
  • MSO_SHAPE.DIAMOND_ARROW:菱形箭头。
  • MSO_SHAPE.STAR_5_POINT:五角星形。
  • MSO_SHAPE.STAR_6_POINT:六角星形。
  • MSO_SHAPE.STAR_7_POINT:七角星形,以此类推,还有更多角的星形。
  • MSO_SHAPE.PENTAGON:五边形。
  • MSO_SHAPE.HEXAGON:六边形。
  • MSO_SHAPE.PROCESS:标准的流程图矩形框,通常用于表示流程中的操作步骤。
  • MSO_SHAPE.DECISION:菱形决策框,用于表示流程中的判断点。
  • MSO_SHAPE.DOCUMENT:文档形状,通常表示数据或信息的存储。
  • MSO_SHAPE.DATABASE:数据库形状,用于表示数据存储源。
  • MSO_SHAPE.SMILEY_FACE:笑脸形状。
  • MSO_SHAPE.HEART:心形。
  • MSO_SHAPE.LIGHTNING_BOLT:闪电形状。
  • MSO_SHAPE.CLOUD:云朵形状。
from pptx import Presentation
# MSO_SHAPE枚举类,它包含了PowerPoint中各种预设的自动形状类型,如矩形、圆形、三角形等,可用于在幻灯片中添加特定形状
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
# 索引 5 通常对应仅包含标题的幻灯片布局
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)

# 使用 add_shape() 方法添加形状(五边形)并设置文本
# MSO_SHAPE.PENTAGON 表示要添加的形状类型为五边形
shape = shapes.add_shape(MSO_SHAPE.PENTAGON, left, top, width, height)
shape.text = 'Step 1'

# 调整下一个形状的位置和宽度
# 计算下一个形状的左偏移量,将当前形状的左偏移量加上其宽度,再减去 0.4 英寸,以实现形状之间的间隔
left = left + width - Inches(0.4)
# 将后续要添加的形状( Chevron 形状,即箭头形状)的宽度设置为 2 英寸
width = Inches(2.0)

# 循环添加后续形状(箭头形状)
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('example_5.pptx')

生成的演示文稿效果:

  • 示例 6:插入表格

add_table()方法用于在幻灯片上添加表格。该方法接受表格的行数、列数、左偏移量、上偏移量、宽度和高度作为参数。该方法返回的是一个包含表格的形状对象,通过 .table 属性可以获取实际的表格对象。

from pptx import Presentation
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 a Table'

# 定义表格的参数 
rows = cols = 2 # 行数和列数均为 2
left = top = Inches(2.0) # 表格距离幻灯片左侧和顶部的距离
width = Inches(6.0) # 表格的宽度
height = Inches(0.8) # 表格的高度

# add_table() 方法用于在幻灯片上添加表格。该方法接受表格的行数、列数、左偏移量、上偏移量、宽度和高度作为参数
# add_table() 方法返回的是一个包含表格的形状对象,通过 .table 属性可以获取实际的表格对象,并将其赋值给 table 变量,后续可对该表格进行具体的设置和操作
table = shapes.add_table(rows, cols, left, top, width, height).table

# 设置表格列宽
table.columns[0].width = Inches(2.0)
table.columns[1].width = Inches(4.0)

#  写入表格列标题
table.cell(0, 0).text = 'Foo'
table.cell(0, 1).text = 'Bar'

# 写入表格正文内容
table.cell(1, 0).text = 'Baz'
table.cell(1, 1).text = 'Qux'

prs.save('example_6.pptx')

生成的演示文稿效果:

  • 示例 7:从演示文稿中的幻灯片中提取所有文本

打开一个现有的 PowerPoint 演示文稿,遍历其中的所有幻灯片、形状、段落和文本运行,将每个文本运行的内容提取出来并存储在一个列表中,最后返回这个列表。

from pptx import Presentation

# 打开现有的演示文稿
prs = Presentation('example_1.pptx')

# 创建一个空列表 text_runs,用于存储演示文稿中所有文本运行(text run)的内容。文本运行是指具有相同格式设置(如字体、颜色、大小等)的一段连续文本
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)

text_runs
# 输出:['Hello, World!', 'This is a sample presentation.']


更多内容可以前往官方文档查看:

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


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments