您的位置:

EasyExcel导出Excel详解

一、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工具对表格进行操作,为数据处理提供极大的方便。