SHOW ME THE CODE
private String resolve(ReadCellData<Object> cellData) {
CellDataTypeEnum dataTypeEnum = cellData.getType();
if (Objects.equals(dataTypeEnum, CellDataTypeEnum.NUMBER)) {
BigDecimal bigDecimal = cellData.getOriginalNumberValue();
if (bigDecimal.scale() > 1) {
return bigDecimal.toString();
}
return new DataFormatter().formatRawCellContents(
cellData.getOriginalNumberValue().doubleValue(),
cellData.getDataFormatData().getIndex(),
cellData.getDataFormatData().getFormat());
}
return cellData.getStringValue();
}
分析
需要注意的是对于 xls 这种精度错误问题,在 xlsx 并没有复现
我们现在的方案是, 读取出 cell 的数据为 ReadCellData<Object>
,看其是否是 CellDataTypeEnum.NUMBER
,通过断点发现,由于 easy excel 会将其读取 BigDecimal,那么 decimal 值可以通过 cellData.getOriginalNumberValue();
获取到
由于 easy excel 底层读取依赖于 POI,结合 issue 我之前写的 POI DataFormatter 的解决方案以及断点 easy excel 的 ReadCellData 提供的 cell 元信息,想要拿取 cell 真正的原始数据,可以有如下解决方案:
- 如果 decimal 的 scale() 大于 1 ,那么直接返回 toString();
- 否则,new org.apache.poi.ss.usermodel.DataFormatter()#formatRawCellContents(double value, int formatIndex, String formatString) 转换获取到原始值