
在处理各类 Excel 数据报表时,批注常被用来补充说明、给出修改建议或标注关键信息。为了让这些提示更加直观清晰,我们有时会在批注中设置背景图片。然而,当需要再次使用这些图片或将其保存到本地时,手动提取往往步骤繁琐、效率低下。本文将详细讲解如何使用 Java 提取 Excel 批注中的图片,既包括获取指定批注的背景图,也涵盖批量提取所有批注背景图的实现方式,帮助你省去重复的手动操作,提升处理 Excel 文件的效率。
一、 环境准备
在进入今天的正题之前,我们需要确保开发环境已经就绪。
核心库选型:我们选用 Spire.XLS for Java,这是是一款功能强大的独立 Excel 组件,无需在服务器上安装 Microsoft Office 就能轻松完成多种 Excel 文件相关的处理任务,且对批注对象的属性支持非常完备。
依赖配置:如果你使用 Maven,请在 pom.xml 中添加下方代码,自动导入 Spire.XLS 到项目中。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.1.3</version>
</dependency>
</dependencies>
还可以下载 Spire.XLS 安装包,解压后进行手动安装。
- 测试素材:本文使用了一份内容为北美人口数量前十国家的 Excel 文件,并在部分单元格中插入带有背景图片的批注。以下为素材文档图示:

二、Java 提取指定单元格的批注背景图
在很多特定的业务场景中,添加批注图片时通常选择存放在固定的位置,例如:报表右上角的核验章或特定行的备注。此时,我们不需要遍历全表,而是通过获取指定单元格的方式,精准实现 Excel 批注背景图片提取。
实现思路与步骤
- 创建 Workbook 类对象,并使用 Workbook.loadDFromFile() 方法加载素材文件。
- 使用 Workbook.getWorksheets().get() 方法获取一个工作表。
- 使用 Worksheet.getRange().get() 方法获取指定名称的单元格。
- 使用 CellRange.getComment() 方法获取该单元格关联的批注对象。
- 通过 ExcelComment.getComment().getFill().getPicture() 方法获取批注中的背景图片。
- 通过 ImageIO.write() 方法将提取出的图片保存到本地。
完整代码展示:获取单元格 A2 批注中的背景图
import com.spire.xls.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ExtractComment {
public static void main(String[] args)throws IOException {
// 加载 Excel 文档
Workbook wb = new Workbook();
wb.loadFromFile("/input/示例文档.xlsx");
// 获取工作表
Worksheet sheet = wb.getWorksheets().get(0);
// 获取指定单元格中的批注背景图片
BufferedImage image = (BufferedImage) sheet.getRange().get("A2").getComment().getFill().getPicture();
ImageIO.write(image,"png",new File("/output/ExtractedImages.png"));
}
}
获取到的 Excel 批注图片如下:

三、Java 批量提取工作表中的所有批注图
当 Excel 文件中包含大量图片批注,且这些批注分散在不同单元格中时,手动指定单元格的方式就显得效率低下,也缺乏可维护性。此时,更快捷做法是遍历工作表中的所有单元格,逐一判断是否存在批注,并进一步检查批注中是否包含背景图片。在完成这些条件判断的基础上,即可统一收集、提取和批量保存 Excel 批注图片,实现一键式处理。
实现思路与步骤
- 创建 Workbook 类对象,并使用 Workbook.loadFromFile() 方法加载 Excel 文件。
- 通过 Workbook.getWorksheets().get() 方法获取指定的工作表。
- 调用 Worksheet.getComments().getCount() 遍历工作表中的所有批注,并判断批注是否包含背景图片。
- 使用 ExcelComment.getFill().getPicture() 方法获取当前批注中的图片对象。
- 通过 ExcelComment.getRow() 和 ExcelComment.getColumn() 方法获取批注所在的行号和列号,并将其转换为对应的 Excel 单元格地址。
- 使用 ImageIO.write() 方法将提取到的批注图片保存到本地文件。
代码示例:获取素材中的所有批注图片
import com.spire.xls.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ExtractComment {
public static void main(String[] args) throws IOException {
// 指定文件输入输出路径
String inputFile = "/input/示例文档.xlsx";
String outputDir = "/output/commentpic/";
// 加载文档
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
// 获取第一个工作表
Worksheet sheet = wb.getWorksheets().get(0);
// 遍历批注
for (int i = 0; i < sheet.getComments().getCount(); i++) {
ExcelComment comment = sheet.getComments().get(i);
// 检查批注是否包含背景图片
if (comment.getFill() != null && comment.getFill().getPicture() != null) {
BufferedImage image = (BufferedImage) comment.getFill().getPicture();
// 获取批注所在的行列
int row = comment.getRow();
int col = comment.getColumn();
// 转换为 Excel 单元格地址(如 H2)
String cellAddress = getCellName(row, col);
String fileName = "CommentImage_" + cellAddress + ".png";
// 保存图片
ImageIO.write(image, "png", new File(outputDir + fileName));
}
}
}
// 将行号和列号转换为 Excel 单元格地址(如 2, 8 -> H2)
private static String getCellName(int row, int col) {
StringBuilder columnAddress = new StringBuilder();
int tempCol = col;
while (tempCol > 0) {
tempCol--;
columnAddress.insert(0, (char) ('A' + (tempCol % 26)));
tempCol /= 26;
}
return columnAddress.toString() + row;
}
}
获取到的批注图片结果如图所示:

提示:在完成批注图片提取后,某些场景下可能还需要对 Excel 中的批注显示状态进行控制,例如在导出或共享文档前临时隐藏批注。如果你有类似需求,可以参考《Java 如何设置 Excel 批注隐藏或显示》,进一步了解如何通过 Java 灵活管理批注状态。
四、 应用场景
掌握了 Excel 批注图片的提取技术后,我们可以将其应用于多种复杂的业务自动化场景中。
- 自动化素材归档与命名
在电商或外贸行业,业务员常将产品图存放在 Excel 批注中,而产品编号(例如 SKU)则写在同行的另一列。通过将提取出的图片直接命名为 SKU_001.png,实现图片+数据的自动关联归档,省去了后期人工核对重命名的繁琐步骤。
- 报表附件的批量离线化
许多审计或工程监理报表利用批注存放现场照片。通过一键提取所有工作表中的批注图,并按工作表名称建立子文件夹分类存储,可以将复杂的 Excel 转化为清晰的文件夹结构,便于离线备份和传阅。
- 多版本文档的视觉内容对比
在设计校对或翻译稿更新时,批注图片往往代表修改建议。利用程序自动提取新旧两个版本相同坐标下的图片进行排布对比,可以快速识别更新,大幅提升人工审阅的效率。
- 系统集成与数据迁移
在旧系统向云端迁移时,通过 ETL 脚本 自动提取 Excel 中的批注图并同步上传至对象存储(如 OSS),同时将返回的 URL 写入数据库,实现了图像数据的自动化迁移。
五、 结语
通过以上示例可以看到,借助 Java,我们可以轻松实现 Excel 批注图片的提取,无论是针对单个批注,还是批量处理整个工作表,都无需依赖繁琐的手动操作。这种方式不仅提升了处理效率,也让 Excel 数据的重复利用变得更加灵活。如果你在实际项目中对 Excel 文件的读写、转换或内容提取有更复杂的需求,Spire.XLS for Java 都能提供稳定而高效的解决方案。如需了解更多产品信息或获取技术支持,欢迎随时联系我们。







