引言
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()
代码中的关键步骤说明:
- 生成预览图像:
generateimage()函数加载源文件并将其第一页转换为图像,该图像将作为 ole 对象在工作表中的显示占位符。 - 添加 ole 对象:
oleobjects.add()方法接受三个参数——源文件路径、预览图像和链接类型。olelinktype.embed表示将对象嵌入到工作簿中(而非外部链接)。 - 设置位置和类型:
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 对象的具体类型,如worddocument、adobeacrobatdocument、powerpointslide等。 - 数据提取:
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 对象的完整流程,涵盖插入文档对象、插入多媒体文件、提取嵌入文档和获取对象信息四个核心操作。
关键要点回顾:
- 使用
oleobjects.add()方法插入 ole 对象,需提供源文件路径、预览图像和链接类型 - 通过
objecttype属性设置对象类型,文档类型使用具体类型枚举,多媒体文件使用package - 利用
hasoleobjects检测和oledata属性提取嵌入文档的原始二进制数据 - 通过
originname属性获取 ole 对象的原始文档名称,用于追踪嵌入来源
掌握这些技能后,你可以将 ole 对象管理集成到文档处理工作流中,实现外部文档的自动嵌入、批量提取和分类归档,有效提升文档管理的自动化水平。
以上就是使用python在excel工作表中插入、提取和管理ole对象的详细内容,更多关于python excel管理ole对象的资料请关注代码网其它相关文章!
发表评论