使用Python在Excel工作表中插入、提取和管理OLE对象

 更新时间:2026年08月31日 08:37:45   作者:用户835629078051  
OLE对象是 Excel 中一种强大的数据嵌入机制,允许将外部文档——如 Word 文档、PDF 文件、PowerPoint 演示文稿、音频文件等直接嵌入到工作表中,本文将详细介绍如何使用 Python 在 Excel 工作表中插入、提取和管理 OLE 对象,需要的朋友可以参考下

引言

OLE(Object Linking and Embedding)对象是 Excel 中一种强大的数据嵌入机制,允许将外部文档——如 Word 文档、PDF 文件、PowerPoint 演示文稿、音频文件等——直接嵌入到工作表中。这使得 Excel 不仅仅是一个电子表格工具,还可以作为多种类型文档的容器。在自动化报表生成、数据归档和文档管理场景中,以编程方式插入和提取 OLE 对象可以显著提高效率。本文将详细介绍如何使用 Python 在 Excel 工作表中插入、提取和管理 OLE 对象。

为什么以编程方式管理 OLE 对象

与手动在 Excel 中插入对象相比,编程方式具有以下优势:

  • 批量嵌入:将多个外部文档一次性嵌入到工作表中,无需逐个操作
  • 自动化归档:将关联文档与数据绑定存储,确保数据与上下文文档不分离
  • 文档提取:从工作表中批量提取嵌入的文档,用于后续处理或转换
  • 流程集成:将 OLE 对象操作集成到数据处理管道中,实现端到端自动化

环境搭建

本文使用 Spire.XLS for Python,它提供了全面的 API 来操作 Excel 工作簿和工作表,包括 OLE 对象的插入和提取。

pip install Spire.XLS

安装完成后,即可在 Python 脚本中导入相关模块开始工作。

插入 OLE 对象

插入 OLE 对象的核心是提供源文件路径和用于显示的预览图像。以下代码演示了如何将一个 Excel 文件作为 OLE 对象嵌入到工作表中:

from spire.xls import *
from spire.xls.common import *


def GenerateImage(fileName):
        book = Workbook()
        book.LoadFromFile(fileName)
        book.Worksheets[0].PageSetup.LeftMargin = 0
        book.Worksheets[0].PageSetup.RightMargin = 0
        book.Worksheets[0].PageSetup.TopMargin = 0
        book.Worksheets[0].PageSetup.BottomMargin = 0
        return book.Worksheets[0].ToImage(1, 1, 19, 5)

inputFile = "./Data/InsertOLEObjects.xls"
outputFile = "InsertOLEObjects.xlsx"

# 创建工作簿并获取第一个工作表
workbook = Workbook()
ws = workbook.Worksheets[0]
ws.Range["A1"].Text = "Here is an OLE Object."

# 生成预览图像并插入 OLE 对象
image = GenerateImage(inputFile)
oleObject = ws.OleObjects.Add(inputFile, image, OleLinkType.Embed)
oleObject.Location = ws.Range["B4"]
oleObject.ObjectType = OleObjectType.ExcelWorksheet

# 保存文件
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

代码中的关键步骤说明:

  1. 生成预览图像GenerateImage() 函数加载源文件并将其第一页转换为图像,该图像将作为 OLE 对象在工作表中的显示占位符。
  2. 添加 OLE 对象OleObjects.Add() 方法接受三个参数——源文件路径、预览图像和链接类型。OleLinkType.Embed 表示将对象嵌入到工作簿中(而非外部链接)。
  3. 设置位置和类型Location 属性指定 OLE 对象在工作表中的锚定单元格,ObjectType 属性设置嵌入对象的类型(此处为 Excel 工作表)。

插入音频文件作为 OLE 对象

除了文档文件,OLE 对象也支持嵌入音频等多媒体文件。以下代码演示了如何将 WAV 音频文件嵌入到工作表中:

from spire.xls import *
from spire.xls.common import *


inputFile = "./Data/WAVFileSample.wav"
inputimg = "./Data/SpireXls.png"
outputFile = "InsertWavFileOLEObject.xlsx"

# 创建工作簿并获取第一个工作表
workbook = Workbook()
sheet = workbook.Worksheets[0]

