Excel数字日期转换为Date日期

背景:

若依框架中,通过@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)

可以把数字转换为日期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值