Java Excel 导入图片指南
在Java中处理Excel文件并导入图片,可以使用Apache POI库,以下是几种常见的方法:

使用Apache POI读取Excel中的图片
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); // 获取第一个工作表
// 获取所有图片
List<XSSFPictureData> pictures = ((XSSFWorkbook) workbook).getAllPictures();
for (XSSFPictureData picture : pictures) {
byte[] pictureData = picture.getData();
String format = picture.suggestFileExtension();
// 这里可以保存图片到文件或进行其他处理
System.out.println("Found image with format: " + format + ", size: " + pictureData.length);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
将图片插入到Excel中
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelImageWriter {
public static void main(String[] args) {
try (Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet("ImageSheet");
// 创建绘图对象
Drawing<?> drawing = sheet.createDrawingPatriarch();
// 创建锚点(左上角和右下角坐标)
ClientAnchor anchor = sheet.getWorkbook().getCreationHelper()
.createClientAnchor();
// 设置图片位置(行和列)
anchor.setCol1(1); // 第2列
anchor.setRow1(1); // 第2行
anchor.setCol2(3); // 第4列
anchor.setRow2(5); // 第6行
// 读取图片文件
byte[] pictureData = ImageUtils.getImageBytes("path/to/image.png");
// 添加图片到工作表
int pictureIndex = workbook.addPicture(pictureData,
Workbook.PICTURE_TYPE_PNG);
// 创建图片并关联到锚点
Picture picture = drawing.createPicture(anchor, pictureIndex);
// 调整图片大小以适应单元格
picture.resize();
// 写入Excel文件
try (FileOutputStream fos = new FileOutputStream("output.xlsx")) {
workbook.write(fos);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用EasyExcel(阿里巴巴开源库)
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.metadata.holder.ReadHolder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class EasyExcelImageReader {
public static void main(String[] args) {
String fileName = "example.xlsx";
ExcelReaderBuilder readerBuilder = EasyExcel.read(fileName);
readerBuilder.registerReadListener(new AnalysisEventListener<Object>() {
@Override
public void invoke(Object o, AnalysisContext analysisContext) {
// 处理每一行数据
ReadHolder readHolder = analysisContext.readHolder();
// 可以通过readHolder获取图片等信息
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 读取完成后的操作
}
});
readerBuilder.sheet().doRead();
}
}
注意事项
- 图片格式:POI支持PNG、JPG、DIB等常见图片格式
- 性能考虑:处理大量图片时注意内存使用
- Excel版本:
.xlsx格式使用XSSFWorkbook,.xls格式使用HSSFWorkbook - 图片位置:图片通常与特定单元格关联,但也可以浮动在单元格上方
- EasyExcel限制:EasyExcel对图片的支持不如POI全面
常见问题解决
- 图片不显示:检查图片格式是否受支持,确保使用正确的API
- 内存溢出:处理大文件时考虑使用SXSSFWorkbook(流式API)
- 图片位置偏移:调整ClientAnchor的坐标参数
方法可以根据您的具体需求选择使用,POI提供了最全面的功能,而EasyExcel在简单场景下更易用。

