[alibaba/easyexcel]更新解析excel出现问题 异常堆栈信息打印

2024-05-23 447 views
7
bug 描述:

运营人员上传excel文件时,突然不解析数据,后端查看解析excel文件时突然异常中止,没有打印任何异常堆栈信息

bug原因:
  • 我们使用数据库和easyexcel 共用bean对象,对象内部需要解析的变量上则加注解@ExcelProperty("列名") 为easyexcel解析使用。

  • 运营人员上传的excel文件 head行第一列有单词拼写错误,AbstractReadHolder类执行 buildHead 方法时,225行 的 if (headName.equals(headString)) 判断不满足,则会把这一行当做@ExcelProperty 不指定列名的方式处理。前面说数据库对象和easyexcel 是公用bean对象,我们第一个变量为long 型id

  • 在206行有这个判断逻辑 if (headData.getForceIndex() || !headData.getForceName()) { tmpHeadMap.put(entry.getKey(), headData); tmpContentPropertyMap.put(entry.getKey(), contentPropertyMapData.get(entry.getKey())); continue; } 先把第一列放到tmpHeadMap 中,而由于excel文件 第一列单词拼错,225行的判断逻辑无法走 if (headName.equals(headString)) 导致ExcelReadHeadProperty 存的head对象第一列是Long型。

  • 我们的excel第一列解析出来是中文字符串。ModelBuildEventListener 执行invoke方法第一列匹配出 LongStringConverter 执行 parseLong方法出现类型转换异常。异常抛至XlsxSaxAnalyser parseXmlSource 方法catch后再抛。

  • for (ReadSheet readSheet : sheetList) { readSheet = SheetUtils.match(readSheet, readSheetList, readAll, analysisContext.readWorkbookHolder().getGlobalConfiguration()); if (readSheet != null) { analysisContext.currentSheet(readSheet); parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(analysisContext, stylesTable)); // The last sheet is read analysisContext.readSheetHolder().notifyAfterAllAnalysed(analysisContext); } } 调用方没有对异常进行打印,导致程序中止,且没有异常信息。

bug复现
  • 可参考提交的IndexOrNameData单元测试类。
  • 第一行解析对不上只有数据类型不一致才会出现问题。如果数据类型一致则不会有问题

回答

3

@pdkst bug的原因是因为catch 了异常,却没有打印。导致库使用方 既看不到结果也看不到异常,我只是把catch的异常 打个log出来而已

9

没有看懂具体问题 我看catch 也是新增的。具体是哪个catch 没有打印异常?这样catch 一定会导致有问题 就是很多异常就输出下而已。输出肯定不是一解决异常的方案。

3

非常感谢您的PR 目前来看这个catch了 直接打印不是特别合适,异常需要交给使用的人去处理,这里仅仅打印了会给很多用户造成困惑。 再次感谢您的PR 有好的想法可以继续提交。暂时我先关闭这个PR.