poi 解析excel (二)时间和日期格式分类解析 (全网只此一家这么详细的)

  大家好,使用poi解析excel,第二篇来啦。这一篇主要是探讨日期和时间格式的解决。(转载请注明出处,谢谢!)

众所周知,在excel中有很多的时间和日期格式。而poi官方在处理时间和日期上面的能力比较弱。网上很多地方都找不到解决的方法,或者说解决的覆盖面太小,解决的格式很少很少。

所以我建议:日期或者时间格式,一定要让用户输出文本格式!!!

如果产品实在没有定义。那么就需要自己解决下。

 

下面我列出excel中时间和日期中几类格式。

日期:1. 年月日时分秒 2. 年月日 3. 年月 4. 月日 5. 星期X  6.周X  7.月

时间:有时分等等,统一成时分秒。

 

为了不让它补齐,我们需要不同类的格式用不同的格式化的方法。

一、首先确定每种分类的格式

/**
 * 年月日时分秒 默认格式
 */
SimpleDateFormat COMMON_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
 * 时间 默认格式
 */
SimpleDateFormat COMMON_TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
/**
 * 年月日 默认格式
 */
SimpleDateFormat COMMON_DATE_FORMAT_NYR = new SimpleDateFormat("yyyy-MM-dd");
/**
 * 年月 默认格式
 */
SimpleDateFormat COMMON_DATE_FORMAT_NY = new SimpleDateFormat("yyyy-MM");
/**
 * 月日 默认格式
 */
SimpleDateFormat COMMON_DATE_FORMAT_YR = new SimpleDateFormat("MM-dd");
/**
 * 月 默认格式
 */
SimpleDateFormat COMMON_DATE_FORMAT_Y = new SimpleDateFormat("MM");
/**
 * 星期 默认格式
 */
String COMMON_DATE_FORMAT_XQ = "星期";
/**
 * 周 默认格式
 */
String COMMON_DATE_FORMAT_Z = "周";

 

二、确定每种时间或者日期分类。

每个单元格都有dataFormat 和 dataFormatString,用户模式和事件驱动模式得到的方法不同,我们可以根据这个去判断单元格属于哪种分类。

一开始我准备使用dataFormat去判别,但是我发现 dataFormat数字除了几个2位数的不会变化以外,其余会变化。所以,经过多次整理测试,用 dataFormatString,去判别,下面是我整理的覆盖面比较广的 dataFormat 和 dataFormatString。

判断日期要分为两步: 一个是用  isValidExcelDate() 判断单元格的值是否可以转成日期,第二个就是 isInternalDateFormat() 判断单元格类型。

所以我们进行改造如下: 

 /**
     * 07版时间(非日期) 总time
     */
    List<Short> EXCEL_FORMAT_INDEX_07_TIME = Arrays.asList(
            new Short[]{18, 19, 20, 21, 32, 33, 45, 46, 47, 55, 56, 176, 177, 178, 179, 180, 181,
                    182, 183, 184, 185, 186}
    );
    /**
     * 07版日期(非时间) 总date
     */
    List<Short> EXCEL_FORMAT_INDEX_07_DATE = Arrays.asList(
            new Short[]{14, 15, 16, 17, 22, 30, 31, 57, 58, 187, 188, 189, 190, 191, 192, 193,
                    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208}
    );
    /**
     * 03版时间(非日期) 总time
     */
    List<Short> EXCEL_FORMAT_INDEX_03_TIME = Arrays.asList(
            new Short[]{18, 19, 20, 21, 32, 33, 45, 46, 47, 55, 56, 176, 177, 178, 179, 180, 181,
                    182, 183, 184, 185, 186}
    );
    /**
     * 07版日期(非日期) 总date
     */
    List<Short> EXCEL_FORMAT_INDEX_03_DATE = Arrays.asList(
            new Short[]{14, 15, 16, 17, 22, 30, 31, 57, 58, 187, 188, 189, 190, 191, 192, 193,
                    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208}
    );
    /**
     * date-年月日时分秒
     */
    List<String> EXCEL_FORMAT_INDEX_DATE_NYRSFM_STRING = Arrays.asList(
            "yyyy/m/d\\ h:mm;@", "m/d/yy h:mm", "yyyy/m/d\\ h:mm\\ AM/PM",
            "[$-409]yyyy/m/d\\ h:mm\\ AM/PM;@", "yyyy/mm/dd\\ hh:mm:dd", "yyyy/mm/dd\\ hh:mm", "yyyy/m/d\\ h:m", "yyyy/m/d\\ h:m:s",
            "yyyy/m/d\\ h:mm", "m/d/yy h:mm;@", "yyyy/m/d\\ h:mm\\ AM/PM;@"
    );
    /**
     * date-年月日
     */
    List<String> EXCEL_FORMAT_INDEX_DATE_NYR_STRING = Arrays.asList(
            "m/d/yy", "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy",
            "[DBNum1][$-804]yyyy\"年\"m\"月\"d\"日\";@", "yyyy\"年\"m\"月\"d\"日\";@", "yyyy/m/d;@", "yy/m/d;@", "m/d/yy;@",
            "[$-409]d/mmm/yy", "[$-409]dd/mmm/yy;@", "reserved-0x1F", "reserved-0x1E", "mm/dd/yy;@", "yyyy/mm/dd"
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值