日期:2014-05-20  浏览次数:20681 次

POI读取EXCEL日期的问题。
现在有份EXCEL表格,让很多人填写,在出生年月一列中,有人输入1970年2月,有人输入1970年2月3日,有人输入1970.02,有人输入1970.2,有人输入1970.02.03,有人输入1970-02,有人输入1970-2-3,还有人输入1970.2.3;
我在读取时,进行如下判断

switch(cell.getCellType()) {
  case HSSFCell.CELL_TYPE_NUMERIC:
  Birthday = String.valueOf(cell.getDateCellValue().toLocaleString);
  break;
  case HSSFCell.CELL_TYPE_STRING:
  Birthday = cell.getStringCellValue().trim();
  break;
  default:
  Birthday = "";
  break;
}

这样读取出的出生年月,如果填写的是1970年2月此种格式的,可以经过处理得到;但是如果填写的是1970.02这种格式的,读出的结果就不对了。

请教,有没有什么好的方法来解决??

------解决方案--------------------
我可以肯定地告诉楼主,poi不能处理这种情况,而且这个也不该poi负责处理,
可以先使用getRichStringCellValue得到全部字符串,然后使用自己的方法处理此字符串

自己的方法:
①把"年","月","日","-"等等统统替换为".",这样日期就统一为以"."分割了
②使用SimpleDateFormat对替换好的字符串进行变换.转换失败就
Java code

try{
  按"yyyy.MM.dd"转换;
  返回转换好的Date;
}catch (Exception e){
  //doNothing;
}
try{
  按"yyyy.MM"转换;  
  返回转换好的Date;
}catch(Exception e){
  //doNothing;
}
......
走到最后则说明是无法识别的格式,返回空串;(或者抛出异常==)

------解决方案--------------------
楼上正解.
------解决方案--------------------
统一用
cell.getStringCellValue().trim()取字符 


然后再调用以下方法转换格式

Java code


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    String str = "1990.8.8";
    //String str2 = "1990-9-4";
    parseDate(str);
    }
    
    /****
     * 日期String串转Date
     * @param str
     * @return
     */
    
    public static  Date parseDate(String str){
        Date d = new Date();
        if(str.indexOf('.')!=-1){
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
             try {
                 d = sdf.parse(str);
                System.out.println(sdf.format(d));
                
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        if(str.indexOf('-')!=-1){
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             try {
                 d = sdf.parse(str);
                System.out.println(sdf.format(d));
                
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
        return d;
    }