写一个easyExcel监听处理类的通用模板工具类,可以适配多个实体,不同实体可以调用对应的dao层存入数据库
时间: 2024-02-23 10:59:07 浏览: 117
好的,我可以为您提供一个基于EasyExcel的监听器通用模板工具类,可以适配多个实体,并且不同实体可以调用对应的DAO层存入数据库。以下是代码示例:
```java
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* EasyExcel 监听器通用模板工具类,可以适配多个实体,并且不同实体可以调用对应的DAO层存入数据库
*
* @param <T> 实体类泛型
*/
@Slf4j
public class CommonExcelListener<T> extends AnalysisEventListener<T> {
/**
* 每隔N条存储数据库,默认N为1,可以在构造函数中传入自定义值
*/
private static final int BATCH_COUNT = 1;
/**
* 数据行数
*/
private int rowIndex = 0;
/**
* 数据存储集合
*/
private List<T> dataList = new ArrayList<>();
/**
* 实体类对应的DAO层
*/
private BaseDAO<T> baseDAO;
/**
* 构造函数
*
* @param baseDAO 实体类对应的DAO层
*/
public CommonExcelListener(BaseDAO<T> baseDAO) {
this.baseDAO = baseDAO;
}
/**
* 读取Excel数据行,每读取一行数据就会调用一次该方法
*
* @param data 读取到的数据
* @param analysisContext 解析上下文
*/
@Override
public void invoke(T data, AnalysisContext analysisContext) {
rowIndex++;
log.info("解析到一条数据:{}", JSON.toJSONString(data));
dataList.add(data);
// 达到BATCH_COUNT,需要去存储一次数据库,防止数据过多内存溢出
if (dataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理数据
dataList.clear();
}
}
/**
* 所有数据解析完成后执行该方法
*
* @param analysisContext 解析上下文
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 数据解析完成后,如果数据集合中还有剩余数据,一并存储到数据库中
if (!CollectionUtils.isEmpty(dataList)) {
saveData();
}
log.info("读取Excel数据共{}行", rowIndex);
}
/**
* 将数据存储到数据库中
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", dataList.size());
// 调用实体类对应的DAO层存储数据
baseDAO.saveBatch(dataList);
}
}
```
使用方法如下:
```java
// 示例:读取 User 实体类对应的 Excel 数据,并调用 UserDAO 存储数据
String fileName = "user.xlsx";
InputStream inputStream = new BufferedInputStream(new FileInputStream(fileName));
BaseDAO<User> userDAO = new UserDAO(); // 假设 UserDAO 已经实现
EasyExcel.read(inputStream, User.class, new CommonExcelListener<User>(userDAO)).sheet().doRead();
```
您只需将 `CommonExcelListener` 复制到您的项目中,并根据实际需要修改 `saveData` 中的数据存储逻辑即可。同时在读取 Excel 数据时,只需传入对应的实体类、对应的DAO层和 `CommonExcelListener` 即可。
阅读全文