Java EasyExcel 导出带图片

简介

EasyExcel 是一个 Java 的开源项目,用于实现 Excel 文件的读写操作。它是 Alibaba 开源的一款简单易用、高性能、功能强大的 Java Excel 操作工具,可以方便地实现 Excel 文件的导入导出,同时支持复杂的表格样式、大数据量的读写操作。本文将介绍如何使用 EasyExcel 导出带有图片的 Excel 文件。

准备工作

在开始之前,我们需要在项目中引入 EasyExcel 的依赖。可以通过 Maven 将其添加到项目的 pom.xml 文件中:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.4.0</version>
</dependency>

导出带图片的 Excel 文件

下面我们将使用 EasyExcel 导出带有图片的 Excel 文件。首先,我们需要创建一个实体类,用于存储导出的数据:

public class User {
    private String name;
    private String avatar;

    // 省略 getter 和 setter 方法
}

在这个实体类中,我们定义了两个字段:nameavatar。其中,avatar 字段存储了用户的头像图片路径。

接下来,我们创建一个导出工具类,用于生成 Excel 文件:

public class ExcelExporter {
    public static void export(List<User> userList, String filePath) {
        ExcelWriter excelWriter = null;

        try {
            excelWriter = EasyExcel.write(filePath).build();

            WriteSheet writeSheet = EasyExcel.writerSheet(0).build();

            // 写入表头
            List<List<String>> head = new ArrayList<>();
            head.add(Arrays.asList("姓名", "头像"));
            excelWriter.write(head, writeSheet);

            // 写入数据
            List<List<Object>> data = new ArrayList<>();
            for (User user : userList) {
                List<Object> row = new ArrayList<>();
                row.add(user.getName());
                row.add(user.getAvatar());
                data.add(row);
            }
            excelWriter.write(data, writeSheet);

            // 写入图片
            for (int i = 0; i < userList.size(); i++) {
                User user = userList.get(i);
                String avatarPath = user.getAvatar();

                if (StringUtils.isNotBlank(avatarPath)) {
                    File avatarFile = new File(avatarPath);
                    if (avatarFile.exists()) {
                        BufferedImage image = ImageIO.read(avatarFile);

                        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                        ImageIO.write(image, "jpg", byteArrayOutputStream);

                        ByteArrayOutputStream out = new ByteArrayOutputStream();
                        try (OutputStream outputStream = new FileOutputStream(filePath)) {
                            ImageIO.write(image, "jpg", outputStream);

                            WriteImage writeImage = new WriteImage(byteArrayOutputStream.toByteArray(),
                                    WriteImageType.JPG);
                            writeImage.setSheetNo(0);
                            writeImage.setStartCol(1);
                            writeImage.setStartRow(i + 1);
                            writeImage.setEndCol(1);
                            writeImage.setEndRow(i + 1);

                            excelWriter.writeImage(writeImage, writeSheet);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }
}

在这个工具类中,我们通过 EasyExcel 创建了一个 ExcelWriter 对象,并使用 EasyExcel.writerSheet(0).build() 创建了一个 WriteSheet 对象。

然后,我们创建了一个 head 列表,包含了 Excel 表格的表头信息。接着,我们通过循环遍历 userList 数据,将数据填充到 data 列表中。同时,我们使用 ImageIO 类读取用户头像图片,并将图片数据写入到 Excel 文件中。

最后,我们通过调用 excelWriter.finish() 方法,将 Excel 文件写入到磁盘。

示例

下面我们通过一个示例演示如何使用 EasyExcel 导出带有图片的 Excel 文件。首先,我们创建一个包含用户数据的列表:

List<User> userList = new ArrayList<>();
userList.add(new User("Alice", "path/to/avatar1.jpg"));
userList.add(new User("Bob", "path/to/avatar2.jpg"));

然后,我们调用 ExcelExporter.export(userList, "path/to/output.xlsx") 方法,将用户数据导出到 Excel 文件中:

ExcelExporter.export(userList, "path/to/output.xlsx");

最后,我们可以在指定的路径下找到生成的 Excel 文件。

总结

通过 EasyExcel,我们可以方