前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小课堂 | POI读取科学记数法字段不准确?问题复现、尝试和解决

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

原创
作者头像
孟君
发布2023-04-11 07:13:35
7900
发布2023-04-11 07:13:35
举报
文章被收录于专栏:孟君的编程札记

上周,有一个简单的跑批任务,跑批之前对文件进行了解析和比对,发现针对科学记数法表示的统一社会信用代码,POI读取出来后与原值不一致。

本文记录一下问题复现、所做尝试、问题解决以及如何防止。

问题重现

原始数据

具体内容如下:

问题重现

读取含有科学记数法的Excel文件,重现问题。

本文使用了多个populateValue方法来尝试读取,一个测试示例如下:

运行一下程序,然后发现数据有出入,比如:

代码语言:javascript
复制
914403000944125000 变成 914403000944125060

不同尝试

尝试 1、 将单元格设置为 “文本”

重新执行,问题依然存在。

尝试 2、 自定义 + 数字占位符#

调整靠左对齐

重新执行,问题依然存在。

尝试 3、 使用数据 -> 分列 设置单元格

点击“数据” -> "分列"

点击“下一步

直到选中列数据格式为“文本”, 并点击“完成”按钮。

操作之后,文件内容如下表所示:

然后,重新执行程序,发现结果都按照文本读取正确值

思考

针对涉及诸如身份证号社会信用统一代码等长字段的Excel导入,读取时需要较为小心,如遇到纯数字的场景,会采用科学记数法记录,POI读取的时候可能不准确。

在上述的测试中,貌似纯数字长度大于11位的时候会转换成科学记数法。

我们可以增加一层校验,如读取的内容是数字类型,且使用了科学记数法,可以提示一下,如“xxx包含科学记数法,请转换成文本格式再进行导入”。

一个简单的判断示例如下:

代码语言:javascript
复制
//如为Numeric类型
String  result = cell.getNumericCellValue() + "";
if(result.contains("E")) {    
    //抛出格式错误信息
}

如读者有其它好的办法,也可以分享出来。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题重现
  • 不同尝试
  • 思考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档