1、easy Excel引入依赖
进入官网Get Started就可以了。(官方文档简单好用,跟着走就可以了。)
https://alibaba-easyexcel.github.io/index.html
<!-- easy Excel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
2、新建文件夹和用户信息文件
testExcel.xlsx
@Data
public class TableUserInfo {
/**
* id
*/
@ExcelProperty("成员编号")
private String planetCode;
/**
* 用户昵称
*/
@ExcelProperty("成员昵称")
private String username;
}
3、新建监听器
// 有个很重要的点 TableListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class TableListener implements ReadListener<TableUserInfo> {
/**
* 这个每一条数据解析都会来调用
*
* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(TableUserInfo data, AnalysisContext context) {
System.out.println(data);
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("已解析完成");
}
}
4、新建读取数据文件
public class ImportExcel {
/**
* 读取数据
*/
public static void main(String[] args) {
// 写法1:JDK8+ ,不用额外写一个DemoDataListener
// since: 3.0.0-beta1
//Excel数据文件放在自己电脑上,能够找到的路径
String fileName = "C:\\Users\\25073\\Desktop\\testExcel.xlsx";
// readByListener(fileName);
synchronousRead(fileName);
}
/**
* 监听器读取
* @param fileName
*/
public static void readByListener(String fileName) {
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// 这里每次会读取100条数据 然后返回过来 直接调用使用数据就行
EasyExcel.read(fileName, TableUserInfo.class, new TableListener()).sheet().doRead();
}
/**
* 同步读
* 同步的返回,不推荐使用,如果数据量大会把数据放到内存里面
*/
public static void synchronousRead(String fileName) {
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
List<TableUserInfo> list = EasyExcel.read(fileName).head(TableUserInfo.class).sheet().doReadSync();
for (TableUserInfo tableUserInfo : list) {
System.out.println(tableUserInfo);
}
}
}
5、读取数据运行效果
两种读取模式:
- 监听器:先创建监听器、在读取文件时绑定监听器。
单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。
- 同步读:无需创建监听器,一次性获取完整数据。
方便简单,但是数据量大时会有等待时常,也可能内存溢出。
6、导入用户
/**
* 导入用户到数据库
*/
public class ImportUser {
public static void main(String[] args) {
//Excel数据文件放在自己电脑上,能够找到的路径
String fileName = "C:\\Users\\25073\\Desktop\\testExcel.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
List<UserInfo> userInfoList =
EasyExcel.read(fileName).head(UserInfo.class).sheet().doReadSync();
System.out.println("总数 = " + userInfoList.size());
Map<String, List<UserInfo>> 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("1");
}
}
System.out.println("不重复昵称数 = " + listMap.keySet().size());
}
}