Java 读取 Excel 中的图片
在 Java 中读取 Excel 文件中的图片,可以使用 Apache POI 或 EasyExcel 等库,以下是几种实现方式:

使用 Apache POI 读取 Excel 图片
Apache POI 提供了读取 Excel 中图片的功能,但实现相对复杂。
Maven 依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
示例代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class ExcelImageReader {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.xlsx");
Workbook workbook = new XSSFWorkbook(fis)) {
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() == CellType.PICTURE) {
// 获取图片数据
XSSFPictureData pictureData = (XSSFPictureData) workbook.getAllPictures().get(cell.getPictureIndex());
byte[] imageBytes = pictureData.getData();
// 保存图片到文件
String fileName = "image_" + row.getRowNum() + "_" + cell.getColumnIndex() + ".png";
Files.write(Paths.get(fileName), imageBytes);
System.out.println("图片已保存: " + fileName);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 EasyExcel 读取 Excel 图片
EasyExcel 是阿里巴巴开源的 Excel 处理库,对图片读取支持更友好。
Maven 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
示例代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.data.ImageData;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class EasyExcelImageReader {
public static void main(String[] args) {
String fileName = "example.xlsx";
EasyExcel.read(fileName, new ImageDataListener()).sheet().doRead();
}
public static class ImageDataListener extends AnalysisEventListener<ImageData> {
@Override
public void invoke(ImageData imageData, AnalysisContext context) {
// 获取图片数据
byte[] imageBytes = imageData.getImage();
// 获取图片在Excel中的位置
int rowIndex = context.readRowHolder().getRowIndex();
int columnIndex = context.readRowHolder().getHeadMap().getOrDefault("图片", -1);
// 保存图片
String fileName = "easy_image_" + rowIndex + "_" + columnIndex + ".png";
try (FileOutputStream fos = new FileOutputStream(fileName)) {
fos.write(imageBytes);
System.out.println("图片已保存: " + fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("所有图片读取完成");
}
}
}
注意事项
-
Excel 版本:
.xls(HSSF) 格式支持有限.xlsx(XSSF) 格式支持更好
-
图片位置:
- POI 需要遍历每个单元格检查是否有图片
- EasyExcel 可以通过监听器直接获取图片数据
-
性能考虑:
- 大文件处理时注意内存使用
- 可以考虑流式处理
-
图片格式:
- 支持常见格式:PNG, JPEG, BMP 等
- 可以通过
pictureData.suggestFileExtension()获取推荐扩展名
高级用法
如果需要更精确地控制图片读取(如获取图片位置、大小等),可以使用以下方法:
// 使用 POI 获取更详细的图片信息
for (POIImageInfo imageInfo : sheet.getImages()) {
int pictureIndex = imageInfo.getImageIndex();
XSSFPictureData pictureData = (XSSFPictureData) workbook.getAllPictures().get(pictureIndex);
byte[] imageBytes = pictureData.getData();
// 获取图片位置和大小
Rectangle2D anchor = imageInfo.getAnchor();
double x = anchor.getX();
double y = anchor.getY();
double width = anchor.getWidth();
double height = anchor.getHeight();
System.out.printf("图片位置: (%.1f, %.1f), 大小: %.1f x %.1f%n", x, y, width, height);
}
方法可以帮助你在 Java 中读取 Excel 文件中的图片,根据你的具体需求选择最适合的方案。
