阿里开源EasyExcel数字转换问题
单元格中的数据为小数,如果位数超过十位且单元格格式设置为常规,此时数据只显示十位,超出的会末尾截取。invoke方法接收到的数据是截取后的,即240451327.4。这是因为在进入到自定义的Listener之前先调了ModelBuildEventListener,这个Listener中会把CellData中的单元格数据转换成String类型,问题就出在这里,常规和数值转换的格式不一样。单元格为常规
·
单元格中的数据为小数,如果位数超过十位且单元格格式设置为常规,此时数据只显示十位,超出的会末尾截取。

invoke方法接收到的数据是截取后的,即240451327.4。这是因为在进入到自定义的Listener之前先调了ModelBuildEventListener,这个Listener中会把CellData中的单元格数据转换成String类型,问题就出在这里,常规和数值转换的格式不一样。
单元格为常规格式的转换
单元格为数值格式的转换
下面看下格式为常规出现的问题
ModelBuildEventListener的入口
在StringNumberConverter里会把数字转换成double类型
此时的值会变为2.4045132744E8,用科学计数法表示,这是问题的根因。
General对应的格式化类是ExcelGeneralNumberFormat(apache-poi),在这里会去判断数字满不满足一定的数量级,如果不满足会格式为最多11个数字字符,包括小数点。所以2.4045132744E8会被格式为240451327.4。
解决办法
从新获取原始数据
public void invoke(Map<Integer, CellData> data, AnalysisContext context) {
Map<Integer, CellData> cellDataMap = (Map)context.readRowHolder().getCellMap();
}
更多推荐
所有评论(0)