Python 办公自动化:PPT 高级功能与常用操作
1. 前言
在办公自动化场景中,PowerPoint(PPT)是数据展示和汇报的重要载体。使用 Python 的 python-pptx 库可以高效地生成、修改和提取 PPT 内容,替代繁琐的人工操作。本系列文章将深入探讨 PPT 的高级功能及常用操作点。
本文介绍利用 Python 的 python-pptx 库实现 PPT 办公自动化的关键技术点。内容包括向幻灯片中添加和设置预设形状、创建并配置各类图表、遍历读取 PPT 中的文本与表格数据,以及批量提取保存幻灯片内的图片资源。通过完整的代码示例,演示了如何高效处理演示文稿的结构化元素与多媒体内容,适用于日常办公场景的自动化需求。

在办公自动化场景中,PowerPoint(PPT)是数据展示和汇报的重要载体。使用 Python 的 python-pptx 库可以高效地生成、修改和提取 PPT 内容,替代繁琐的人工操作。本系列文章将深入探讨 PPT 的高级功能及常用操作点。
本文档涵盖的核心内容包括:
实际上,PPT 文档的内容区主要由各类形状(Shape)组成,包含图片、文本框、视频、表格以及预设几何形状等。预设的普通形状种类非常丰富,涵盖了箭头、流程图符号、基本几何图形等。
使用 slide.shapes.add_shape() 方法可以向幻灯片中插入一个形状。该方法需要指定形状类型、位置坐标及尺寸。
from pptx import Presentation
from pptx.util import Inches, Cm
from pptx.enum.shapes import MSO_SHAPE, MSO_SHAPE_TYPE
# 初始化演示文稿
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6]) # 空白版式
# 定义插入形状的函数
def insert_shape(slide, left, top, width, height, autoshape_type_id=MSO_SHAPE.CHEVRON, unit=Cm):
"""
幻灯片中添加形状
:param slide: 幻灯片对象
:param left: 左边距
:param top: 上边距
:param width: 宽度
:param height: 高度
:param autoshape_type_id: 形状类型枚举
:param unit: 单位,默认为 Cm (厘米)
:return: 形状对象
"""
shape = slide.shapes.add_shape(
autoshape_type_id=autoshape_type_id,
left=unit(left),
top=unit(top),
width=unit(width),
height=unit(height)
)
return shape
# 示例:添加一个圆角矩形
rectangle = insert_shape(
slide,
left=2, top=2, width=16, height=8,
autoshape_type_id=MSO_SHAPE.ROUNDED_RECTANGLE,
unit=Cm
)
获取到形状对象后,我们可以进一步设置它的背景颜色、边框属性等视觉样式。
# 设置形状背景色为白色
rectangle.fill.solid()
rectangle.fill.fore_color.rgb = [255, 255, 255]
# 设置边框颜色为红色,宽度为 0.5 厘米
rectangle.line.color.rgb = [255, 0, 0]
rectangle.line.width = Cm(0.5)
通过遍历 MSO_SHAPE 枚举类,可以找到所有可用的预设形状类型进行组合使用。
图表是 PPT 中用于数据可视化的核心组件。使用 python-pptx 可以创建柱状图、饼图、折线图、散点图等多种类型的图表。
首先需要准备图表数据对象 ChartData,然后指定图表类型并添加到幻灯片。
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
# 创建图表数据对象
chart_data = ChartData()
# 设置 X 轴类别(年份)
chart_data.categories = ['2000', '2005', '2010', '2015', '2020']
# 添加数据系列
# 参数分别为:系列名称、数据列表
chart_data.add_series('经济', [60, 65, 75, 90, 95])
chart_data.add_series('环境', [95, 88, 84, 70, 54])
chart_data.add_series('文化', [40, 65, 80, 95, 98])
# 插入图表
# 参数:图表类型,左,上,宽,高,数据
chart = slide.shapes.add_chart(
XL_CHART_TYPE.LINE,
Inches(4), Inches(5), Inches(20), Inches(9),
chart_data
).chart
创建图表后,可以通过图表对象调整图例、平滑度、字体样式等细节。
# 显示图例
chart.has_legend = True
# 图例是否在绘图区之外显示
chart.legend.include_in_layout = False
# 设置系列线条是否平滑
for series in chart.series:
series.smooth = True
# 设置图表文字样式
chart.font.size = 12
chart.font.color.rgb = [255, 0, 0]
PPT 文档的结构化数据提取通常涉及遍历幻灯片中的所有形状。利用 shape.has_text_frame 属性可以判断形状内部是否包含文本框。
def read_ppt_content(presentation):
"""
读取 PPT 中所有的文本内容
:param presentation: Presentation 对象
:return: 文本列表
"""
results = []
for slide in presentation.slides:
for shape in slide.shapes:
if shape.has_text_frame:
content = shape.text_frame.text
if content.strip():
results.append(content)
return results
# 使用示例
presentation = Presentation('./raw.pptx')
contents = read_ppt_content(presentation)
print(contents)
对于嵌入的表格(Table),不能直接通过 text_frame 获取全部数据,需要遍历行和单元格。
from pptx.enum.shapes import MSO_SHAPE_TYPE
def read_ppt_table(presentation):
table_data = []
for slide in presentation.slides:
for shape in slide.shapes:
# 检查是否为表格形状
if shape.shape_type == MSO_SHAPE_TYPE.TABLE:
rows = []
for row in shape.table.rows:
row_cells = [cell.text_frame.text for cell in row.cells]
rows.append(row_cells)
table_data.append(rows)
return table_data
在某些场景下,我们需要将 PPT 文档中包含的所有图片素材提取并保存到本地磁盘。
MSO_SHAPE_TYPE.PICTURE 的图片形状。import os
import uuid
from pptx.enum.shapes import MSO_SHAPE_TYPE
def save_ppt_images(presentation, output_path):
"""
保存 PPT 中所有图片
:param presentation: PPT 对象
:param output_path: 保存目录
"""
print(f'幻灯片数目:{len(presentation.slides)}')
if not os.path.exists(output_path):
os.makedirs(output_path)
for slide in presentation.slides:
for shape in slide.shapes:
if shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
# 获取图片二进制字符流
image_data = shape.image.blob
# 获取图片 MIME 类型,如 image/jpeg
image_type_pre = shape.image.content_type
# 提取后缀名
image_suffix = image_type_pre.split('/')[-1]
# 生成唯一文件名
file_name = f'{uuid.uuid4().hex}.{image_suffix}'
output_image_path = os.path.join(output_path, file_name)
with open(output_image_path, 'wb') as f:
f.write(image_data)
print(f'Saved: {output_image_path}')
通过 python-pptx 库,开发者可以实现对 PPT 文档的深度控制。从基础的形状绘制到复杂的数据图表生成,再到文档内容的解析与资源提取,这套方案能够显著提升办公自动化效率。
在实际项目中,建议结合 os, uuid, datetime 等标准库处理文件路径和时间戳,确保生成的文件命名规范且无冲突。同时,注意处理异常捕获,防止因文件格式损坏导致程序中断。掌握这些核心 API 后,即可构建更复杂的自动化报表系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online