实际项目中遇到的,不常用,特此记录。
对于大多数Excel数据读取,都是逐行读取。但这次发现可以直接读流。。
🙌🙌🙌🙌🙌🙌开始🙌🙌🙌🙌🙌🙌🙌🙌
//读取excel数据,注意里面的UserListener类
EasyExcel.read(excel.getInputStream(),User.class,new UserListener())
.headRowNumber(2)
.sheet().doRead();
class UserListener extends AnalysisEventListener<User>{
private UserDao userDao;
public UserListener(UserDao userDao){//在这里进行注入,因为这个类无法使用组件注解,导致只能读取bean手动注入。
userDao=SpringUtils.getBean("userDao");
}
int x=0;
@Override
public void invoke(Map<Integer,String> headMap, AnalysisContext analysisContext) {
//在这里可检验读取的数据是不是想要的excel
if(x==1&&!headMap.get(0).equals("模板excel")){
throw new RuntimeException("模板Excel不对,请检查!");
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//处理了每行数据
userDao.insert(User);//每行数据封装成User对象
System.out.println("读取完成");
}
}
invoke 方法是继承自 AnalysisEventListener 接口的一个关键方法。它的主要作用是在读取 Excel 文件时,对每一行数据进行处理。
由于上面类无法实例化成bean,只能手动注入需要的Bean
,以下是封装的根据名字获取bean的方法。所以上面UserListener
中用的SpringUtils.getBean(“userDao”)
进行注入的bean:
class SpringUtils implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext = applicationContext;
}
public static <T> T getBean(String beanName) {
if(applicationContext.containsBean(beanName)){
return (T) applicationContext.getBean(beanName);
}else {
return null;
}
}
}