在自动化报表生成、数据可视化或办公流程优化中,经常需要在 excel 文件中嵌入图表、公司 logo、产品图片等图像元素。同时,在某些场景下(如模板清理或隐私 处理),也可能需要移除已存在的图片。借助 python 的强大生态,我们可以高效地实现这些操作。
本文将详细介绍如何使用 openpyxl(适用于 .xlsx 格式)和 xlwings(支持与 excel 应用交互)两种主流库,在 excel 中添加图片和删除图片,并提供可直接运行的示例代码。
一、准备工作
安装依赖库
# openpyxl:纯 python 操作 excel,无需安装 excel 软件 pip install openpyxl pillow # xlwings:需本地安装 microsoft excel(windows/macos) pip install xlwings
注意:pillow 是 openpyxl 处理图片所必需的图像库。
二、方法一:使用 openpyxl 插入图片(推荐用于无交互场景)
openpyxl 支持在指定单元格位置插入图片,并可设置偏移、锚定方式等。
示例:向 excel 插入图片
from openpyxl import workbook
from openpyxl.drawing.image import image
# 创建新工作簿或加载现有文件
wb = workbook()
ws = wb.active
# 加载图片(支持 png、jpg、bmp 等)
img = image("logo.png")
# 可选:调整图片尺寸(单位为像素)
img.width = 150
img.height = 100
# 将图片锚定到 a1 单元格(左上角对齐)
ws.add_image(img, "a1")
# 保存文件
wb.save("with_image.xlsx")
print("图片已成功插入 excel!")
高级用法:精确控制位置
若需更精细控制(如偏移量),可使用 anchormarker:
from openpyxl.drawing.spreadsheet_drawing import onecellanchor, anchormarker from openpyxl.utils.units import pixels_to_emu # 创建锚点:从 b2 单元格开始,右偏移 10 像素,下偏移 5 像素 col = 1 # b 列(从 0 开始计数) row = 1 # 第 2 行(从 0 开始) x_offset = pixels_to_emu(10) y_offset = pixels_to_emu(5) marker = anchormarker(col=col, coloff=x_offset, row=row, rowoff=y_offset) anchor = onecellanchor(_from=marker, ext=img._size) ws._images.append(img) ws.drawing.anchor.append(anchor)
注意:openpyxl 不支持删除已有图片。它只能在新建或加载的工作表中添加新图片,无法识别或移除原始文件中的图像。
三、方法二:使用 xlwings 插入与删除图片(支持完整 crud)
xlwings 通过调用本地 excel 应用程序,能读取、修改甚至删除工作表中的所有对象,包括图片。
示例 1:插入图片
import xlwings as xw
app = xw.app(visible=false) # 后台运行 excel
wb = app.books.open("report.xlsx")
ws = wb.sheets["sheet1"]
# 在 a1 单元格左上角插入图片
ws.pictures.add("chart.jpg", left=ws.range("a1").left, top=ws.range("a1").top)
wb.save("report_with_image.xlsx")
wb.close()
app.quit()
print("图片已插入!")
示例 2:删除所有图片
import xlwings as xw
app = xw.app(visible=false)
wb = app.books.open("report_with_image.xlsx")
ws = wb.sheets["sheet1"]
# 删除当前工作表中的所有图片
for pic in ws.pictures:
pic.delete()
wb.save("cleaned_report.xlsx")
wb.close()
app.quit()
print("所有图片已删除!")
示例 3:按名称删除特定图片
# 假设图片名为 "logo"
if "logo" in [p.name for p in ws.pictures]:
ws.pictures["logo"].delete()
优点:
- 支持插入、删除、移动、重命名图片。
- 可获取图片位置、大小等属性。
- 兼容 excel 原生格式(包括 .xls 和 .xlsx)。
缺点:
- 必须安装 microsoft excel。
- 仅支持 windows 和 macos,不适用于 linux 服务器环境。
- 进程管理需谨慎(避免 excel 进程残留)。
四、对比总结
| 功能 | openpyxl | xlwings |
|---|---|---|
| 插入图片 | ✅ | ✅ |
| 删除图片 | ❌ | ✅ |
| 无需 excel 软件 | ✅ | ❌ |
| 支持 linux | ✅ | ❌ |
| 性能(大批量) | 高 | 中(依赖 excel 进程) |
| 精细控制(偏移/缩放) | 有限 | 强大 |
五、最佳实践建议
- 生成新报表:优先使用
openpyxl,轻量且跨平台。 - 编辑现有文件(含删图) :使用
xlwings,功能全面。 - 生产环境部署:若在 linux 服务器运行,只能选择
openpyxl;windows 服务器可考虑xlwings(但需安装 excel)。 - 异常处理:使用
xlwings时务必用try...finally确保app.quit()被调用,防止进程泄漏。
结语
通过 python 操作 excel 中的图片,不再是繁琐的手动任务。无论是自动嵌入分析图表,还是批量清理敏感图像,openpyxl 和 xlwings 都提供了强大而简洁的解决方案。根据你的运行环境和功能需求选择合适的工具,即可轻松实现 excel 图像的自动化管理,大幅提升办公效率与系统智能化水平。
到此这篇关于python实现在excel中动态插入与删除图片的完整指南的文章就介绍到这了,更多相关python excel插入与删除图片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论