上周,有一个简单的跑批任务,跑批之前对文件进行了解析和比对,发现针对科学记数法表示的统一社会信用代码,POI读取出来后与原值不一致。
本文记录一下问题复现、所做尝试、问题解决以及如何防止。
原始数据
具体内容如下:
问题重现
读取含有科学记数法的Excel文件,重现问题。
本文使用了多个populateValue方法来尝试读取,一个测试示例如下:
运行一下程序,然后发现数据有出入,比如:
914403000944125000 变成 914403000944125060
尝试 1、 将单元格设置为 “文本”
重新执行,问题依然存在。
尝试 2、 自定义 + 数字占位符#
调整靠左对齐
重新执行,问题依然存在。
尝试 3、 使用数据 -> 分列 设置单元格
点击“数据” -> "分列"
点击“下一步”
直到选中列数据格式为“文本”, 并点击“完成”按钮。
操作之后,文件内容如下表所示:
然后,重新执行程序,发现结果都按照文本读取正确值。
针对涉及诸如身份证号、社会信用统一代码等长字段的Excel导入,读取时需要较为小心,如遇到纯数字的场景,会采用科学记数法记录,POI读取的时候可能不准确。
在上述的测试中,貌似纯数字长度大于11位的时候会转换成科学记数法。
我们可以增加一层校验,如读取的内容是数字类型,且使用了科学记数法,可以提示一下,如“xxx包含科学记数法,请转换成文本格式再进行导入”。
一个简单的判断示例如下:
//如为Numeric类型
String result = cell.getNumericCellValue() + "";
if(result.contains("E")) {
//抛出格式错误信息
}
如读者有其它好的办法,也可以分享出来。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。