alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.09k stars 7.5k forks source link

[fix]修复 inlineStr 类型可能存在的数据读取错误 #3861

Open psxjoy opened 3 months ago

psxjoy commented 3 months ago

关联issue:

3860

3823

修复原因:

  1. 在 excel 的 XML 文件中,<c> 标签且标记为inlineStr类型的数据类别下,<v> 标签为无效且错误数据,WPS和office都会默认过滤该标签,同时进行纠错;

  2. 使用 poi 进行excel读取操作,poi 会主动过滤 <c> 标签且标记为inlineStr下的<v> 标签。

    代码逻辑:

  3. CellDataTypeEnumstr匹配至ERROR str 标签是正常的String标签,对于xml文件来说,可以存放大部分的标签数据。原来的str匹配的是DIRECT_STRING,就会导致诸多规则不匹配的问题。 修改后,因为取值时,ERRORDIRECT_STRING 的取值规则都是一致的,因此可以直接兼容。

    //CellTagHandler-> ERROR 和 DIRECT_STRING 的取值规则一致
    case DIRECT_STRING:
    case ERROR:
      tempCellData.setStringValue(tempDataString);
      tempCellData.setType(CellDataTypeEnum.STRING);
      break;
  4. 在SAX 中进行规则判断 在XlsxRowHandlerpublic void characters(char[] ch, int start, int length)函数中,对 inlinStr进行判断,如果此时数据结构为DIRECT_STRING,并且标签为<v>的时候,不进行解析,直接跳过。