阿里开源EasyExcel数字转换问题

单元格中的数据为小数,如果位数超过十位且单元格格式设置为常规,此时数据只显示十位,超出的会末尾截取。
在这里插入图片描述
在这里插入图片描述
invoke方法接收到的数据是截取后的,即240451327.4。这是因为在进入到自定义的Listener之前先调了ModelBuildEventListener,这个Listener中会把CellData中的单元格数据转换成String类型,问题就出在这里,常规和数值转换的格式不一样。
单元格为常规格式的转换
阿里开源EasyExcel数字转换问题_第1张图片
单元格为数值格式的转换
阿里开源EasyExcel数字转换问题_第2张图片
下面看下格式为常规出现的问题
ModelBuildEventListener的入口
阿里开源EasyExcel数字转换问题_第3张图片
在StringNumberConverter里会把数字转换成double类型
阿里开源EasyExcel数字转换问题_第4张图片
此时的值会变为2.4045132744E8,用科学计数法表示,这是问题的根因。
General对应的格式化类是ExcelGeneralNumberFormat(apache-poi),在这里会去判断数字满不满足一定的数量级,如果不满足会格式为最多11个数字字符,包括小数点。所以2.4045132744E8会被格式为240451327.4。
阿里开源EasyExcel数字转换问题_第5张图片

解决办法
从新获取原始数据

public void invoke(Map<Integer, CellData> data, AnalysisContext context) {
    Map<Integer, CellData> cellDataMap = (Map)context.readRowHolder().getCellMap();
}

你可能感兴趣的:(源码剖析)