查看: 165|回复: 3

Python批量插入Excel图片与嵌入OLE对象代码实践

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在报表自动化、产品清单、设备档案等场景中,Excel 常需要同时保存商品图片、PDF 说明书或 Word 技术文档。手动通过“插入图片”和“插入对象”逐个添加,在少量文件时可行;一旦需要按业务数据批量生成工作簿,逐个选择文件就不适合。原文给出的方案是使用 Spire.XLS for Python,通过代码完成图片插入和 OLE 对象嵌入,并处理嵌入与链接、打开失败和文件体积等问题。

一、环境准备
安装 Spire.XLS for Python:
  1. pip install Spire.XLS
复制代码

脚本中导入模块:
  1. from spire.xls import *
  2. from spire.xls.common import *
复制代码

该库支持工作簿、工作表、单元格、图片和 OLE 对象等内容的操作,因此可以在不依赖 Excel 界面手动操作的情况下写入图片和文件对象。

二、用 Pictures.Add 插入图片
如果工作表需要按产品清单添加商品图片,可以调用 Worksheet.Pictures.Add() 将图片插入指定行列位置,再设置图片宽高、列宽行高以及图片与单元格边框的间距。原文示例代码如下:
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. # 创建 Workbook 对象
  4. workbook = Workbook()
  5. # 获取第一个工作表
  6. sheet = workbook.Worksheets[0]
  7. # 插入图片
  8. picture = sheet.Pictures.Add(1, 3, "product.png")
  9. # 设置图片大小
  10. picture.Width = 150
  11. picture.Height = 150
  12. # 调整列宽和行高
  13. sheet.Columns[2].ColumnWidth = 25
  14. sheet.Rows[0].RowHeight = 135
  15. # 设置图片与单元格边框之间的距离
  16. picture.LeftColumnOffset = 90
  17. picture.TopRowOffset = 20
  18. # 保存工作簿
  19. workbook.SaveToFile("InsertImage.xlsx", ExcelVersion.Version2013)
  20. 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 文档为例:
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. # 创建 Workbook 对象
  4. workbook = Workbook()
  5. # 获取第一个工作表
  6. sheet = workbook.Worksheets[0]
  7. # 添加说明文字
  8. sheet.Range["A1"].Text = "产品技术文档"
  9. # 加载用于显示的文件图标
  10. image = Image.FromFile("word_icon.png")
  11. with Stream() as stream:
  12.     image.Save(stream, ImageFormat.get_Png())
  13.     # 将 Word 文件嵌入工作表
  14.     oleObject = sheet.OleObjects.Add(
  15.         "product_manual.docx",
  16.         stream,
  17.         OleLinkType.Embed
  18.     )
  19. # 设置对象位置
  20. oleObject.Location = sheet.Range["B3"]
  21. # 设置对象类型
  22. oleObject.ObjectType = OleObjectType.WordDocument
  23. # 保存工作簿
  24. workbook.SaveToFile("EmbedFile.xlsx", ExcelVersion.Version2016)
  25. workbook.Dispose()
复制代码

执行逻辑是先用 Image.FromFile 读取图标,再把图标保存到 Stream,随后通过 OleObjects.Add 将 product_manual.docx 以 OleLinkType.Embed 方式嵌入工作表。oleObject.Location 指定对象显示在 B3 单元格,ObjectType 要与实际文件类型匹配,因此 Word 文档使用 OleObjectType.WordDocument。保存时示例指定 ExcelVersion.Version2016。若嵌入 PDF 或 PowerPoint,只需更换源文件路径,并把 ObjectType 改为对应类型:
  1. # 嵌入 PDF 文件
  2. oleObject.ObjectType = OleObjectType.AdobeAcrobatDocument
  3. # 嵌入 PowerPoint 文件
  4. oleObject.ObjectType = OleObjectType.PowerPointPresentation
复制代码

