基于EasyExcel二开支持导入合并的单元格解析一

本文讲述了在使用EasyExcel处理包含合并单元格及空白行的数据导入时遇到的三个主要问题:1) 空白行判断不准确导致数据丢失;2) 读取合并单元格时对List数据处理不当;3) 校验功能存在缺陷。作者尝试修复但未果,因作者已转向收费版本,遗留问题未解决。
摘要由CSDN通过智能技术生成

目录

二开的原因

在一次开发产品需求中产品要求系统要支持批量导入一批数据,这批数据为一对多数据涉及到合并单元格问题,在调研了多个工具后选择了Gitee上GVP项目EasyPoi,然而在实际使用中却困难重重。

EasyPoi遇到的问题

EasyPoi为一个公司开源的一个傻瓜式的excel解析工具,相对原生的apche poi来讲简单易用且功能强大,其具体的优点在官网上都有可以自行查看,这里主要说一下我遇到的问题

1、空白行的判断。EasyPoi的空白行判断非常智障以第1列或指定列为主键标定该列必须有值,如遇到中间出现空行的情况下则认为已读到最后一行数据。如下表格示例,当我们以标题一为主键列时,当读到第3行时由于主键列数据为空,则认为是最后一行最张只读取了2行数据。

行号标题一标题二标题三
1aaa
2bbb
3
4ccc

2、读取合并单元格。当我设计一个如以下的数据结构时,EasyPoi在处理list部分的数据会判断当前的主键列是否为空且当前处理的数据是否为list,如果条件成立则会循环的读取每一行的list数据,相反如果条件不成立且主键列不为空,则新起一个对象做为新的数据来处理。

数据结构

public class Student{
	private String name;
	private int age;
	private List<Work> list;
}
public clss Work{
	private String workName;
	private String workDescription;
}

解析List部分数据的判断

if (params.getKeyIndex() != null
          && (row.getCell(params.getKeyIndex()) == null
          || StringUtils.isEmpty(getKeyValue(row.getCell(params.getKeyIndex()))))
          && object != null){
          //读取每一行List部分数据
}

3、EasyPoi的校验简直是一个半成品big bug。他的校验是在代码里植入一个接口来进行校验,在导入含有合并单元格且需要解析List结构时,它竟然将单行数据进行校验,而不是将合并好后的对象数据进行校验。
这样就会产生:理想的数据结构是一个Object对象其中含有单值属性和List结构属性(size大于1),然后将整个解析完整的Object进行校验,然而实际是只解析了一行excel数据后就进行校验。如下数据结构可看出,在实际的校验入参里第2次的入参只有List部分数据,因为第2次校验实际是第1次的校验数据没有合并导致
我提出的issues有图例可以看下:https://gitee.com/lemur/easypoi/issues/I53DJV

表格数据
在这里插入图片描述

//理想中的校验入参
{
  "title1": "1",
  "title2": "1",
	"list": [
    {
      "小title1": "1",
      "小title2": "1",
      "小title3": "1"
    },
    {
      "小title1": "2",
      "小title2": "2",
      "小title3": "2"
    },
    {
      "小title1": "3",
      "小title2": "3",
      "小title3": "3"
    }
  ]
}
//实际的校验入参
第1次校验
{
  "title1": "1",
  "title2": "1",
	"list": [
    {
      "小title1": "1",
      "小title2": "1",
      "小title3": "1"
    }
  ]
}
第2次校验
{
  "title1": null,
  "title2": null,
	"list": [
    {
      "小title1": "2",
      "小title2": "2",
      "小title3": "2"
    }
  ]
}

在经历了上面3个问题以后产生了要修复一下这个bug,然而由于空白行判断的问题陷入了一个死循环,如果要空白行判断就无法读取完整的list数据,如果要读取list数据就无法处理空白的问题。在后面几天我看了gitee上issues发现这个作者已经推出收费版本了停留在issues上的bug有些可以追溯到几年前,随后放弃了修复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值