引入pom依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
首先可以测试一下这个easyexcel的功能,它主要就是读取和导出excel的数据:
使用非常的简单:
首先是读入:
主要就是获取文件,然后利用easyExcle的一个read方法,就可以读取到了excel文件的所有内容。但是我们如何可以动态的拿到值呢?这就涉及到了监听器,我们可以在read读的时候,监听他的动作,这样就可以拿到它的值了。
public static void main(String[] args) {
// 1\创建一个EasyExcel对象
File file=new File("C:\\Users\\22335\\Desktop\\uuser.xlsx");
// ExcelReader build = EasyExcel.read(file, User.class, new ReadListern()).build();
// build.read();
EasyExcel.read(file,User.class,new ReadListern()).sheet().doRead();
}
配置监听器:
public class ReadListern extends AnalysisEventListener {
@Override
/// 当读取到一行后,触发该方法
public void invoke(Object o, AnalysisContext analysisContext) {
System.out.println(o);
}
@Override
// 当数据读取完后触发该方法
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
接下就是导出了,也很简单,就是拿取你要放在excel中的数据,然找到你想要放在哪个文件内,之后调用easyexcel类的dowrite方法就可以了。
public static void main(String[] args) {
// 导入:
// 构建一些数据
List<User> users=new ArrayList<>();
for (int i = 0; i <10 ; i++) {
User user = new User(i, "张三" + i, "背景" + i);
users.add(user);
}
File file = new File("C:\\Users\\22335\\Desktop\\uuser.xlsx");
// 创建一个EasyExcel对象 ,一个对象,一个头信息
// ExcelWriter build = EasyExcel.write(file, User.class).build(); // 需要两个参数,一个是文件,一个是数据.然后build
// // 写入用户组 调用写的功能
// build.write(users,EasyExcel.writerSheet("Sheet1").build());
// build.finish(); // 关闭资源
EasyExcel.write(file,User.class).sheet().doWrite(users);
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
说完他的一些基本功能后,我们看一下在spring中如何使用它:
同样导入jar包,写一个接口获取文件,然后调用easyexcel的doread方法,来完成读入,当然我们肯定要把读入的内容存储在数据库或者别的地方,这个时候监听器的作用就出来了。
我们在监听器内每读取一行就将它存储到数据库内,这就用到了对应的封装的excel数据类的service方法,但是监听器不在spring容器中,我们无法在监听器中直接注入数据类的servcie对象,怎么半呢??我们可以通过构造方法传入service对象,在controller传入过去。这样就完美的解决了这个问题。
之后我们需要在controller层写一个接口,入口来调用easyexcle。。
@Autowired
private EduSubjectService eduSubjectService;
@PostMapping("export")
public R export(MultipartFile file){
eduSubjectService.export(file,eduSubjectService);
return R.ok();
}
然后是这个export方法的书写,因为我们要在监听器内将每一行的excel值拿到放在数据库内,所以要传入一个subject的servcie类。
@Override
public void export(MultipartFile file,EduSubjectService eduSubjectService) {
try {
EasyExcel.read(file.getInputStream(), SubjectVo.class,new ExcelListener(eduSubjectService)).sheet().doRead();
} catch (IOException e) {
System.out.println("chucuo ");
e.printStackTrace();
}
}
看一下SubjectVo类,这个是我们将excel表格内的数据封装成实体类:
@Data
public class SubjectVo {
private String oneSubject;
private String twoSubject;
}
最重要的监听器:
public class ExcelListener extends AnalysisEventListener<SubjectVo> {
private EduSubjectService eduSubjectService;
public ExcelListener(EduSubjectService eduSubjectService) {
this.eduSubjectService=eduSubjectService;
}
@Override // 读取到一行后,执行该方法
public void invoke(SubjectVo subjectVo, AnalysisContext analysisContext) {
// 转换为EduSubject
// 保存一级对象
// EduSubject oneEduSubject = new EduSubject();
// oneEduSubject.setTitle(subjectVo.getOneSubject());
// oneEduSubject.setParentId("0");
// eduSubjectService.save(oneEduSubject);
// // 保存二级课程
// EduSubject twoEduSubject=new EduSubject();
// twoEduSubject.setTitle(subjectVo.getTwoSubject());
// twoEduSubject.setParentId(oneEduSubject.getId());
// eduSubjectService.save(twoEduSubject);
System.out.println("dadsdsadsa"+subjectVo);
EduSubject oneSubject = oneSubject(subjectVo.getOneSubject());
if (oneSubject==null){ // 数据库里没有
oneSubject = new EduSubject();
oneSubject.setTitle(subjectVo.getOneSubject());
oneSubject.setParentId("0");
eduSubjectService.save(oneSubject);
}
// 保存二级菜单
EduSubject twoSubject = twoSubject(subjectVo.getTwoSubject(), oneSubject.getId());
if (twoSubject==null){ // 数据库里没有
twoSubject = new EduSubject();
twoSubject.setTitle(subjectVo.getTwoSubject());
twoSubject.setParentId(oneSubject.getId());
eduSubjectService.save(twoSubject);
}
}
// 判断一级菜单是否存在
private EduSubject oneSubject(String oneTitle){
QueryWrapper<EduSubject> wrapper=new QueryWrapper<>();
wrapper.eq("title",oneTitle);
wrapper.eq("parent_id","0");
EduSubject oneSubject=eduSubjectService.getOne(wrapper);
return oneSubject;
}
// 判断一级菜单是否存在
private EduSubject twoSubject(String twoTitle,String parentId){
QueryWrapper<EduSubject> wrapper=new QueryWrapper<>();
wrapper.eq("title",twoTitle);
wrapper.eq("parent_id",parentId);
EduSubject twoSubject=eduSubjectService.getOne(wrapper);
return twoSubject;
}
@Override // 读取完后,执行该方法
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}