首页后端开发JAVA小课堂 | POI读取科学记数法字段不准确?问题复现、尝试和解决

小课堂 | POI读取科学记数法字段不准确?问题复现、尝试和解决

时间2023-04-19 08:27:01发布访客分类JAVA浏览1485
导读:上周,有一个简单的跑批任务,跑批之前对文件进行了解析和比对,发现针对科学记数法表示的统一社会信用代码,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核实处理,我们将尽快回复您,谢谢合作!

javaExcelPOI问题

若转载请注明出处: 小课堂 | POI读取科学记数法字段不准确?问题复现、尝试和解决
本文地址: https://pptw.com/jishu/3815.html
创新!京东T7开创“新算法宝典”,图文并茂,全新演绎,太酷了 2023年稳定Clion激活码

游客 回复需填写必要信息