使用excel导入功能时日期数据变成数字的解决
在使用excel导入功能的时候,难免会导入日期类型的数据,这个时候无论使用easyexcel还是poi的导入方式,都有可能出现纯数字的日期。
1、如果输入的日期是1900年之前的,则不会变成纯数字;
2、如果是1900年之后的日期,则在导入的时候可能会变成数字:
从这张图里面就能看出来原因:excel解析时间类型的数据的时候把日期转成文本类型了。
那么这个数字代表什么呢?
这个数字与上面提到的1900年相关,因为excel中的时间是从1900年开始的,而转换成文本类型的数字则代表着1900年之后的N天,知道这个原理之后,就很好解决这个问题了:
1)如果是正常的时间类型则进行日期转换(1900年之前日期是正常的文本类型);
2)如果是纯数字则进行日期的加法运算。
这个时候需要注意一点的是:1900-02-29这一天是不存在的,但是在excel中是可以输入并转换成数字的,所以需要特殊处理一下,整体处理的代码如下:
private String judgeMemberBirthday(MemberInfo member) {
/**
* 正整数判断(不包含0)
*/
private final Pattern pattern = Pattern.compile("^[1-9]\\d*$");
/**
* excel中的起始时间
*/
private final LocalDate excelStart = LocalDate.of(1899, 12, 31);
//开始执行
try {
//超过10位,不满足年月日格式
if (member.getBirthday().length() > 10) {
return "生日格式有误";
}
//日期转换格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//将字符串日期进行格式化,如果出现异常,说明不是日期格式的
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-M-d");
LocalDate date = LocalDate.parse(member.getBirthday(), df);
member.setBirthday(date);
return null;
} catch (Exception e) {
//如果是纯数字,可能是excel中是日期格式转成了文本格式
if (pattern.matcher(member.getBirthday()).matches()) {
if (Integer.valueOf(member.getBirthday()) > 60) {
LocalDate localDate = excelStart.plusDays(Integer.valueOf(member.getBirthday()) - 1);
if (localDate.isAfter(LocalDate.now())) {
return "生日格式有误";
}
member.setBirthday(localDate);
return null;
} else if (Integer.valueOf(member.getBirthday()) < 60) {
LocalDate localDate = excelStart.plusDays(Integer.valueOf(member.getBirthday()));
member.setBirthday(localDate);
return null;
} else {
return "生日格式有误";
}
} else {
return "生日格式有误";
}
}
}
欢迎评论收藏,如需转载,转贴请注明出处!