用POI上傳EXCEL表格 日期解析問題
阿新 • • 發佈:2019-02-14
說一下我遇到的三種情況下日期的解析問題
1.日期在EXCEL中的格式是文字
這是最簡單的 和其他文字列獲取方式一樣 即:
String cell5Value = cell3.getStringCellValue().trim();//獲取文字並去空格 或者
String cell5Value = cell5.toString().trim();
然後可以轉換到需要的格式
2 日期列在EXCEL中就是日期格式的,為了程式的健壯性我測試了一些常見的日期格式try { detectionDate = sdf.parse(cell5Value); } catch (ParseException e) { try { sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); detectionDate = sdf.parse(cell5Value); } catch (ParseException e1) { try { sdf = new SimpleDateFormat("yyyy-MM-dd"); detectionDate = sdf.parse(cell5Value); } catch (ParseException e2) { try { sdf = new SimpleDateFormat("yyyy/MM/dd"); detectionDate = sdf.parse(cell5Value); } catch (ParseException e3) { try { sdf = new SimpleDateFormat("yyyyMMdd"); detectionDate = sdf.parse(cell5Value); } catch (ParseException e4) { LOGGER.info("上傳的檢測日期解析錯誤,日期:" + cell5Value); continue; } } } } }
日期格式的列如果直接使用
cell.getStringCellValue();
取會報錯:java.lang.IllegalStateException: Cannot get a text value from a numeric cell
使用 cell5.toString().trim();取值雖然不會報錯,但是月份會變成大寫,顯然不是我想要的結果,這個時候使用下面程式碼解決:
3.圖2中紅色字型標註的日期 是數值型列 但是程式會自動給轉換成一個double型的數值型 這個數值表示的是此日期距離元日期的天數,知道這個數值表示的是什麼就很簡單了,下面直接上程式碼if (cell5 != null) { if(cell5.getCellType() == Cell.CELL_TYPE_NUMERIC){ //如果此列的型別是數值型 (數值型包括日期型和數字型) boolean b = DateUtil.isCellDateFormatted(cell5); //DateUtil是POI自帶的工具類,這句是判斷此列是否是日期型別 if(b){ detectionDate = cell5.getDateCellValue();//獲取日期 }else{ //else是第三種情況說得 double value = cell5.getNumericCellValue(); detectionDate = DateUtil.getJavaDate(value); } }
double value = cell5.getNumericCellValue();//取數值型列特有的方法
detectionDate = DateUtil.getJavaDate(value);//使用工具類可以直接轉換成日期