两种读对象的方式
- 确定表头:建立对象,和表头形成映射关系。
- 不确定表头:每一行数据映射为
Map<String, Object>
,比如用户自己上传的表格。
两种读取模式
- 监听器:先创建监听器、在读取文件时绑定监听器。单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。
- 同步读:无需创建监听器,一次性获取完整数据。方便简单,但是数据量大时会有等待时长,造成卡顿,也可能出现内存溢出。
Easy Excel 基本使用
Easy Excel官网
- 导入依赖
<!-- easy Excel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
- 需要读取的类对象:
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class TableUserInfo {
@ExcelProperty("用户编号")
private String userCode;
@ExcelProperty("用户昵称")
private String username;
}
- 读取监听器
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TableListener implements ReadListener<TableUserInfo> {
@Override
public void invoke(TableUserInfo data, AnalysisContext context) {
System.out.println(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("已解析完成");
}
}
- 两种读取数据的方法
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.EasyExcel;
import java.util.List;
public class ImportExcel {
public static void main(String[] args) {
String fileName = "C:\\Codefield\\MY_PROJECT\\match-mate-backend\\src\\main\\resources\\testExcel.xlsx";
synchronousRead(fileName);
}
public static void readByListener(String fileName) {
EasyExcel.read(fileName, TableUserInfo.class, new TableListener()).sheet().doRead();
}
public static void synchronousRead(String fileName) {
List<TableUserInfo> list = EasyExcel.read(fileName).head(TableUserInfo.class).sheet().doReadSync();
for (TableUserInfo tableUserInfo : list) {
System.out.println(tableUserInfo);
}
}
}


- 实操案例
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ImportUser {
public static void main(String[] args) {
String fileName = "C:\\Codefield\\MY_PROJECT\\match-mate-backend\\src\\main\\resources\\testExcel.xlsx";
List<TableUserInfo> userInfoList =
EasyExcel.read(fileName).head(TableUserInfo.class).sheet().doReadSync();
System.out.println("总数 = " + userInfoList.size());
Map<String, List<TableUserInfo>> listMap =
userInfoList.stream()
.filter(userInfo -> StringUtils.isNotEmpty(userInfo.getUsername()))
.collect(Collectors.groupingBy(TableUserInfo::getUsername));
for (Map.Entry<String, List<TableUserInfo>> stringListEntry : listMap.entrySet()) {
if (stringListEntry.getValue().size() > 1) {
System.out.println("username = " + stringListEntry.getKey());
}
}
System.out.println("不重复昵称数 = " + listMap.keySet().size());
}
}

