[alibaba/easyexcel]demo代码bug DemoDataListener doAfterAllAnalysed 重复插入数据

2024-05-21 290 views
9

触发场景描述 读多个sheet时(例如调用doReadAll),每当一个sheet里的所有数据解析完成了,调用com.alibaba.easyexcel.test.demo.read.DemoDataListener 的 doAfterAllAnalysed方法,saveData()存储完成之后也需要清理 list,否则list里面的数据会参杂在读下一个sheet的数据里面,导致重复插入数据。

使用时真实场景如下 有两个sheet,sheet1和sheet2,sheet1有88024条数据,BATCH_COUNT设置为1000,最后一次读是24条数据,调用doAfterAllAnalysed()之后,这24条saveData()已经入库,但是list没有清除。读sheet2时,list里面仍存在这24条数据,当读取sheet2的976条数据,list累计了1000条,此时入库的数据,这24条重复入库。 以此类推,读多个excel时,会存在多个 “零头” 重复入库的问题。

解决方法 在doAfterAllAnalysed 中 调用saveData()之后,和invoke方法一样,调用list.clear()清理一下

回答

4

@djhdengjianghua 从官方的demo当中,list是主动进行释放的,这个也不算bug。你的场景应该是将这些Listener进行sheet级别的隔离使用。

7

@djhdengjianghua 从官方的demo当中,list是主动进行释放的,这个也不算bug。你的场景应该是将这些Listener进行sheet级别的隔离使用。 不好意思,我没说清楚,读全部sheet时,调用EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll()方法,好像只能传入一个Listener,貌似不能进行sheet级别的隔离?! 这种直接读全部sheet的情况好像不行额,有能传入多个Listener的API没有DEMO出来吗?抱歉,我还不太熟悉如何使用。

1

@djhdengjianghua 从官方的demo当中,list是主动进行释放的,这个也不算bug。你的场景应该是将这些Listener进行sheet级别的隔离使用。 不好意思,我没说清楚,读全部sheet时,调用EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll()方法,好像只能传入一个Listener,貌似不能进行sheet级别的隔离?! 这种直接读全部sheet的情况好像不行额,有能传入多个Listener的API没有DEMO出来吗?抱歉,我还不太熟悉如何使用。

============ 目前看来,只能进行手动的注册Listener,例如: ExcelReaderBuilder excelReaderBuilder = EasyExcel.read(fileName); excelReaderBuilder.registerReadListener(new NoModelDataListener()); excelReaderBuilder.registerReadListener(new NoModelDataListener2()); excelReaderBuilder.sheet().doRead();

好的,谢谢