Open psxjoy opened 3 months ago
在 excel 的 XML 文件中,<c> 标签且标记为inlineStr类型的数据类别下,<v> 标签为无效且错误数据,WPS和office都会默认过滤该标签,同时进行纠错;
<c>
inlineStr
<v>
使用 poi 进行excel读取操作,poi 会主动过滤 <c> 标签且标记为inlineStr下的<v> 标签。
将 CellDataTypeEnum的str匹配至ERROR str 标签是正常的String标签,对于xml文件来说,可以存放大部分的标签数据。原来的str匹配的是DIRECT_STRING,就会导致诸多规则不匹配的问题。 修改后,因为取值时,ERROR 和 DIRECT_STRING 的取值规则都是一致的,因此可以直接兼容。
CellDataTypeEnum
str
ERROR
DIRECT_STRING
//CellTagHandler-> ERROR 和 DIRECT_STRING 的取值规则一致 case DIRECT_STRING: case ERROR: tempCellData.setStringValue(tempDataString); tempCellData.setType(CellDataTypeEnum.STRING); break;
在SAX 中进行规则判断 在XlsxRowHandler的public void characters(char[] ch, int start, int length)函数中,对 inlinStr进行判断,如果此时数据结构为DIRECT_STRING,并且标签为<v>的时候,不进行解析,直接跳过。
XlsxRowHandler
public void characters(char[] ch, int start, int length)
inlinStr
关联issue:
3860
3823
修复原因:
在 excel 的 XML 文件中,
<c>
标签且标记为inlineStr
类型的数据类别下,<v>
标签为无效且错误数据,WPS和office都会默认过滤该标签,同时进行纠错;使用 poi 进行excel读取操作,poi 会主动过滤
<c>
标签且标记为inlineStr
下的<v>
标签。代码逻辑:
将
CellDataTypeEnum
的str
匹配至ERROR
str
标签是正常的String标签,对于xml文件来说,可以存放大部分的标签数据。原来的str
匹配的是DIRECT_STRING
,就会导致诸多规则不匹配的问题。 修改后,因为取值时,ERROR
和DIRECT_STRING
的取值规则都是一致的,因此可以直接兼容。在SAX 中进行规则判断 在
XlsxRowHandler
的public void characters(char[] ch, int start, int length)
函数中,对inlinStr
进行判断,如果此时数据结构为DIRECT_STRING
,并且标签为<v>
的时候,不进行解析,直接跳过。