资讯专栏INFORMATION COLUMN

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

cyixlq / 4430人阅读

摘要:之后因为身份证中也可能含有字母所以解决方法改为将单元格的类型设置为文本类型。解决报错固定保存的长度时,就不会产生第一个异常了。身份证长度为十八位返回前台仅支持写入输出时,将忽略掉该字段并不存在数据表中只用于前台使用

问题描述

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

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

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

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

更改单元格格式为文本

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

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

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

@Column(length = 18)
private String idCardNumber;

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

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

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

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

处理warn错误


最开始一直不清楚为什么会出错,一直找不到错误原因是什么,之后问了一下喜硕,他帮我找了一下发现错误原因是如下,更改了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报错

@Size固定保存的长度时,就不会产生第一个异常了。

加上idcard为空的判断,如果为空之前返回idcard。

实现方法改进

新增一个字段用于前台的显示,并设置原字段为只可写的字段,新生成字段只是读取原身份证字段,但不保存到数据库中,实现方式如下。

/**
 * 身份证 长度为十八位 返回前台
 * 仅支持json写入,json输出时,将忽略掉
 */
@Size(min = 18, max = 18)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String idCardNumber;

/**
 * 该字段并不存在数据表中,只用于前台使用
 */
@Transient
private String idCardNumberForShow;

public String getIdCardNumberForShow() {
        if (idCardNumber != null) {
            StringBuffer encryptIdCardNumber = new StringBuffer(idCardNumber);
            encryptIdCardNumber.replace(6, idCardNumber.length() - 6, "******");
            return encryptIdCardNumber.toString();
        } else {
            return "";
        }
    }

@Deprecated
private void setIdCardNumberForShow(String idCardNumberForShow) {}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77595.html

相关文章

  • 用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中

    摘要:特别注意当用模式载入时,跟都是对象。可以使用载入已经存在的表。我们的目的是从源表中提取信息并批量复制到目标表中,所以我们首先定义一些变量。最后保存目标就可以了。 现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法长时间做某种重复性的枯燥操...

    gaosboy 评论0 收藏0
  • 使用js-xlsx纯前端导出excel

    摘要:前言最近公司需要将几张统计表格导出到由于公司现有导出功能是前后端配合的导出,觉得麻烦,所以想找一个纯前端导出的工具,最后找到了,评价还是挺高的,但是中文文档没找到百度也没有找到一个比较全面的教程所以踩了很多坑,自己记录下,方便以后使用。 前言 最近公司需要将几张统计表格导出到excel,由于公司现有导出excel功能是前后端配合的导出,觉得麻烦,所以想找一个纯前端导出的工具,最后找到了...

    Cheriselalala 评论0 收藏0
  • 使用js-xlsx纯前端导出excel

    摘要:前言最近公司需要将几张统计表格导出到由于公司现有导出功能是前后端配合的导出,觉得麻烦,所以想找一个纯前端导出的工具,最后找到了,评价还是挺高的,但是中文文档没找到百度也没有找到一个比较全面的教程所以踩了很多坑,自己记录下,方便以后使用。 前言 最近公司需要将几张统计表格导出到excel,由于公司现有导出excel功能是前后端配合的导出,觉得麻烦,所以想找一个纯前端导出的工具,最后找到了...

    inapt 评论0 收藏0
  • 使用js-xlsx纯前端导出excel

    摘要:前言最近公司需要将几张统计表格导出到由于公司现有导出功能是前后端配合的导出,觉得麻烦,所以想找一个纯前端导出的工具,最后找到了,评价还是挺高的,但是中文文档没找到百度也没有找到一个比较全面的教程所以踩了很多坑,自己记录下,方便以后使用。 前言 最近公司需要将几张统计表格导出到excel,由于公司现有导出excel功能是前后端配合的导出,觉得麻烦,所以想找一个纯前端导出的工具,最后找到了...

    LeanCloud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<