在报表自动化、产品清单、设备档案等场景中,Excel 常需要同时保存商品图片、PDF 说明书或 Word 技术文档。手动通过“插入图片”和“插入对象”逐个添加,在少量文件时可行;一旦需要按业务数据批量生成工作簿,逐个选择文件就不适合。原文给出的方案是使用 Spire.XLS for Python,通过代码完成图片插入和 OLE 对象嵌入,并处理嵌入与链接、打开失败和文件体积等问题。
一、环境准备
安装 Spire.XLS for Python:
脚本中导入模块:- from spire.xls import *
- from spire.xls.common import *
复制代码
该库支持工作簿、工作表、单元格、图片和 OLE 对象等内容的操作,因此可以在不依赖 Excel 界面手动操作的情况下写入图片和文件对象。
二、用 Pictures.Add 插入图片
如果工作表需要按产品清单添加商品图片,可以调用 Worksheet.Pictures.Add() 将图片插入指定行列位置,再设置图片宽高、列宽行高以及图片与单元格边框的间距。原文示例代码如下:- from spire.xls import *
- from spire.xls.common import *
- # 创建 Workbook 对象
- workbook = Workbook()
- # 获取第一个工作表
- sheet = workbook.Worksheets[0]
- # 插入图片
- picture = sheet.Pictures.Add(1, 3, "product.png")
- # 设置图片大小
- picture.Width = 150
- picture.Height = 150
- # 调整列宽和行高
- sheet.Columns[2].ColumnWidth = 25
- sheet.Rows[0].RowHeight = 135
- # 设置图片与单元格边框之间的距离
- picture.LeftColumnOffset = 90
- picture.TopRowOffset = 20
- # 保存工作簿
- workbook.SaveToFile("InsertImage.xlsx", ExcelVersion.Version2013)
- workbook.Dispose()
复制代码
这段代码的关键点在于:Pictures.Add(1, 3, "product.png") 负责把图片放到指定行列,返回的 picture 对象用于设置 Width 和 Height;Columns[2].ColumnWidth 与 Rows[0].RowHeight 用来给图片预留显示空间;LeftColumnOffset 和 TopRowOffset 控制图片相对单元格边框的偏移,避免图片压住其他数据。保存时通过 SaveToFile 指定输出文件名和 ExcelVersion.Version2013,最后调用 Dispose() 释放资源。批量处理时可以在循环中读取不同图片路径,但仍要结合行高、列宽调整位置和尺寸,防止图片与数据重叠。
三、用 OleObjects.Add 嵌入文件
对于 Word、PDF、PowerPoint 等外部文件,可以使用 Worksheet.OleObjects.Add() 添加 OLE 对象。原文说明该方法主要涉及三个参数:fileName 是外部文件路径;image 是工作表中显示的对象图标或预览图片;linkType 指定嵌入还是链接,OleLinkType.Embed 表示嵌入文件,OleLinkType.Link 表示链接文件。
以嵌入 Word 文档为例:- from spire.xls import *
- from spire.xls.common import *
- # 创建 Workbook 对象
- workbook = Workbook()
- # 获取第一个工作表
- sheet = workbook.Worksheets[0]
- # 添加说明文字
- sheet.Range["A1"].Text = "产品技术文档"
- # 加载用于显示的文件图标
- image = Image.FromFile("word_icon.png")
- with Stream() as stream:
- image.Save(stream, ImageFormat.get_Png())
- # 将 Word 文件嵌入工作表
- oleObject = sheet.OleObjects.Add(
- "product_manual.docx",
- stream,
- OleLinkType.Embed
- )
- # 设置对象位置
- oleObject.Location = sheet.Range["B3"]
- # 设置对象类型
- oleObject.ObjectType = OleObjectType.WordDocument
- # 保存工作簿
- workbook.SaveToFile("EmbedFile.xlsx", ExcelVersion.Version2016)
- workbook.Dispose()
复制代码
执行逻辑是先用 Image.FromFile 读取图标,再把图标保存到 Stream,随后通过 OleObjects.Add 将 product_manual.docx 以 OleLinkType.Embed 方式嵌入工作表。oleObject.Location 指定对象显示在 B3 单元格,ObjectType 要与实际文件类型匹配,因此 Word 文档使用 OleObjectType.WordDocument。保存时示例指定 ExcelVersion.Version2016。若嵌入 PDF 或 PowerPoint,只需更换源文件路径,并把 ObjectType 改为对应类型:- # 嵌入 PDF 文件
- oleObject.ObjectType = OleObjectType.AdobeAcrobatDocument
- # 嵌入 PowerPoint 文件
- oleObject.ObjectType = OleObjectType.PowerPointPresentation
复制代码
四、嵌入与链接的差异
嵌入文件会把源文件数据保存在 Excel 工作簿中。即使原始文件被移动或删除,工作簿通常仍保留嵌入内容,但工作簿体积会增加。链接文件只保存指向外部文件的引用,不完整复制源文件数据,因此体积相对较小,但源文件路径必须有效,移动或删除源文件可能导致链接失效。若要把 Excel 和附件一起发送、不想额外传输源文件,可考虑嵌入;若文件较大或需要独立更新源文件,可考虑链接。
五、常见问题与体积控制
OLE 对象不能保证直接在工作表中预览,通常需要调用本地关联程序打开。双击无法打开时,优先检查本地是否安装了对应应用、ObjectType 是否与实际文件类型一致、链接方式下源文件路径是否仍然有效,以及不同 Excel 版本、操作系统和应用程序对 OLE 对象的兼容差异。生成工作簿后,最好在目标环境的 Excel 中实际双击验证。
文件体积方面,大量高清图片或较大的附件会明显增加工作簿大小,影响保存、传输和打开速度。可以在插入前适当压缩图片,避免使用不必要的高分辨率图片;体积较大的外部文件优先使用链接方式;如果只是让用户查看外部资料,也可以在单元格中添加超链接指向文件位置。
总结:少量图片或附件可以直接用 Excel 自带插入功能;批量生成报表时,Pictures.Add() 更适合把图片写入指定工作表位置,OleObjects.Add() 则用于把 Word、PDF、PowerPoint 等文件作为 OLE 对象嵌入或链接。配合行高列宽、对象类型、链接方式和文件体积控制,可以把图片和附件整合到自动化生成的 Excel 工作簿中。 |