介绍
EasyExcel是阿里巴巴开源的Java Excel处理工具库,用于快速读写Excel文件(.xlsx 和 .xls)。相比ApachePOI,它更轻量、速度更快、内存占用更低,适合处理大数据量 Excel 文件。
常见使用场景
-
导出 Excel(实体类+注解 或 动态列)
-
导入 Excel(带校验/转换)
-
支持多 Sheet 导入导出
-
基于模板导出(支持填充)
-
大数据量 Excel 处理
快速上手示例
Maven的引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version> <!-- 请查找最新版本 -->
</dependency>
简单方式的使用(实体类+注解 )
1. 导出 Excel
@Data
public class UserData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
}
@ExcelProperty 是 EasyExcel 中用于 标注 Excel 列信息 的注解,常用于实体类字段上,指定 Excel 表头的名称、顺序、格式转换等。
设置的参数:
@ExcelProperty(value = "列名", index = 列索引, converter = 转换器.class)
List<UserData> list = new ArrayList<>();
list.add(new UserData("张三", 20));
list.add(new UserData("李四", 25));
EasyExcel.write("user.xlsx", UserData.class)
.sheet("用户信息")
.doWrite(list);
2. 读取 Excel
public class UserDataListener extends AnalysisEventListener<UserData> {
@Override
public void invoke(UserData data, AnalysisContext context) {
System.out.println("读取到数据: " + data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("读取完毕");
}
}
EasyExcel.read("user.xlsx", UserData.class, new UserDataListener())
.sheet()
.doRead();
基于模板导出
- 先准备一个带占位符的 Excel 模板(
.xlsx
文件) - 占位符变量使用
${变量名}
或{变量名}
的形式。 - 放入到需要导入项目中的src/main/resources目录下
// 生成唯一文件名
File outputFile = new File(System.getProperty("java.io.tmpdir"), "自己的文件名称");
// getClass():当前类;
// getClassLoader():拿到这个类的类加载器(通常是 AppClassLoader);
// getResourceAsStream("xxx"):从 classpath 根路径开始寻找 xxx 文件,并以流的形式返回。
try (InputStream exportTemplate = getClass().getClassLoader().getResourceAsStream("xxx")) {
try (ExcelWriter excelWriter = EasyExcel.write(outputFile)
.withTemplate(exportTemplate)
.registerWriteHandler(new HighlightNumberHandler(sheetIndex))
.build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().sheetName(sheetName).build();
excelWriter.fill(map, writeSheet);
excelWriter.fill(new FillWrapper("z", basicSettlementData), writeSheet);
}
} catch (IOException e) {
log.error("导出文件流异常", e);
throw new RuntimeException("导出文件流异常", e);
} catch (NotOfficeXmlFileException e) {
log.error("模板文件格式错误,必须为 XLSX 格式", e);
throw new RuntimeException("模板文件格式错误,请检查是否为有效的 Excel 文件");
}
✅ 含义说明:
代码 | 含义 |
---|---|
EasyExcel.write(outputFile) | 指定最终导出文件的输出路径(或输出流) |
.withTemplate(exportTemplate) | 指定 Excel 模板(.xlsx 文件),一般来自 InputStream 或路径 |
.registerWriteHandler(...) | 注册写处理器,例如设置样式、合并单元格等 |
.build() | 构建一个 ExcelWriter 实例,用于后续数据填充 |
map | 一个 Map<String, Object> 类型,用于填充 ${key} 形式的 普通变量 |
fill() | 将 map 中的值填充到模板中 ${变量} 占位符的位置 |
writeSheet | 指定在哪个 Sheet 中填充 |
如果存在多个sheet(模版有多个,导出只保留一个)
FileInputStream fis = new FileInputStream("模版")
XSSFWorkbook poiWorkbook = new XSSFWorkbook(fis);
String sheetName = poiWorkbook.getSheetName(int index);
// 删除多余的sheet
for (int i = poiWorkbook.getNumberOfSheets() - 1; i >= 0; i--) {
if (!poiWorkbook.getSheetName(i).equals(sheetName)) {
poiWorkbook.removeSheetAt(i);
}
}
该段代码的目的是:
打开一个 Excel 模板文件,只保留其中名为
sheetName
的 Sheet,其它所有 Sheet 都删除。