# 使用自定义图像作为预览,添加音频 OLE 对象
with Stream(inputimg) as fs:
    oleObject = sheet.OleObjects.Add(inputFile, fs, OleLinkType.Embed)

# 设置位置和对象类型
oleObject.Location = sheet.Range["B4"]
oleObject.ObjectType = OleObjectType.Package

workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

与插入文档文件的主要区别在于:

  • 预览图像来源:使用外部图片文件(SpireXls.png)通过 Stream 对象作为预览图像,而非从源文件自动生成。
  • 对象类型OleObjectType.Package 表示将文件作为通用包对象嵌入,适用于音频、视频等非文档类型的文件。

提取 OLE 对象

在文档管理和数据归档场景中,从 Excel 工作表中提取嵌入的 OLE 对象是一个常见需求。以下代码演示了如何从工作表中提取不同类型的嵌入文档:

from spire.xls import *
from spire.xls.common import *


def WriteAllBytes(fname: str, data):
    fp = open(fname, "wb")
    for d in data:
        fp.write(d)
    fp.close()

inputFile = "./Data/ExtractOle2.xlsx"

workbook = Workbook()
workbook.LoadFromFile(inputFile)
sheet = workbook.Worksheets[0]

# 检查工作表是否包含 OLE 对象
if sheet.HasOleObjects:
    for obj in sheet.OleObjects:
        type = obj.ObjectType
        # 提取 Word 文档
        if type is OleObjectType.WordDocument:
            WriteAllBytes("ExtractedWord.docx", obj.OleData)
        # 提取 PDF 文档
        elif type is OleObjectType.AdobeAcrobatDocument:
            WriteAllBytes("ExtractedPDF.pdf", obj.OleData)
        # 提取 PowerPoint 文档
        elif type is OleObjectType.PowerPointSlide:
            WriteAllBytes("ExtractedPPT.pptx", obj.OleData)

workbook.Dispose()

提取过程的核心逻辑:

  • 检测 OLE 对象HasOleObjects 属性首先检查工作表是否包含 OLE 对象,避免不必要的遍历。
  • 类型判断:通过 ObjectType 属性判断每个 OLE 对象的具体类型,如 WordDocumentAdobeAcrobatDocumentPowerPointSlide 等。
  • 数据提取OleData 属性返回 OLE 对象的原始二进制数据,通过 WriteAllBytes() 函数将其写入对应的文件。

获取 OLE 对象的原始文档名称

每个 OLE 对象都保留了原始文档的名称信息,这在追踪嵌入文档来源时非常有用:

from spire.xls.common import *
from spire.xls import *

inputFile = "Data/ExtractOleObjectName.xlsx"

# 创建工作簿并加载文件
workbook = Workbook()
workbook.LoadFromFile(inputFile)

# 获取第一个工作表
sheet = workbook.Worksheets[0]

information = ""

# 遍历所有 OLE 对象,获取原始文档名称
for ole in sheet.OleObjects:
    ole_name = ole.OriginName
    information += ole_name + "\r\n"

print(information)

workbook.Dispose()

OriginName 属性返回 OLE 对象嵌入时使用的原始文件名。通过遍历所有 OLE 对象并收集名称信息,可以快速生成嵌入文档的清单。

实战技巧

批量提取并分类保存 OLE 对象

在实际应用中,工作表可能包含多种类型的 OLE 对象。以下代码展示了如何批量提取并按类型分类保存:

type_mapping = {
    OleObjectType.WordDocument: ".docx",
    OleObjectType.AdobeAcrobatDocument: ".pdf",
    OleObjectType.PowerPointSlide: ".pptx",
    OleObjectType.ExcelWorksheet: ".xlsx"
}

if sheet.HasOleObjects:
    for index, obj in enumerate(sheet.OleObjects):
        ext = type_mapping.get(obj.ObjectType, ".bin")
        filename = f"ole_object_{index}{ext}"
        WriteAllBytes(filename, obj.OleData)
        print(f"已提取: {filename} (类型: {obj.ObjectType})")

通过类型映射字典将 ObjectType 转换为文件扩展名,可以自动为提取的文件赋予正确的后缀,便于后续打开和处理。