四、嵌入与链接的差异
嵌入文件会把源文件数据保存在 Excel 工作簿中。即使原始文件被移动或删除,工作簿通常仍保留嵌入内容,但工作簿体积会增加。链接文件只保存指向外部文件的引用,不完整复制源文件数据,因此体积相对较小,但源文件路径必须有效,移动或删除源文件可能导致链接失效。若要把 Excel 和附件一起发送、不想额外传输源文件,可考虑嵌入;若文件较大或需要独立更新源文件,可考虑链接。

五、常见问题与体积控制
OLE 对象不能保证直接在工作表中预览,通常需要调用本地关联程序打开。双击无法打开时,优先检查本地是否安装了对应应用、ObjectType 是否与实际文件类型一致、链接方式下源文件路径是否仍然有效,以及不同 Excel 版本、操作系统和应用程序对 OLE 对象的兼容差异。生成工作簿后,最好在目标环境的 Excel 中实际双击验证。

文件体积方面,大量高清图片或较大的附件会明显增加工作簿大小,影响保存、传输和打开速度。可以在插入前适当压缩图片,避免使用不必要的高分辨率图片;体积较大的外部文件优先使用链接方式;如果只是让用户查看外部资料,也可以在单元格中添加超链接指向文件位置。

总结:少量图片或附件可以直接用 Excel 自带插入功能;批量生成报表时,Pictures.Add() 更适合把图片写入指定工作表位置,OleObjects.Add() 则用于把 Word、PDF、PowerPoint 等文件作为 OLE 对象嵌入或链接。配合行高列宽、对象类型、链接方式和文件体积控制,可以把图片和附件整合到自动化生成的 Excel 工作簿中。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python批量插入Excel图片与嵌入OLE对象代码实践

感谢分享,这篇把图片插入和 OLE 对象嵌入的代码流程讲得挺清楚,尤其是 Pictures.Add 后配合列宽行高和偏移量控制图片位置,以及 OleObjects.Add 里 fileName、图标流和 linkType 三个关键点,对批量生成报表很实用。我补充几点实践中的注意:批量循环插入图片时最好先统一图片尺寸和单元格行列尺寸,否则容易出现图片压住数据或留白过多;OLE 对象嵌入后工作簿体积会明显增加,如果附件很大,可以按文中思路权衡嵌入和链接,链接模式还要注意源文件路径不能随意移动;图标流和 workbook 最好用 try/finally 或上下文方式确保释放,避免批处理时资源占用;另外保存版本可以根据使用方 Excel 兼容性选择,嵌入 PDF、PPT 时 ObjectType 一定要和实际文件类型匹配。整体思路很适合做成模板脚本,感谢楼主整理。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python批量插入Excel图片与嵌入OLE对象代码实践

楼主这帖整理得很清楚,图片插入和 OLE 对象嵌入两条线都讲到了关键点。Pictures.Add 后配合列宽、行高和偏移量来控制图片位置,确实比只设置宽高更稳妥,批量处理时也不容易压住其他数据。OLE 部分把文件路径、显示图标、嵌入与链接类型以及 ObjectType 的对应关系说明白了,PDF 和 PowerPoint 的替换方式也很直观。嵌入和链接的取舍总结得实用:要连附件一起分发就嵌入,文件较大或需要独立更新就链接。批量场景下按帖子里提到的循环处理、位置尺寸检查和 Dispose 释放资源来做,会更稳一些。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python批量插入Excel图片与嵌入OLE对象代码实践

这篇整理很实用,把插入图片和嵌入 OLE 对象两条路线分得很清楚,关键参数、位置调整和嵌入与链接的差异都讲明白了。批量处理时我会特别注意循环中校验文件路径、对象类型与实际文件匹配,以及保存后及时释放资源;另外嵌入多个文件后工作簿体积会变大,确实需要按场景在嵌入和链接之间做选择。感谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-9 03:31 , Processed in 0.021553 second(s), 29 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部