示例代码
@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
- 如果有空单元格,会导致错位
https://gitee.com/lemur/easypoi/issues/I1HHEO?from=project-issue
- 最后一行无法读取
https://gitee.com/lemur/easypoi/issues/I15TBC?from=project-issue
缺陷
不支持ImportParams参数设置
https://gitee.com/lemur/easypoi/issues/I10LVR?from=project-issue
解决方案(BUG和缺陷)
从git上下载源码,参考官方解决bug修复以上BUG,重新打包easypoi-base-3.3.0.jar
无法设置ImportParam参数,无法校验,可以在导入之前使用编码方式做一次校验,校验完成后才能导入,参考“示例代码“部分。
参考
https://opensource.afterturn.cn/doc/easypoi.html#10703