遍历多个工作表提取 OLE 对象

当工作簿的多个工作表都包含 OLE 对象时,需要遍历所有工作表进行提取:

for sheet_index in range(workbook.Worksheets.Count):
    sheet = workbook.Worksheets[sheet_index]
    if sheet.HasOleObjects:
        for obj in sheet.OleObjects:
            print(f"工作表 {sheet_index + 1}: {obj.OriginName} - {obj.ObjectType}")

这段代码会扫描整个工作簿,报告每个工作表中 OLE 对象的名称和类型,适用于文档审计和内容盘点场景。

总结

本文详细介绍了使用 Python 在 Excel 工作表中管理 OLE 对象的完整流程,涵盖插入文档对象、插入多媒体文件、提取嵌入文档和获取对象信息四个核心操作。

关键要点回顾:

  1. 使用 OleObjects.Add() 方法插入 OLE 对象,需提供源文件路径、预览图像和链接类型
  2. 通过 ObjectType 属性设置对象类型,文档类型使用具体类型枚举,多媒体文件使用 Package
  3. 利用 HasOleObjects 检测和 OleData 属性提取嵌入文档的原始二进制数据
  4. 通过 OriginName 属性获取 OLE 对象的原始文档名称,用于追踪嵌入来源

掌握这些技能后,你可以将 OLE 对象管理集成到文档处理工作流中,实现外部文档的自动嵌入、批量提取和分类归档,有效提升文档管理的自动化水平。

以上就是使用Python在Excel工作表中插入、提取和管理OLE对象的详细内容,更多关于Python Excel管理OLE对象的资料请关注脚本之家其它相关文章!

相关文章

  • python+flask编写一个简单的登录接口

    python+flask编写一个简单的登录接口

    这篇文章主要介绍了python+flask编写一个简单的登录接口,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • C# DataGridView行列转换的具体实现

    C# DataGridView行列转换的具体实现

    本文主要介绍了C# DataGridView行列转换的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python+OpenCV实现图片中的圆形检测

    Python+OpenCV实现图片中的圆形检测

    这篇文章主要介绍了如何利用Python+OpenCV实现检测图片中的圆形,文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起学习一下
    2022-04-04
  • 如何利用Python拟合函数曲线详解

    如何利用Python拟合函数曲线详解

    在实际项目中,往往有这样的需求:对采集到的数据进行数据处理(曲线拟合),再计算出一些想要的参数,比如峰值/dip值/周期等等,下面这篇文章主要给大家介绍了关于如何利用Python拟合函数曲线的相关资料,需要的朋友可以参考下
    2022-04-04
  • Python lambda函数(匿名函数)、参数类型与递归全解析

    Python lambda函数(匿名函数)、参数类型与递归全解析

    本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效的Pythonic代码,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • python+opencv边缘提取与各函数参数解析

    python+opencv边缘提取与各函数参数解析

    这篇文章主要介绍了python+opencv边缘提取与各函数参数解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python实现删除文件并移动至回收站

    Python实现删除文件并移动至回收站

    在Python中,直接使用os.remove()或os.unlink()可以永久删除文件,但这种方式没有回旋余地,下面小编就和大家详细介绍一下如何使用Python安全删除文件吧
    2026-03-03
  • pytorch GAN伪造手写体mnist数据集方式

    pytorch GAN伪造手写体mnist数据集方式

    今天小编就为大家分享一篇pytorch GAN伪造手写体mnist数据集方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 详解Python中文分词而生的jieba库

    详解Python中文分词而生的jieba库

    这篇文章主要介绍了详解Python中文分词而生的jieba库,在Python中,最好用的中文分词库是jieba。用“结巴”给一个中文分词库命名,非常生动形象,同时还带有一种程序员式的幽默感,需要的朋友可以参考下
    2023-07-07
  • 使用Ray集群简单创建Python分布式应用程序

    使用Ray集群简单创建Python分布式应用程序

    面对计算密集型的任务,除了多进程,就是分布式计算,如何用 Python 实现分布式计算呢?今天分享一个很简单的方法,那就是借助于 Ray
    2021-09-09

最新评论