使用easyExcel完成excel表格的导入和导出操作

引入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) {

    }
}

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值