使用 Python 轻松合并多个 PowerPoint 文件【代码详解】

实际工作中,一份完整的汇报往往由多个人分别准备:有人写背景,有人写方案,有人写数据,最后需要把几份演示文稿合成一个文件。手动复制粘贴幻灯片不仅费时,还容易丢失主题、字体和动画等格式信息。用代码来合并则既快又稳------只需指定源文件与合并顺序,剩下的交给库处理。本文介绍如何使用 Spire.Presentation 在 Python 中完成三种典型的合并:整体追加、挑选页合并到新文稿,以及把幻灯片插入到指定位置。

为什么需要合并演示文稿

合并幻灯片在以下场景中出现得非常频繁:

  • 多人协作汇总:团队成员各自准备的章节,最终要按汇报顺序拼成一份完整材料。
  • 按场合裁剪内容:同一套素材面对不同听众,需要从多份文件里各取几页重新组装。
  • 批量归档:把多份零散的演示文稿统一收进一份存档文件,方便分发和管理。

与手动复制相比,脚本合并的真正优势在于可复现与可扩展:合并规则一旦写好,素材更新后重跑一遍即可得到同样的结果,几十份文件的合并也只是多跑几次循环的事。

环境准备

本文使用 Spire.Presentation for Python 来合并演示文稿。合并的核心手段是把幻灯片对象从一份文稿的 Slides 集合转移到另一份,通过 AppendBySlide 追加到末尾,或通过 Insert 插入到指定位置。通过以下命令安装:

bash 复制代码
pip install Spire.Presentation

安装完成后,在脚本中导入所需模块即可:

python 复制代码
from spire.presentation.common import *
from spire.presentation import *

将一份演示文稿整体追加到另一份末尾

最常见的合并方式是"把 B 文件整个接到 A 文件后面"。做法是分别加载两份文稿,遍历源文稿的所有幻灯片,逐张调用 AppendBySlide 追加到目标文稿末尾。这样合并后的幻灯片会保留原有的内容与格式。

python 复制代码
from spire.presentation.common import *
from spire.presentation import *

inputFile_1 = "文档1.pptx"
inputFile_2 = "文档2.pptx"
outputFile = "ClonePPTAtEndOfAnother.pptx"

# 加载目标文稿与源文稿
destPPT = Presentation()
destPPT.LoadFromFile(inputFile_2)
sourcePPT = Presentation()
sourcePPT.LoadFromFile(inputFile_1)

# 遍历源文稿的全部幻灯片,逐张追加到目标文稿末尾
for slide in sourcePPT.Slides:
    destPPT.Slides.AppendBySlide(slide)

# 保存合并结果
destPPT.SaveToFile(outputFile, FileFormat.Pptx2013)
destPPT.Dispose()

这里的关键是 AppendBySlide:它接收一张幻灯片对象,把这张幻灯片复制追加到目标 Slides 集合的末尾。用 for slide in sourcePPT.Slides 遍历,就相当于把整份文件"搬"了过去。合并完成后保存的是目标文稿,源文稿本身不受影响。

挑选幻灯片合并到新文稿

更多时候我们并不想要对方的全部页面,而是想从几份文件里各挑一部分,重新组装成一份新文稿。做法是先创建一个空白的 Presentation,删掉它自带的默认幻灯片,再从各来源文稿中挑选需要的幻灯片逐张 AppendBySlide 进来。

python 复制代码
from spire.presentation.common import *
from spire.presentation import *

inputFile_1 = "文档1.pptx"
inputFile_2 = "文档2.pptx"
outputFile = "MergeSelectedSlides.pptx"

# 创建新文稿,并移除其自带的默认幻灯片
ppt = Presentation()
ppt.Slides.RemoveAt(0)

# 加载两份来源文稿
ppt1 = Presentation()
ppt1.LoadFromFile(inputFile_1)
ppt2 = Presentation()
ppt2.LoadFromFile(inputFile_2)

# 把 ppt1 的全部幻灯片追加进新文稿
for i, unusedItem in enumerate(ppt1.Slides):
    ppt.Slides.AppendBySlide(ppt1.Slides[i])

# 只追加 ppt2 中的第二张幻灯片
ppt.Slides.AppendBySlide(ppt2.Slides[1])

# 保存合并结果
ppt.SaveToFile(outputFile, FileFormat.Pptx2013)
ppt.Dispose()

两点细节值得注意:一是新建的 Presentation() 默认带一张空幻灯片,合并前要先用 RemoveAt(0) 把它删掉,否则成品开头会多出一页空白页;二是挑选来源时用索引即可精确控制,例如 ppt2.Slides[1] 只取第二张,配合多个来源文件的追加顺序,就能自由决定新文稿的页面编排。

把幻灯片插入到指定位置

AppendBySlide 只能往末尾追加,如果希望把某个幻灯片插进已有文稿的中间位置,就要用 Slides.Insert。它接受插入位置索引和幻灯片对象两个参数,常用来把别处的一页"补"进当前文稿的某个环节。

python 复制代码
from spire.presentation.common import *
from spire.presentation import *

inputFile_1 = "文档1.pptx"
inputFile_2 = "文档2.pptx"
outputFile = "CloneSlideToAnotherPPT.pptx"

