Python 办公自动化:PPT 文档操作进阶(表格、图片、视频)
使用 Python 的 python-pptx 库进行 PPT 办公自动化的进阶操作。内容涵盖表格的插入、行列调整、样式设置及合并;图片的等比例插入与尺寸计算;视频的嵌入与封面图提取。文章提供了完整的代码示例,并补充了环境配置、单位换算、内存管理及兼容性等最佳实践建议,旨在帮助开发者高效构建自动化 PPT 生成工具。

使用 Python 的 python-pptx 库进行 PPT 办公自动化的进阶操作。内容涵盖表格的插入、行列调整、样式设置及合并;图片的等比例插入与尺寸计算;视频的嵌入与封面图提取。文章提供了完整的代码示例,并补充了环境配置、单位换算、内存管理及兼容性等最佳实践建议,旨在帮助开发者高效构建自动化 PPT 生成工具。

在前文简单介绍了 PPT 的文档结构,并使用 python-pptx 依赖库完成对 PPT 文档最基本的操作后,本文将深入讲解更复杂的多媒体元素处理。作为 PPT 自动化系列篇的第二部分,重点覆盖以下内容:
在开始之前,请确保已安装必要的依赖库:
pip install python-pptx
pip install pillow
pip install moviepy
其中 moviepy 用于处理视频帧和获取视频信息,pillow 用于处理图片尺寸。
实例化一个幻灯片 Slide 对象后,即可调用相关方法插入表格。
方法签名如下:
slide.shapes.add_table(rows, cols, left, top, width, height)
参数说明:
rows: 表格行数cols: 表格列数left: 左边距(单位通常为厘米或英寸)top: 上边距width: 表格总宽度height: 表格总高度返回值类型为 pptx.shapes.graphfrm.GraphicFrame,其 .table 属性即为真正的表格对象 pptx.table.Table。
from pptx.util import Cm
def insert_table(slide, rows, cols, left, top, width, height):
"""
幻灯片中插入一个表格
:param slide: 幻灯片对象
:param rows: 行数
:param cols: 列数
:param left: 左边距 (cm)
:param top: 上边距 (cm)
:param width: 表格宽度 (cm)
:param height: 表格高度 (cm)
:return: 表格对象
"""
# 插入一个表格
table = slide.shapes.add_table(rows, cols, Cm(left), Cm(top), Cm(width), Cm(height)).table
return table
# 示例:创建一个空白幻灯片并插入表格
# slide = add_slide(self.presentation, 6)
table = insert_table(slide, 3, 3, 3, 5, 13.6, 5)
为了生成美观的表格,通常需要手动调整行列尺寸。通过 columns 和 rows 属性可获取所有列对象和行对象。
def set_table_column_width(table, column_index, width_cm):
"""设置表格某一列的宽度"""
table.columns[column_index].width = Cm(width_cm)
def set_table_row_height(table, row_index, height_cm):
"""设置表格某一行的高度"""
table.rows[row_index].height = Cm(height_cm)
# 应用示例
set_table_column_width(table, 0, 5)
set_table_column_width(table, 1, 5)
set_table_column_width(table, 2, 5)
set_table_row_height(table, 0, 1.5)
set_table_row_height(table, 1, 1.2)
set_table_row_height(table, 2, 1.2)
通过行索引和列索引获取对应的单元格对象,然后设置 text 属性。
# 获取某一个单元格对象(索引从 0 开始)
cell = table.cell(0, 0)
cell.text = "单元格显示的内容"
# 批量设置数据
datas = [
["学员", "姓名", "年龄"],
["", "星安果", 23],
["", "AirPython", 18]
]
for row_index in range(len(table.rows)):
for column_index in range(len(table.columns)):
cell_temp = table.cell(row_index, column_index)
cell_temp.text = str(datas[row_index][column_index])
调整样式涉及三个步骤:获取文本对象 -> 拿到段落对象 -> 指定对齐及字体样式。
from pptx.enum.text import PP_ALIGN
def set_cell_style(cell, font_name='微软雅黑', font_size=23, font_bold=True):
"""设置单元格文字样式"""
paragraph = cell.text_frame.paragraphs[0]
# 设置对齐方式
paragraph.alignment = PP_ALIGN.CENTER
# 设置字体加粗
if font_bold:
paragraph.font.bold = True
# 注意:实际项目中可能需要遍历 run 对象来设置颜色
# paragraph.runs[0].font.name = font_name
# paragraph.runs[0].font.size = Pt(font_size)
# 设置第一行表头单元格文字加粗居中显示
for column_index in range(len(table.columns)):
cell = table.cell(0, column_index)
set_cell_style(cell)
利用形状填充功能设置背景色。
from pptx.dml.color import RGBColor
def set_widget_bg(widget, bg_rgb_color=None):
"""设置【文本框/单元格/形状】的背景颜色"""
if bg_rgb_color and len(bg_rgb_color) == 3:
widget.fill.solid()
widget.fill.fore_color.rgb = RGBColor(*bg_rgb_color)
# 设置单元格背景颜色
set_widget_bg(cell, [204, 217, 225])
语法为 开始单元格.merge(结束单元格)。
from pptx.enum.text import MSO_ANCHOR
def merge_and_center_cells(start_cell, end_cell):
"""合并单元格并居中"""
start_cell.merge(end_cell)
start_cell.text = "合并内容"
# 垂直居中
start_cell.vertical_anchor = MSO_ANCHOR.MIDDLE
# 水平居中
paragraph = start_cell.text_frame.paragraphs[0]
paragraph.alignment = PP_ALIGN.CENTER
# 示例
merge_and_center_cells(table.cell(1, 0), table.cell(2, 0))
无论是静态图片还是 GIF 动态图片,插入方式基本一致,但需注意尺寸控制以避免变形。
from PIL import Image
from pptx.util import Cm
def insert_image(slide, pic_path, left, top, width=None, height=None):
"""
幻灯片中加入图片
:param pic_path: 文件路径
:param left: 左边距 (cm)
:param top: 上边距 (cm)
:param width: 宽度 (cm),None 则按原图
:param height: 高度 (cm),None 则按原图
"""
# 如果未指定宽高,保持原图大小可能会导致展示不全
if width is None or height is None:
img = Image.open(pic_path)
width, height = img.size
# 这里可根据需求转换为 cm 或其他单位
# 此处仅为演示逻辑
pass
pic_obj = slide.shapes.add_picture(
image_file=pic_path,
left=Cm(left),
top=Cm(top),
width=Cm(width) if width else None,
height=Cm(height) if height else None
)
return pic_obj
当图片很大时,直接插入可能超出页面边界。建议先获取宽高比,再等比例计算。
def get_image_aspect_ratio(image_path):
"""获取图片的宽高比"""
img = Image.open(image_path)
width, height = img.size
return width / height
# 获取宽高比
aspect_ratio = get_image_aspect_ratio('./1.jpeg')
# 设定目标宽度为 6cm,计算对应高度
target_width = 6
target_height = target_width / aspect_ratio
insert_image(slide, './1.jpeg', 6, 6, target_width, target_height)
往 PPT 中插入视频需要额外处理封面图(Poster Frame),且依赖 moviepy 库。
from moviepy.editor import VideoFileClip
import os
def get_video_info(video_path):
"""获取视频宽、高比"""
clip = VideoFileClip(video_path)
width, height = clip.size
aspect_ratio = width / height
clip.close() # 及时释放资源
return aspect_ratio
import random
import string
def generate_random_str(length):
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
def get_video_frame(clip, frame_index):
"""获取视频的某一帧图片"""
frame_count = int(clip.fps * clip.duration)
if frame_index < 0 or frame_index >= frame_count:
frame_index = 1
frames = clip.iter_frames()
thumbnail_path = f"./temp/{generate_random_str(10)}.jpg"
for index, frame in enumerate(frames):
if index == frame_index:
from PIL import Image
im = Image.fromarray(frame)
im.save(thumbnail_path)
break
return thumbnail_path
def insert_video(slide, video_path, poster_path, left, top, width, height):
"""插入视频"""
slide.shapes.add_movie(
video_path=video_path,
left=Cm(left),
top=Cm(top),
width=Cm(width),
height=Cm(height),
poster_frame_image=poster_path
)
# 完整流程示例
video_path = './1.mp4'
aspect_ratio = get_video_info(video_path)
thumbnail_path = get_video_frame(VideoFileClip(video_path), 120)
insert_video(slide, video_path, thumbnail_path, 3, 3, 4, 4 / aspect_ratio)
python-pptx 默认支持多种单位,如 Cm (厘米)、Inches (英寸)、Pt (磅)。务必在传入坐标前统一转换,否则可能导致布局错乱。
在处理大视频或高分辨率图片时,moviepy 和 PIL 可能会占用大量内存。建议在处理完 VideoFileClip 后立即调用 .close() 方法释放资源。
建议使用绝对路径或相对于脚本执行目录的路径。跨平台使用时,注意路径分隔符的差异,可使用 os.path.join 或 pathlib 模块。
并非所有视频格式都能在所有版本的 PowerPoint 中正常播放。推荐使用 MP4 (H.264 编码) 格式以确保最大兼容性。GIF 动图支持良好,但需注意文件大小限制。
本文详细讲解了使用 Python 进行 PPT 自动化时的核心操作,包括表格的精细排版、图片的等比例插入以及视频的嵌入与封面处理。掌握这些技能可以大幅提升办公效率,实现批量报告生成的自动化。在实际项目中,建议结合异常处理机制,确保程序在文件缺失或格式错误时能优雅降级。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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