Python 操作 PowerPoint OLE 对象的实现

 更新时间:2026年05月24日 09:14:04   作者:用户835629078051  
本文详细介绍如何使用Python在PowerPoint中嵌入、管理和操作OLE对象,包括嵌入Excel文件、ZIP压缩包等,并提取、修改已嵌入的OLE对象数据,通过这些技术,可以构建自动化工具处理包含多种类型数据的复杂演示文稿

在现代办公自动化场景中,经常需要在 PowerPoint 演示文稿中嵌入外部应用程序的对象,例如 Excel 电子表格、Word 文档或 ZIP 压缩包等。OLE(Object Linking and Embedding)技术允许将这些对象直接嵌入到幻灯片中,并保持其原有的编辑功能。使用 Python 自动化处理 OLE 对象,可以实现批量创建包含复杂数据对象的演示文稿,满足企业报告、数据分析和文档集成的需求。

本文将介绍如何使用 Python 在 PowerPoint 中嵌入、管理和操作 OLE 对象,包括嵌入 Excel 文件、ZIP 压缩包以及如何提取和修改已有的 OLE 对象。

环境设置

首先安装所需的库:

pip install Spire.Presentation

核心实现

嵌入 Excel 文件作为 OLE 对象

在 PowerPoint 中嵌入 Excel 文件,可以使其在演示文稿中保持可编辑的状态。当双击嵌入的 Excel 对象时,会启动 Excel 应用程序来编辑该对象。

from spire.presentation.common import *
from spire.presentation import *

inputFile = "./Data/EmbedExcelAsOLE.xlsx"
outputFile = "EmbedExcelAsOLE.pptx"

# 创建 PowerPoint 文档
ppt = Presentation()

# 加载一个图片文件作为 OLE 对象的预览图
stream = Stream("Data/EmbedExcelAsOLE.png")
oleImage = ppt.Images.AppendStream(stream)
stream.Close()

# 定义 OLE 对象的位置和大小
rec = RectangleF.FromLTRB(80, 60, oleImage.Width+80, oleImage.Height+60)

# 插入基于 Excel 数据的 OLE 对象
oleStream = Stream(inputFile)
oleObject = ppt.Slides[0].Shapes.AppendOleObject("excel", oleStream, rec)
oleObject.SubstituteImagePictureFillFormat.Picture.EmbedImage = oleImage
oleObject.ProgId = "Excel.Sheet.12"
oleStream.Close()

# 保存文档
ppt.SaveToFile(outputFile, FileFormat.Pptx2010)
ppt.Dispose()

代码解析:

  1. 首先加载 Excel 文件和预览图片
  2. 定义 OLE 对象在幻灯片上的矩形区域
  3. 使用 AppendOleObject 方法将 Excel 文件作为 OLE 对象添加到幻灯片中
  4. 设置 OLE 对象的预览图片和 ProgID(标识应用程序类型)

ProgID 是关键参数,它标识了用于打开对象的应用程序:

  • Excel.Sheet.8 或 Excel.Sheet.12 - Excel 97-2003 工作簿或 Excel 2007+ 工作簿
  • Word.Document.8 或 Word.Document.12 - Word 97-2003 文档或 Word 2007+ 文档
  • PowerPoint.Show.8 或 PowerPoint.Show.12 - PowerPoint 97-2003 演示文稿或 PowerPoint 2007+ 演示文稿

嵌入其他类型的 OLE 对象

除了 Excel 文件,还可以嵌入 ZIP 压缩包或其他类型的文件:

from spire.presentation.common import *
from spire.presentation import *

inputFile = "./Data/EmbedZipIntoPPT.pptx"
inputFile_z = "./Data/test.zip"
inputFile_i = "./Data/icon.png"
outputFile = "EmbedZipIntoPPT.pptx"

# 创建 PowerPoint 文档
ppt = Presentation()
ppt.LoadFromFile(inputFile)

# 加载 ZIP 文件流
stream = Stream(inputFile_z)

# 定义 OLE 对象的位置和大小
rec = RectangleF.FromLTRB(80, 60, 180, 160)

# 插入 ZIP 对象到演示文稿
ole = ppt.Slides[0].Shapes.AppendOleObject(inputFile_z, stream, rec)
ole.ProgId = "Package"  # Package ProgID 用于 ZIP 等压缩文件

# 加载并设置图标图片
image = Stream(inputFile_i)
oleImage = ppt.Images.AppendStream(image)
ole.SubstituteImagePictureFillFormat.Picture.EmbedImage = oleImage

# 保存文档
ppt.SaveToFile(outputFile, FileFormat.Pptx2010)
ppt.Dispose()

提取 OLE 对象数据

可以从 PowerPoint 演示文稿中提取已嵌入的 OLE 对象数据:

from spire.presentation.common import *
from spire.presentation import *

inputFile = "./Data/ExtractOLEObject.pptx"
outputFile_xls = "ExtractOLEObject.xls"
outputFile_xlsx = "ExtractOLEObject.xlsx"
outputFile_doc = "ExtractOLEObject.doc"
outputFile_docx = "ExtractOLEObject.docx"

# 创建 PowerPoint 文档
presentation = Presentation()

# 从磁盘加载文档
presentation.LoadFromFile(inputFile)

