转载

eexcel导入时身份证号异常以及解决

问题描述

在导入学生信息的时候发现导入成功之后结果显示是错误的,错误如下所示

eexcel导入时身份证号异常以及解决

eexcel导入时身份证号异常以及解决

刚开始的时候只是感觉是ID card出得问题,但是并没有明白具体的什么地方出得问题,下面是我们导入的示例信息,然后我们点开数据库看了一下我们数据库里的值,发现并不是我们导入的值,而是 2147483647 然后Google了一下这个数字,发现如下

eexcel导入时身份证号异常以及解决

eexcel导入时身份证号异常以及解决

eexcel导入时身份证号异常以及解决

然后感觉是不是数据类型导致的问题,于是看了一下源码发现如下,当前我们的单元格默认为数字,然后按照数字进行处理,结果因为身份证的数字太大,导致导致int无法保存。

eexcel导入时身份证号异常以及解决

之后因为身份证中也可能含有字母所以解决方法改为将单元格的类型设置为文本类型。

更改单元格格式为文本

再设置单元格类型的时候由于我们使用的是导出模版原来是按照Java通过代码生成的,改的时候感觉很麻烦,而且之后考虑到还要为模版添加示例数据,更改样式之类的操作,如果一直使用Java的代码生成的化,会很费事,于是将导出模版的功能更改为直接导出一个模版的静态文件,之后当我们的模版需要更改的时候我们只需要手动更改excel就行,感觉这样会方便很多。

为什么非18位的身份证可以保存

因为我记得字段是加了长度限制的,之后在源码中看了一下,发现之前的写法如下:

@Column(length = 18)
private String idCardNumber;

eexcel导入时身份证号异常以及解决

更该之后的代码,可以使用@Size或@Length:

@Size(min = 18, max = 18)
private String idCardNumber;

eexcel导入时身份证号异常以及解决

@Length(min = 18, max = 18)
private String idCardNumber;

eexcel导入时身份证号异常以及解决

@Size,@Longth和@Column(length = value)之间的差异

eexcel导入时身份证号异常以及解决

处理warn错误

eexcel导入时身份证号异常以及解决

eexcel导入时身份证号异常以及解决

最开始一直不清楚为什么会出错,一直找不到错误原因是什么,之后问了一下喜硕,他帮我找了一下发现错误原因是如下,更改了idcard的get方法:

public String getIdCardNumber() {
    // 获取身份证时将身份证加密
    StringBuffer encryptIdCardNumber = new StringBuffer(idCardNumber);
    encryptIdCardNumber.replace(6, idCardNumber.length() - 6, "******");
    return encryptIdCardNumber.toString();
}

第一处是因为当身份证长度小于12位是替换中间位数位 * 的方法会报错,因为替换的start大于了end

第二处是猜测是因为在yunzhiRepository中会默认的调用student的属性,有些时候属性是不全的会导致空指针异常。

解决warn报错

  1. @Size固定保存的长度时,就不会产生第一个异常了。
  2. 加上idcard为空的判断,如果为空之前返回idcard。
原文  https://segmentfault.com/a/1190000018862394
正文到此结束
Loading...