小课堂 | POI读取科学记数法字段不准确?问题复现、尝试和解决
导读:上周,有一个简单的跑批任务,跑批之前对文件进行了解析和比对,发现针对科学记数法表示的统一社会信用代码,POI读取出来后与原值不一致。本文记录一下问题复现、所做尝试、问题解决以及如何防止。问题重现原始数据具体内容如下: 问题重现读取含有科学记...
上周,有一个简单的跑批任务,跑批之前对文件进行了解析和比对,发现针对科学记数法表示的统一社会信用代码,POI读取出来后与原值不一致。
本文记录一下问题复现、所做尝试、问题解决以及如何防止。
问题重现
原始数据
具体内容如下:
问题重现
读取含有科学记数法的Excel文件,重现问题。
本文使用了多个populateValue方法来尝试读取,一个测试示例如下:
运行一下程序,然后发现数据有出入,比如:
914403000944125000 变成 914403000944125060
不同尝试
尝试 1、 将单元格设置为 “文本”
重新执行,问题依然存在。
尝试 2、 自定义 + 数字占位符#
调整靠左对齐
重新执行,问题依然存在。
尝试 3、 使用数据 -> 分列 设置单元格
点击“数据” -> "分列"
点击“下一步”
直到选中列数据格式为“文本”, 并点击“完成”按钮。
操作之后,文件内容如下表所示:
然后,重新执行程序,发现结果都按照文本读取正确值。
思考
针对涉及诸如身份证号、社会信用统一代码等长字段的Excel导入,读取时需要较为小心,如遇到纯数字的场景,会采用科学记数法记录,POI读取的时候可能不准确。
在上述的测试中,貌似纯数字长度大于11位的时候会转换成科学记数法。
我们可以增加一层校验,如读取的内容是数字类型,且使用了科学记数法,可以提示一下,如“xxx包含科学记数法,请转换成文本格式再进行导入”。
一个简单的判断示例如下:
//如为Numeric类型
String result = cell.getNumericCellValue() + "";
if(result.contains("E")) {
//抛出格式错误信息
}
如读者有其它好的办法,也可以分享出来。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 小课堂 | POI读取科学记数法字段不准确?问题复现、尝试和解决
本文地址: https://pptw.com/jishu/3815.html