EASYPOI大数据量SAX方式导出(20201126)

示例代码

@Test public void testSaxImport() throws IOException, ParseException { File file = new File("E:\project\urge.xls"); //存放验证失败内容 List<CaseUrgeFullInfo> failList = new ArrayList<>(); //如果有验证失败项,记录失败原因 AtomicReference<String> msg = new AtomicReference<>(); //用于数据验证 InputStream inputStream = new FileInputStream(file); //用户数据导入 InputStream inputStream2 = new FileInputStream(file); try { ExcelImportUtil.importExcelBySax(inputStream, CaseUrgeFullInfo.class, new ImportParams(), new IExcelReadRowHandler<CaseUrgeFullInfo>() { @Override public void handler(CaseUrgeFullInfo caseUrgeFullInfo) { if (StringUtils.isBlank(caseUrgeFullInfo.getCaseNumber())) { failList.add(caseUrgeFullInfo); msg.set("个案序列号不能为空"); } //其他验证 //最后判断是否有验证失败项,检查到有验证失败的,抛异常终止 if (!failList.isEmpty()) { throw new RuntimeException(msg.get()); } } }); }catch (Exception e){ //有异常或者验证失败的情况,终止导入,只有全部验证通过才能导入 logger.info("校验异常,e={}",e.getMessage()); return; } //全部验证通过后进行入库 //存放excel读取的数据 List<CaseUrgeFullInfo> list = new ArrayList(); ExcelImportUtil.importExcelBySax(inputStream2, CaseUrgeFullInfo.class, new ImportParams(), new IExcelReadRowHandler<CaseUrgeFullInfo>() { @Override public void handler(CaseUrgeFullInfo caseUrgeFullInfo) { list.add(caseUrgeFullInfo); if(list.size() == 1000){ handlerData(); } } private void handlerData(){ //入库操作 mongoTemplate.insertAll(list); list.clear(); } }); //不够批次量(1000)的 if(!list.isEmpty()){ //入库操作 mongoTemplate.insertAll(list); list.clear(); } }

SAX方式导入BUG及缺点

使用的是easypoi-3.3.0版本

Git下载地址:https://gitee.com/lemur/easypoi/tree/3.3.0-releae/

存在BUG

  1. 如果有空单元格,会导致错位
  1. 最后一行无法读取

缺陷

不支持ImportParams参数设置

解决方案(BUG和缺陷)

从git上下载源码,参考官方解决bug修复以上BUG,重新打包easypoi-base-3.3.0.jar

无法设置ImportParam参数,无法校验,可以在导入之前使用编码方式做一次校验,校验完成后才能导入,参考“示例代码“部分。

参考

https://opensource.afterturn.cn/doc/easypoi.html#10703

经验分享 程序员 微信小程序 职场和发展