# 加载目标文稿
presentation = Presentation()
presentation.LoadFromFile(inputFile_2)

# 加载来源文稿,取出其中的第一张幻灯片
ppt1 = Presentation()
ppt1.LoadFromFile(inputFile_1)
slide1 = ppt1.Slides[0]

# 把该幻灯片插入到目标文稿的索引 1 处(即第二张)
index = 1
presentation.Slides.Insert(index, slide1)

# 保存结果
presentation.SaveToFile(outputFile, FileFormat.Pptx2010)
presentation.Dispose()

Insert(1, slide1) 表示把来源文稿的第一张幻灯片插到目标文稿第二页的位置,原有页面依次后移。追加用 AppendBySlide、定点插入用 Insert,两者配合就能覆盖"接在后面"和"插进中间"两类合并需求。

综合示例:批量合并文件夹下的演示文稿

把整体追加的方法放进循环,就能一次性把某个目录下的所有演示文稿按文件名顺序合并成一份。下面遍历指定文件夹,把每个 .pptx 文件的全部幻灯片依次追加到结果文稿中。

python 复制代码
import os
from spire.presentation.common import *
from spire.presentation import *

ppt_dir = "./Demos/Data/Ppts"
outputFile = "MergedAll.pptx"

# 以文件夹中第一个文件作为合并起点
files = sorted(f for f in os.listdir(ppt_dir) if f.lower().endswith(".pptx"))
result = Presentation()
result.LoadFromFile(os.path.join(ppt_dir, files[0]))

# 把其余文件的幻灯片逐张追加进来
for file_name in files[1:]:
    source = Presentation()
    source.LoadFromFile(os.path.join(ppt_dir, file_name))
    for slide in source.Slides:
        result.Slides.AppendBySlide(slide)
    source.Dispose()

result.SaveToFile(outputFile, FileFormat.Pptx2013)
result.Dispose()
print(f"已合并 {len(files)} 份演示文稿。")

这个脚本有两个工程上的要点:一是用 sorted 保证文件按名称顺序合并,页序稳定可预期;二是每份源文稿用完立即 Dispose(),避免同时打开大量文件导致内存占用过高。如果只需要其中几页,在循环里加一层索引筛选,把 AppendBySlide 换成对选定幻灯片的追加即可。

实用技巧

  • 区分追加与插入 :整份文件合并用 AppendBySlide 循环;要控制页面在中间的位置时用 Slides.Insert(index, slide)
  • 新文稿先删默认页Presentation() 新建后自带一张空幻灯片,用它做合并容器前先 RemoveAt(0),避免成品开头多一页空白。
  • 用索引挑选页面 :来源文稿的任意一页都能通过 Slides[i] 精确取得,多来源合并时按追加顺序即可编排成品结构。
  • 大批量合并注意资源 :循环合并多份文件时,每份源文稿处理完立即 Dispose();文件特别多时分批处理更稳妥。
  • 合并后统一检查格式:不同来源的主题、字体可能不一致,合并完成后建议在 PowerPoint 中检查一遍版式,必要时统一应用一个母版。

总结

本文介绍了如何使用 Python 和 Spire.Presentation 合并 PowerPoint 文件,核心内容如下:

  • 遍历源文稿的 Slides 并逐张调用 AppendBySlide,把一份演示文稿整体追加到另一份末尾
  • 新建空白文稿并 RemoveAt(0) 移除默认页后,从多份文件中挑选幻灯片组装成新文稿
  • 使用 Slides.Insert(index, slide) 把幻灯片插入到合并结果的指定位置
  • 将追加逻辑放入循环并配合 Dispose 释放资源,可批量合并整个文件夹的演示文稿

掌握这几个集合操作后,无论是多人协作的章节汇总、按听众裁剪重组内容,还是批量归档零散文稿,都可以交给脚本完成。在实际项目中,建议先明确合并的页序规则,再决定用追加还是插入,最后对合并结果做一次版式检查,这样产出的文稿才能既完整又整洁。

相关推荐
Xiu Yan1 小时前
Python 数据分析:Pandas DataFrame 零基础入门教程
python·jupyter·pycharm·numpy·pandas
别动我齐刘海1 小时前
ROS2 Jazzy + C++ 实战路线——ros2_control
c++·人工智能·python·opencv·机器学习·机器人·github
把头塞进显示器2 小时前
电商平台-测试报告
python·selenium·pytest
ShyanZh2 小时前
【Python3基础】01-Python 环境与开发工具
python
醇氧2 小时前
Git 合并冲突与`__pycache__` 的恩怨情仇
python·numpy·fastapi
ShyanZh2 小时前
【Python3基础】02-输入输出与程序运行
python
伞伞悦读2 小时前
【第39期】Python 第三方包安装详解:pip、conda、requirements、版本锁定和镜像源
python·conda·pip
Jialu.3 小时前
第7篇:舆情预警系统:三类规则引擎 + 飞书/钉钉 Webhook 通知
python·安全
甜到心里的蛋糕3 小时前
如何用企业微信实现让微信收到通知实时通知
服务器·python·微信小程序·fastapi