在企业级应用开发中,处理Excel文件是一项常见的需求,无论是数据导出还是导入,都要求高效、稳定且易于维护。阿里巴巴开源的EasyExcel库正是为此目的而生,它极大简化了Java中对Excel的操作,提供了一套简单、高效的API来处理大体积的Excel文件,无需考虑内存溢出等问题。本文将带您了解EasyExcel的使用方法及其核心特性。
1. EasyExcel简介
EasyExcel是一个基于Java的简单、快速、内存友好的读写Excel工具,特别适合处理大数据量的Excel文件。它通过流式读写的方式,有效避免了内存溢出的问题,即便是处理上百万行数据的Excel也能轻松应对。
2. 快速入门
2.1 添加依赖
首先,在Maven项目中添加EasyExcel依赖:
1<dependency>
2 <groupId>com.alibaba</groupId>
3 <artifactId>easyexcel</artifactId>
4 <version>最新版本号</version>
5</dependency>
请替换最新版本号
为实际发布的版本号。
2.2 导出Excel
下面是一个简单的导出示例,演示如何将数据写入Excel文件。
1import com.alibaba.excel.EasyExcel;
2
3import java.util.ArrayList;
4import java.util.List;
5
6public class DemoData {
7 private String sno;
8 private String name;
9 // 省略getter和setter
10}
11
12// 导出数据到Excel
13public class WriteExcel {
14 public static void main(String[] args) {
15 String fileName = "test.xlsx";
16 List<DemoData> list = new ArrayList<>();
17 for (int i = 0; i < 10; i++) {
18 DemoData data = new DemoData();
19 data.setSno(i + "");
20 data.setName("姓名" + i);
21 list.add(data);
22 }
23
24 // 写Excel
25 EasyExcel.write(fileName, DemoData.class).sheet("Sheet1").doWrite(list);
26 }
27}
2.3 读取Excel
读取Excel同样直观简单,通过监听器模式处理每一行数据。
1import com.alibaba.excel.EasyExcel;
2
3public class ReadExcel {
4 public static void main(String[] args) {
5 String fileName = "test.xlsx";
6
7 EasyExcel.read(fileName, DemoData.class, new DataListener()).sheet().doRead();
8 }
9
10 // 数据监听器
11 public static class DataListener extends AnalysisEventListener<DemoData> {
12 @Override
13 public void invoke(DemoData data, AnalysisContext context) {
14 System.out.println("读取到一行数据: " + data);
15 }
16
17 @Override
18 public void doAfterAllAnalysed(AnalysisContext context) {
19 System.out.println("所有数据解析完成");
20 }
21 }
22}
3. 核心特性
- 流式读写:EasyExcel采用流式处理,避免一次性加载整个文件到内存,从而有效处理大规模数据。
- 模板导出:支持根据模板导出Excel,保持表格样式和复杂格式。
- 自定义处理器:通过监听器和处理器,可以灵活定制数据处理逻辑。
- 智能跳过空行:自动识别并跳过Excel中的空行,减少不必要的处理。
- 异常处理:提供详细的异常信息,便于调试和问题定位。
4. 进阶使用
4.1 写操作(导出)
-
EasyExcel.write(String filePath, Class<T> head, Consumer<WriteSheet> writeSheetConsumer):
- 参数说明:
filePath
: Excel文件保存的路径。head
: Excel表头对应的实体类Class类型。writeSheetConsumer
: Sheet配置的消费者,可以设置Sheet名称、列宽等。
- 示例:
1EasyExcel.write(fileName, DemoData.class) 2 .sheet("Sheet1") // 设置Sheet名称 3 .doWrite(dataList); // 写入数据
- 参数说明:
-
EasyExcel.write(String filePath, WriteHandler... writeHandlers):
- 参数说明:
writeHandlers
: 自定义的写处理器,用于处理复杂的写逻辑,如自定义样式、公式等。
- 示例:
1EasyExcel.write(fileName, DemoData.class) 2 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自动调整列宽 3 .sheet("Sheet1") 4 .doWrite(dataList);
- 参数说明:
4.2 读操作(导入)
-
EasyExcel.read(String filePath, Class<T> head, AnalysisEventListener<T> listener):
- 参数说明:
filePath
: 待读取的Excel文件路径。head
: 表示每行数据对应的实体类类型。listener
: 数据读取监听器,用于处理读取到的每一行数据。
- 示例:
1EasyExcel.read(fileName, DemoData.class, new DemoDataListener()) 2 .sheet() // 默认读取第一个Sheet 3 .doRead();
- 参数说明:
-
EasyExcel.read(String filePath, ReadListener<T> readListener):
- 参数说明:
readListener
: 更通用的数据读取监听器,不绑定实体类。
- 示例:
1EasyExcel.read(fileName, new AnalysisEventListener<DemoData>() { 2 // 实现invoke和doAfterAllAnalysed方法 3}).sheet().doRead();
- 参数说明:
4.3 其他常用方法
- registerWriteHandler(WriteHandler writeHandler): 注册写处理器,用于自定义写操作的行为,如样式、数据处理等。
- registerReadListener(ReadListener<T> readListener): 在读操作中注册读监听器。
- sheet(String sheetName): 指定读或写的Sheet名称。
- sheet(int sheetIndex): 指定读或写的Sheet索引。
- doWrite(Collection<T> data): 执行写操作,传入要写入的数据集合。
- doRead(): 执行读操作。