使用 Python 在 Excel 中添加和管理图片

Excel 报表里经常需要插入图片:公司 Logo、产品效果图、电子签名、扫描件缩略图等。图片不仅要有内容,还要落在合适的单元格、大小合适、不挤压周围数据。当一批报表都要加上相同的 Logo,或者需要从模板里清理掉旧图片再换上新图时,手动操作既慢又容易出错。

本文以 Spire.XLS for Python 为例,介绍如何在指定单元格插入图片、调整图片在单元格内的偏移、读取图片的位置和尺寸、压缩图片以减小文件体积,以及批量删除工作表中的图片。

环境准备

安装 Spire.XLS 库:

bash 复制代码
pip install Spire.XLS

在脚本中引入模块:

python 复制代码
from spire.xls import *
from spire.xls.common import *

在指定单元格插入图片

Worksheet.Pictures.Add() 把图片插入到某个单元格位置,前两个参数是行号和列号,第三个是图片路径:

python 复制代码
workbook = Workbook()
workbook.LoadFromFile("报表.xlsx")
sheet = workbook.Worksheets[0]

# 在第 14 行第 5 列(即 E14)插入图片
sheet.Pictures.Add(14, 5, "logo.png")

workbook.SaveToFile("插入图片.xlsx", ExcelVersion.Version2010)
workbook.Dispose()

图片默认以原始尺寸插入,左上角对齐到指定单元格。如果图片比单元格大,会覆盖相邻区域。要避免覆盖,可以先调整目标列宽和行高,再插入图片。

调整图片在单元格内的偏移

插入后可以通过 LeftColumnOffset 和 TopRowOffset 微调图片在单元格内的位置,让图片与单元格边框保持一定间距:

python 复制代码
workbook = Workbook()
sheet = workbook.Worksheets[0]

sheet.Range["A1"].Text = "单元格内对齐图片:"
sheet.Range["A1"].Style.VerticalAlignment = VerticalAlignType.Top

picture = sheet.Pictures.Add(1, 1, "logo.png")

# 拉宽列、拉高行,让单元格容纳图片
sheet.Columns[0].ColumnWidth = 40
sheet.Rows[0].RowHeight = 200

# 在单元格内偏移图片
picture.LeftColumnOffset = 100
picture.TopRowOffset = 25

workbook.SaveToFile("对齐图片.xlsx", ExcelVersion.Version2013)
workbook.Dispose()

LeftColumnOffset 是相对于单元格左边界的水平偏移,TopRowOffset 是相对于单元格上边界的垂直偏移,单位为像素。配合 ColumnWidth 和 RowHeight 先把单元格撑大,再用偏移把图片放到合适的位置,就能实现"图片在单元格内居中或留白"的效果。

读取图片的位置和尺寸

已经存在于工作表中的图片,可以通过 Pictures 集合按索引取出,再读取它的位置和大小:

python 复制代码
workbook = Workbook()
workbook.LoadFromFile("带图片.xlsx")
sheet = workbook.Worksheets[0]

picture = sheet.Pictures[0]
left = picture.Left
top = picture.Top
width = picture.Width
height = picture.Height

print(f"Left={left}, Top={top}, Width={width}, Height={height}")

workbook.Dispose()

Left 和 Top 是图片在工作表中的绝对坐标,Width 和 Height 是图片的显示尺寸。这些值在需要把图片对齐到某个区域、或者判断图片是否越出打印范围时很有用。

压缩图片

插入高分辨率图片会让 Excel 文件体积迅速膨胀。Compress() 方法按指定质量压缩工作表中的图片,参数是 0 到 100 的整数,数值越小压缩率越高:

python 复制代码
workbook = Workbook()
workbook.LoadFromFile("大图片.xlsx")

for sheet in workbook.Worksheets:
    for picture in sheet.Pictures:
        picture.Compress(50)

workbook.SaveToFile("压缩图片.xlsx", ExcelVersion.Version2010)
workbook.Dispose()

外层循环遍历所有工作表,内层循环遍历每张表里的图片。Compress(50) 把每张图片压缩到 50% 质量。对于只需要在屏幕上查看的报表,50 通常足够;需要打印的报表可以用 75 保留更多细节。

删除工作表中的图片

清理模板里的旧图片,或者去掉不需要的插图,可以遍历 Pictures 集合逐个移除:

python 复制代码
workbook = Workbook()
workbook.LoadFromFile("模板.xlsx")
sheet = workbook.Worksheets[0]

# 倒序遍历,避免删除后索引错位
for i in range(sheet.Pictures.Count - 1, -1, -1):
    sheet.Pictures[i].Remove()

workbook.SaveToFile("删除图片.xlsx", ExcelVersion.Version2013)
workbook.Dispose()

删除时要从后往前遍历。每次 Remove() 之后集合长度会减一,正序遍历会导致索引越界或跳过某些图片。倒序循环可以安全地清空整张表的图片。

实用提示

  • 插入图片前先设置好目标单元格的列宽和行高,可以避免图片覆盖相邻数据。
  • LeftColumnOffset 和 TopRowOffset 的单位是像素,而 ColumnWidth 的单位是字符宽度,两者不要混用。
  • 压缩图片会改变图片数据本身,属于有损操作;如果原始图片需要保留,先备份再压缩。
  • 批量插入同一张 Logo 到多个工作表时,把 Pictures.Add() 放进 for sheet in workbook.Worksheets 循环即可。
  • 处理完调用 workbook.Dispose() 释放资源。

总结

本文介绍了用 Python 在 Excel 中处理图片的常用操作:用 Pictures.Add() 在指定单元格插入图片,用 LeftColumnOffset 和 TopRowOffset 微调位置,通过 Left/Top/Width/Height 读取图片的位置和尺寸,用 Compress() 压缩图片减小文件体积,以及倒序遍历 Pictures 集合批量删除图片。把这些操作组合进报表生成脚本,图片的插入和维护也可以完全自动化。

相关推荐
mldong1 小时前
同一个审批流引擎,我写了两次:一次 11226 行,一次 7036 行
后端·架构
百万蹄蹄向前冲1 小时前
一张平面图把学校做成2D游戏
前端·人工智能·后端
沙蒿同学1 小时前
一个人做完一套企业级系统,赚到了第一个 1000 块
vue.js·后端·go
机器之心1 小时前
突发:Claude自主发现未知生物系统,或能编辑基因
前端·人工智能·后端
小小张说故事1 小时前
pytest 入门指南:Python 自动化测试的标配工具
python·机器学习
码事漫谈1 小时前
AI巨头集体喊“慢”,但谁都不敢先踩刹车
后端
double_face1 小时前
AgentScope 2.0 源码解析系列(Java 版)|第 3 篇:State 模块,Agent 靠什么记住这轮对话
后端·面试
用户6802659051191 小时前
企业电脑统一管理怎么做?2026企业终端统一管理方法与工具推荐
javascript·后端·面试
青Cheng序员石头1 小时前
失控之前 | AI 安全到底在保护什么?
后端·安全·aigc