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