背景:
若依框架中,通过@Excel注解可以接收excel的数据导入。但是,
在excel中,日期分为两种:一种是日期格式,另一种是自定义格式的日期。自定义格式的日期虽然看起来也是日期,但用@Excel注解接收时,是数字,如45468
@Excel注解:接收表格导入的字段。
dateFormat:将日期转换为指定格式的字符串。Date类型时,dateFormat不生效。
excel日期转字符串
如果想要在日期格式转换的同时,兼容转换数字日期为想要的日期格式字符串,参考下面的方法:
if (String.class == fieldType) {
String s = Convert.toStr(val);
if (StringUtils.endsWith(s, ".0")) {
val = StringUtils.substringBefore(s, ".0");
} else {
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
if (StringUtils.isNotEmpty(dateFormat)) {
try {
int days = Integer.parseInt(s);
// Calendar c = Calendar.getInstance();
// c.set(1900, Calendar.JANUARY, 1);
// c.add(Calendar.DAY_OF_YEAR, days - 2);
// val = c.getTime();
val = DateUtil.getJavaDate(days);
} catch (Exception e) {
// do nothing
}
val = DateUtils.parseDateToStr(dateFormat, (Date) val);
} else {
val = Convert.toStr(val);
}
}
}
excel数字日期,如45468,代表距离初始日期1900-01-01的天数。如果使用Calendar 日期类设置初始日期,需要减两天。其中原因是
但org.apache.poi.ss.usermodel.DateUtil提供了工具方法getJavaDate,可以直接转换数字日期。
excel日期转Date
excel日期转换为Date类型,也可以兼容数字日期,方法类似:
if (Date.class == fieldType) {
if (val instanceof String) {
try {
int days = Integer.parseInt(Convert.toStr(val));
val = DateUtil.getJavaDate(days);
} catch (Exception e) {
val = DateUtils.parseDate(val);
}
} else if (val instanceof Double) {
val = DateUtil.getJavaDate((Double) val);
}
}
总结:以上代码均基于若依框架,在使用@Excel注解完成excel导入数据时,对时间类型处理有一些缺陷。自定义格式的日期无法转换为对应日期字符串或Date类型。通过
DateUtil.getJavaDate(days)
可以把数字转换为日期。