杰瑞科技汇

Java如何读取Excel中的图片?

Java 读取 Excel 中的图片

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

Java如何读取Excel中的图片?-图1
(图片来源网络,侵删)

使用 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("所有图片读取完成");
        }
    }
}

注意事项

  1. Excel 版本

    • .xls (HSSF) 格式支持有限
    • .xlsx (XSSF) 格式支持更好
  2. 图片位置

    • POI 需要遍历每个单元格检查是否有图片
    • EasyExcel 可以通过监听器直接获取图片数据
  3. 性能考虑

    • 大文件处理时注意内存使用
    • 可以考虑流式处理
  4. 图片格式

    • 支持常见格式: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 文件中的图片,根据你的具体需求选择最适合的方案。

分享:
扫描分享到社交APP
上一篇
下一篇