# 遍历幻灯片和形状
for slide in presentation.Slides:
    for shape in slide.Shapes:
        if isinstance(shape, IOleObject):
            # 找到 OLE 对象
            oleObject = shape if isinstance(shape, IOleObject) else None

            # 获取其数据并写入文件
            stream = oleObject.Data
            if oleObject.ProgId == "Excel.Sheet.8":
                stream.Save(outputFile_xls)
            elif oleObject.ProgId == "Excel.Sheet.12":
                stream.Save(outputFile_xlsx)
            elif oleObject.ProgId == "Word.Document.8":
                stream.Save(outputFile_doc)
            elif oleObject.ProgId == "Word.Document.12":
                stream.Save(outputFile_docx)
            
            stream.Dispose()

presentation.Dispose()

修改 OLE 对象内容

可以修改 PowerPoint 中已存在的 OLE 对象内容:

from spire.presentation.common import *
from spire.presentation import *

inputFile = "./Data/ModifyOLEData.pptx"
outputFile = "ModifyOLEData.pptx"

# 创建 PowerPoint 文档
presentation = Presentation()

# 从磁盘加载文档
presentation.LoadFromFile(inputFile)

# 遍历幻灯片和形状
for slide in presentation.Slides:
    for shape in slide.Shapes:
        if isinstance(shape, IOleObject):
            # 找到 OLE 对象
            oleObject = shape if isinstance(shape, IOleObject) else None

            # 获取其数据
            stream = oleObject.Data
            stream2 = Stream()
            if oleObject.ProgId == "PowerPoint.Show.12":
                # 加载 PowerPoint 流
                ppt = Presentation()
                ppt.LoadFromStream(stream, FileFormat.Auto)
                
                # 在幻灯片中追加一个图像
                ppt.Slides[0].Shapes.AppendEmbedImageByPath(
                    ShapeType.Rectangle, "Data/Logo.png", RectangleF.FromLTRB(50, 50, 150, 150))
                
                # 保存到新的流
                ppt.SaveToFile(stream2, FileFormat.Pptx2013)
                stream2.Position = 0
                
                # 修改数据
                oleObject.Data = stream2

# 保存文档
presentation.SaveToFile(outputFile, FileFormat.Pptx2013)
presentation.Dispose()

实用技巧

  1. 选择合适的预览图片:为 OLE 对象设置有意义的预览图片,使演示文稿更加直观。

  2. 正确设置 ProgID:确保 OLE 对象的 ProgID 与其实际内容类型匹配,否则可能无法正确打开。

  3. 资源管理:始终记得在完成操作后调用 Dispose() 方法释放资源。

  4. 错误处理:在生产环境中,应该添加适当的异常处理机制。

总结

本文展示了如何使用 Python 在 PowerPoint 中嵌入和管理 OLE 对象,包括嵌入不同类型的文件、提取 OLE 对象数据以及修改现有 OLE 对象内容。通过这些技术,可以构建强大的自动化工具来处理包含多种类型数据的复杂演示文稿。这些方法特别适用于需要将多个文档整合到单一演示文稿中的业务场景,例如制作包含实时数据报表的企业汇报材料。

到此这篇关于Python 操作 PowerPoint OLE 对象的实现的文章就介绍到这了,更多相关Python 操作 PowerPoint OLE内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用C++封装MySQL的API的教程

    用C++封装MySQL的API的教程

    这篇文章主要介绍了用C++封装MySQL的API的教程,包括对语句拼装器SQLJoin的介绍,需要的朋友可以参考下
    2015-05-05
  • pycharm console 打印中文为乱码问题及解决

    pycharm console 打印中文为乱码问题及解决

    这篇文章主要介绍了pycharm console 打印中文为乱码问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 解析Sentry Relay 二次开发调试

    解析Sentry Relay 二次开发调试

    这篇文章主要介绍了Sentry Relay 二次开发调试简介,集成测试要求 Redis 和 Kafka 在其默认配置中运行,获取所有必需服务的最便捷方式是通过 sentry devservices,这需要最新的 Sentry 开发环境,本文给大家介绍的非常详细,需要的朋友参考下吧
    2022-03-03
  • 基于Python编写微信清理工具的示例代码

    基于Python编写微信清理工具的示例代码

    这篇文章主要和大家分享一个用Python语言编写的微信清理小工具的示例代码,而且该工具不会删除文字的聊天记录,感兴趣的可以了解一下
    2022-05-05
  • python中加背景音乐如何操作

    python中加背景音乐如何操作

    在本篇文章里小编给大家整理了关于在python中加背景音乐的方法,需要的朋友们可以参考下。
    2020-07-07
  • Python实现文本特征提取的方法详解

    Python实现文本特征提取的方法详解

    这篇文章主要为大家详细介绍了Python实现提取四种不同文本特征的方法,有字典文本特征提取、英文文本特征提取、中文文本特征提取和TF-IDF 文本特征提取,感兴趣的可以了解一下
    2022-08-08
  • python+selenium 脚本实现每天自动登记的思路详解

    python+selenium 脚本实现每天自动登记的思路详解

    这篇文章主要介绍了python+selenium 脚本实现每天自动登记,本文你给大家分享基本的思路,通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • python 实现一个贴吧图片爬虫的示例

    python 实现一个贴吧图片爬虫的示例

    下面小编就为大家带来一篇python 实现一个贴吧图片爬虫的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 基于Python实现png转webp的命令行工具

    基于Python实现png转webp的命令行工具

    网页上使用webp格式的图片更加省网络流量和存储空间,但本地图片一般是png格式的,所以本文就来为大家介绍一下如何使用Python实现png转webp功能吧
    2025-02-02
  • Python实现读取文件的方法总结

    Python实现读取文件的方法总结

    这篇文章主要为大家详细介绍了Python中实现读取文件效果的几种方法总结,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-09-09

最新评论