EasyExcel监听器返回数据给Controller

使用场景:需要对Excel读的时候记录信息,返回给前端

我参考的:easyexcel中Listener返回信息给Controller 文章
看了之后感觉有点小绕

我这里就简化一下,方便理解,大佬勿喷,直接放代码了
注意:我这里 监听器没有被Sprin容器管理,传递的时候我是手动new的)

监听器 BaseInfoReadExcel
public class BaseInfoReadExcel extends AnalysisEventListener<ExportExcelVo> {
	//server层业务
    BaseInfoService baseInfoService;
	//自定义返回结果类,也就是与传递给controller的实体类
    ExcelStateDataVo excelStateDataVo;
	
	//重点 通过构造器把 excelStateDataVo 对象传递过来
    public BaseInfoReadExcel(BaseInfoService baseInfoService,ExcelStateDataVo excelStateDataVo) {
        this.baseInfoService = baseInfoService;
        this.excelStateDataVo = excelStateDataVo;
    }

    //存储每行数据
    List<ExportExcelVo> baseList = new ArrayList<>();

    //计数器
    int currentRow = 1;
    //错误信息
    List<String> errList = new ArrayList<>();


    @Override
    public void invoke(ExportExcelVo data, AnalysisContext context) {
        //每读一行数据都会走
        //用于记录excel数据行,不是重点!
        currentRow++;
        //处理逻辑...
    }

	//SneakyThrows 注解:lombok帮助我们解决异常,具体自己百度吧
    @SneakyThrows
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
       //读取整个Excel完毕后调用
       //自己的逻辑...
    }

Controller层

	@Autowired
    private BaseInfoService baseInfoService;
    
    @Autowired
    private ExcelStateDataVo excelStateDataVo;
    
	//省略n行代码...

	@PostMapping("/impoprtExcel")
    @ApiOperation("读取Excel内容")
    public R importExcel(MultipartFile file){
        try {
            InputStream inputStream = file.getInputStream();
            //重点 通过创建监听器并且将当前 已经注入的对象传递进去
            //传递进去之后,至于怎么处理看自己了
            ExcelReaderBuilder read = EasyExcel.read(inputStream, ExportExcelVo.class, new BaseInfoReadExcel(baseInfoService,excelStateDataVo));
            ExcelReaderSheetBuilder sheet = read.sheet();
            sheet.doRead();
        } catch (IOException e) {
            e.printStackTrace();
            return ResUtils.defeated();
        }
		//返回给前端
        return ResUtils.success(excelStateDataVo);
    }
excelStateDataVo 用于返回结果的,命名不太规范,能看就行
@Component
@Data
public class ExcelStateDataVo {

    //成功条目
    private Integer successCount = 0;

    //失败条目
    private Integer errorCount = 0;

    //错误信息
    private List<String> errList;

    //是否是空文件,本来名称是使用isNullFile的
    //但是发现is会被优化掉,不建议boolean类型使用isxxx
    private boolean NullFile;

    public void setErrList(List<String> errList) {
        this.errList = errList;
        this.errorCount = errList.size();
    }
}

我这里放一个我的效果图,返回结果类自己定义就行,看需求来
EasyExcel监听器返回数据给Controller_第1张图片
EasyExcel监听器返回数据给Controller_第2张图片

其实解决方法就是controller层注入一个对象,在把这个对象通过构造器传递给监听器,监听器对传递对象进行操作,最后在controller返回就可以了。

刚开始学习EasyExcel,有其他解决方法的欢迎分享。

你可能感兴趣的:(SpringBoot,Java,1024程序员节,java,spring,springboot)