当前位置: 代码网 > it编程>前端脚本>Python > 使用Python在Excel工作表中插入、提取和管理OLE对象

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

2026年08月31日 Python 我要评论
引言ole(object linking and embedding)对象是 excel 中一种强大的数据嵌入机制,允许将外部文档——如 word 文档、pdf 文件、powe

引言

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对象的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com