当前位置:   article > 正文

easyexcel Excel表格数据读取数据为null问题解决_easyexcel判断模板数据为空

easyexcel判断模板数据为空

因为要做数据导入功能,经过了简单调研之后,使用了easyExcel来实现。

至于为什么用这个,大家可以看下对应的文档

EasyExcel · 语雀 

在导入的时候,发现读取的数据为空。

感觉很奇怪,刚开始以为是数据问题,后来检查了一次发现没有问题。

然后百度,百度上的解决方案又是lombok冲突,又是命名不是驼峰的各种问题。

按照百度上的各位老师的答案走了一圈,发现然并卵。

最后只能是自己一个个参考例子去对照了。因为用了监听器的功能。

第一步去掉监听器,直接读取Excel。

发现数据是可以出来的。

问题就已经定位到了,在监听器这里出现了问题。

监听器这里使用了上传对应的实体类。最关键的是在invok这个方法上。

invok对应的方法里面去对数据格式进行了识别和映射。

调用的方法是readAll

这个方法只有一行,就是去执行解析方法,把对象和Excel表格进行一一都对应复制

  1. public void readAll() {
  2. this.excelAnalyser.analysis((List)null, Boolean.TRUE);
  3. }

解析对应的Excel

  1. public void analysis(List<ReadSheet> readSheetList, Boolean readAll) {
  2. try {
  3. if (!readAll && CollectionUtils.isEmpty(readSheetList)) {
  4. throw new IllegalArgumentException("Specify at least one read sheet.");
  5. } else {
  6. this.analysisContext.readWorkbookHolder().setParameterSheetDataList(readSheetList);
  7. this.analysisContext.readWorkbookHolder().setReadAll(readAll);
  8. try {
  9. this.excelReadExecutor.execute();
  10. } catch (ExcelAnalysisStopException var4) {
  11. if (LOGGER.isDebugEnabled()) {
  12. LOGGER.debug("Custom stop!");
  13. }
  14. }
  15. }
  16. } catch (RuntimeException var5) {
  17. this.finish();
  18. throw var5;
  19. } catch (Throwable var6) {
  20. this.finish();
  21. throw new ExcelAnalysisException(var6);
  22. }
  23. }

执行对应的操作

  1. public void execute() {
  2. Iterator var1 = this.sheetList.iterator();
  3. while(var1.hasNext()) {
  4. ReadSheet readSheet = (ReadSheet)var1.next();
  5. readSheet = SheetUtils.match(readSheet, this.xlsxReadContext);
  6. if (readSheet != null) {
  7. this.xlsxReadContext.currentSheet(readSheet);
  8. this.parseXmlSource((InputStream)this.sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(this.xlsxReadContext));
  9. this.readComments(readSheet);
  10. this.xlsxReadContext.analysisEventProcessor().endSheet(this.xlsxReadContext);
  11. }
  12. }
  13. }
  14. private void readComments(ReadSheet readSheet) {
  15. if (this.xlsxReadContext.readWorkbookHolder().getExtraReadSet().contains(CellExtraTypeEnum.COMMENT)) {
  16. CommentsTable commentsTable = (CommentsTable)this.commentsTableMap.get(readSheet.getSheetNo());
  17. if (commentsTable != null) {
  18. Iterator cellAddresses = commentsTable.getCellAddresses();
  19. while(cellAddresses.hasNext()) {
  20. CellAddress cellAddress = (CellAddress)cellAddresses.next();
  21. XSSFComment cellComment = commentsTable.findCellComment(cellAddress);
  22. CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.COMMENT, cellComment.getString().toString(), cellAddress.getRow(), cellAddress.getColumn());
  23. this.xlsxReadContext.readSheetHolder().setCellExtra(cellExtra);
  24. this.xlsxReadContext.analysisEventProcessor().extra(this.xlsxReadContext);
  25. }
  26. }
  27. }
  28. }

因为easyExcel是根据实体注解一个个去映射的,这里没有对注解进行非空null的判断,所以如果你的实体注解(@ExcelProperty)的属性在Excel表里面没有对应名字的列,那么就会返回null了。

问题找到了,解决问题就简单了。把Excel中没有的列的注解给删除了,或者在Excel中添加对应名称的空列。这个问题就解决了。

总结下,下次如果遇到这个问题,可以先实现对应的导出功能,生成一张只有列头的空表。

然后再在这个表里面填充数据。那么就没有问题了。(我想这个也是为什么很多都提供模板表单下载的原因吧)。毕竟代码改动的多了,谁也不能保证模板的可靠性了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/476410
推荐阅读
相关标签
  

闽ICP备14008679号