List<PrefillPolicyPriceExcel> excels = null;
try {
excels= EasyExcel.read(file.getInputStream(), PrefillPolicyPriceExcel.class, null).sheet(0).headRowNumber(1).doReadSync();
} catch (IOException e) {
throw new RuntimeException(e);
}
此处为什么没有传监听器AnalysisEventListener,专门测试了,监听器创不创建结果都一样,List列表都能正常获取。
第二种就是使用doRead方法,但是因为该方法的返回值为void,所以没办法直接给你返回值,此时就需要一个监听器,然后再监听器的生命周期中去给你想要的list去赋值。
问:那doRead方法这么麻烦为什么还要用?
答:起初网上查阅资料说doRead是异步的不会阻塞当前线程(一般是主线程main),也就是说不需要读取完excel,main线程就可以执行了,但是可能不安全,因为后续需要插入到数据库,但是数据还可能没读取完!相反的doReadSync是同步的,它会阻塞当前线程(mian线程),也就是说只有读取完excel中的所有数据后才会往下面执行。
好奇:因为我实际使用的是doRead,也就是异步,但是很迷惑,因为我后续main线程进行了插入数据库的操作。很大可能是我在读取excel数据的过程中main线程进行了数据库的插入,奇怪的是每次数据库插入的数据库都是完整的,起初我以为是数据量太小,我不服,我往excel文件中放了两万条数据去读取,发现竟然也是能正常全部插入的,我就有些怀疑doRead到底是不是异步的。
经过打断点测试发现doRead是同步的。具体网上说为什么是异步的,估计都没测试。欢迎大家测试完以后看看它是不是异步的,我测试的是同步的。
所以一般情况下我还是用doReadSync
一般在工作中,还需要写个监听器,为什么?因为同事都这么写,并且只是重写了监听器重写了方法,但是方法中什么也没干,简而言之就是个没用!毕竟不是老员工,我也没有探讨过,同事怎么写,我也怎么写。。。。