EasyExcel导出Excel详解

发布时间:2023-05-21

一、EasyExcel简介

EasyExcel是一个基于Java的开源工具,几乎不需要学习就可以编写Excel,生成Excel文件并读取Excel文件。该工具可以帮助用户轻松处理Excel文件,是Apache POI 项目的增强版。 该工具旨在让在Java EE和Spring应用程序中处理Excel表格变得简单。 以下是EasyExcel的一些核心特性:

  • 支持GoogleProtobuf和java的多种标准内容(包括Java8)的转换。
  • 几乎支持所有的Excel常规操作,包括单元格宽度、类型转换、数据格式和多种风格等。
  • 低内存占用。
  • 支持将Excel导出为多种格式,如CSV、HTML、JSON和TSV。

二、EasyExcel的安装及使用方法

使用EasyExcel之前,需要先引入相关的依赖包。可以在pom.xml文件中加入以下代码块即可:

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

EasyExcel提供了丰富的API,可以清楚地表达你想做什么。以下是一个简单的例子:

/**
 * 导出 Excel 例子
 **/
public void exportExcel() throws IOException {
    ServletOutputStream out = response.getOutputStream();
    try {
        response.reset();
        response.setContentType("application/octet-stream;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        // 获取需要导出的数据
        List<DemoData> list = getData();
        EasyExcel.write(out, DemoData.class).sheet("模板").doWrite(list);
    } catch (Exception e) {
        LOGGER.error("导出失败", e);
    } finally {
        out.close();
    }
}

三、EasyExcel的常见用法

1、简单数据导出

EasyExcel提供了一种简单的方法来将集合的数据导出到Excel文档中。以下是一个简单的代码示例:

/**
 * 最简单的导出 Excel 的例子
 **/
@Test
public void simplestWrite() throws IOException {
    String filename = "/Users/alibaba/IdeaProjects/easyexcel/src/test/java/com/alibaba/easyexcel/test/demo/write/simple.xls";
    // 这里需要指定写用哪个 class 去写
    EasyExcel.write(filename, DemoData.class).sheet("模板").doWrite(data());
}

2、复杂报表导出

EasyExcel支持复杂的表格布局和实现自定义样式。以下代码展示了如何使用EasyExcel在单个Excel文档中插入多个Sheet的代码:

/**
 * 复杂报表示例
 **/
public void complexWrite() throws IOException {
    String filename = "/Users/alibaba/IdeaProjects/easyexcel/src/test/java/com/alibaba/easyexcel/test/demo/write/complex.xls";
    OutputStream out = new FileOutputStream(filename);
    try {
        // 这里 需要指定写用哪个 class 去写
        // 如果这里设为null,则代表这个 sheet 只有表头,还没有内容,这提供了一种动态生成 Sheet 的方式
        Sheet sheet1 = new Sheet(1, 0, WriteModel.class, "Sheet1", null);
        sheet1.setTableStyle(createTableStyle());
        // 注册自定义监听器
        this.registerCustomListeners();
        EasyExcel.write(out, WriteModel.class).registerWriteHandler(this.customSheetWriteHandler)
           .registerWriteHandler(this.customSheetWriteHandler2).registerWriteHandler(this.customSheetWriteHandler3)
           .head(createTestListStringHead()).sheet("模板").doWrite(data());
        out.flush();
    } finally {
        // 千万别忘记关闭流
        out.close();
    }
}

3、大量数据导出

随着Excel文件中的数据量的增长,内存的占用量会急剧上升。EasyExcel提供了一种专门优化内存的高效方法,通过将列表分批写入到文档中,以节省大量内存。

/**
 * 大量数据导出(分批次导出)
 **/
public void repeatedWrite() throws IOException {
    String fileName = "/Users/alibaba/IdeaProjects/easyexcel/src/test/java/com/alibaba/easyexcel/test/demo/write/repeatedWrite.xlsx";
    try (OutputStream out = new FileOutputStream(fileName)) {
        ExcelWriter excelWriter = EasyExcel.write(out).head(head()).build();
        WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
        int total = getData().size();
        int count = 100000;
        int round = total % count == 0 ? total / count : total / count + 1;
        for (int i = 0; i < round; i++) {
            List<DemoData> list = getData().stream().skip(i * count).limit(count).collect(Collectors.toList());
            excelWriter.write(list, writeSheet);
            excelWriter.finish();
        }
    } catch (IOException ex1) {
        ex1.printStackTrace();
    }
}

4、Excel数据读取

EasyExcel支持用户将Excel文件反序列化为Java对象,从而可以极大地加速数据处理。EasyExcel自带Map和List读取样式和丰富的数据读取方式。以下代码演示了如何使用EasyExcel对Excel进行读取:

/**
 * 读取Excel示例
 **/
public void readExcel() {
    String filename = "classpath:simple.xlsx";
    // 这里 只要,然后读取第一个sheet 同步返回数据流,需要自己关闭流
    try (InputStream inputStream = FileUtil.getInputStream(filename)) {
        EasyExcel.read(inputStream, DemoData.class, new DemoDataListener()).sheet().doRead();
    } catch (IOException ex1) {
        ex1.printStackTrace();
    }
}

四、小结

EasyExcel是一个十分实用的Java Excel操作工具。它提供了API,能够快速自定义表格样式,用于Java EE和Spring应用程序中处理Excel表格变得简单。在实际应用中,我们可以根据实际需要选择EasyExcel工具对表格进行操作,为数据处理提供极大的方便。