问题背景:运维接到供应商业务的一条系统问题工单,大概问题是通过页面的导入维护基础数据的时候,明显的一条采购订单号(长数字字符)重点是未达到十一位(Excel自动转科学计数法存储的位数限制,当然这不是唯一因素),但是写到数据库的时候数字出现了无规律的同长度变化类似于【4502647993–>2147483647】,没有规律,没有特殊处理,最后问题的根本原因就是飞书的消息和聊天文本框默认支持富文本格式,那就是简单的ctrl+c和ctrl+v复制的消息是加了style的。
String pusNo = ExcelUtils.getString(row.getCell(10)); // 采购订单号
调试代码发现在HSSFCell解析到这一列的时候就转成科学计数法的数字表示,存在数据失真的问题,如果不解决会影响业务后续的操作。
问题排查:业务有两条数据,一条正常数据是以文本形式插入,一条失真数据是以科学技术法解析,那问题的解决方法就很简单了,只要在Excel复制数据时采用标准的文本形式存储,或者在业务代码中强制这条不进行科学计数法的默认解析。
问题神坑:真正解决的时候发现远不是看着简单的,因为一开始就在和运维的聊天记录中复制出来的单号,复制到Excel上是常规格式,所以想到是一开始就设置当前列是文本类型,但是复制进来的数据没有数字提示,手动设置成文本还是会数据失真。下面是正常数据和复制出来错误的数据问题的区别:
因为预设了数值以文本形式解析,但是可以看到格式上是有区别的
问题解决:查询资料和百度后大概总结了几点可以复制进来的时候保证数据以文本格式不会到后台系统解析成科学计数法导致数据失真。
- 使用文本导入向导:
- 在粘贴数据前,选中目标单元格。
- 然后点击“数据”选项卡中的“从文本/CSV”导入按钮。
- 选择你的数据文件,点击“导入”。
- Excel会启动文本导入向导,选择“文本”作为数据类型,然后完成导入过程。
- 在粘贴前先输入单引号:
- 在粘贴数据之前,选中目标单元格。
- 输入一个单引号
'
(不包括引号),然后按Enter
键。 - 接着使用
Ctrl+V
粘贴你的长数字。 - 这样,Excel会将粘贴的数据视为文本格式。
- 使用“粘贴特殊”功能:
- 粘贴数据后,选中包含粘贴数据的单元格。
- 右键点击并选择“粘贴特殊”选项。
- 在弹出的对话框中选择“文本”选项,然后点击“确定”。
- 更改单元格格式:
- 选中目标单元格或列。
- 右键点击并选择“格式单元格”选项。
- 在“数字”标签下,选择“文本”类别。
- 然后粘贴你的长数字。
…
都可以解决数据复制进来的时候确保它们以文本格式保存,而不发生任何失真。
但是!!!业务不接受这样麻烦,简单的就是我ctrl c + ctrl v可以解决的,不想多此一举用别的方式复制。那就要找到问题根本所在。
最终解决:最后无意间想到会不会是飞书的复制方式有问题,所以就查了一下,飞书的消息支持什么形式的,虽然网上有很多的操作文档和手册,但是这个小问题还是没必要翻这么多资料去查,无意间看到飞书的消息支持HTML富文本,类似于typora字体加粗自定义显示。很好!就像这样,有必要吗,一个聊天框整这么“人性化”。
为了验证是不是只有我们的办公软件飞书的消息复制下来的才会到Excel文件上,文本变常规。又测试了在钉钉和微信聊天框复制同样的一串字符,发现还真是,只有飞书有问题。飞书富文本格式的消息复制下来会存在格式冲突导致最终的数据失真。