1. 程式人生 > >用POI上傳EXCEL表格 日期解析問題

用POI上傳EXCEL表格 日期解析問題

說一下我遇到的三種情況下日期的解析問題

1.日期在EXCEL中的格式是文字


這是最簡單的 和其他文字列獲取方式一樣 即:

String cell5Value = cell3.getStringCellValue().trim();//獲取文字並去空格 或者
String cell5Value = cell5.toString().trim();  

然後可以轉換到需要的格式

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;
                        					}
                        					
                        				}
                        			}
                        		}
                        	}
2 日期列在EXCEL中就是日期格式的,為了程式的健壯性我測試了一些常見的日期格式

日期格式的列如果直接使用

cell.getStringCellValue();
取會報錯:
java.lang.IllegalStateException: Cannot get a text value from a numeric cell

使用 cell5.toString().trim();取值雖然不會報錯,但是月份會變成大寫,顯然不是我想要的結果,這個時候使用下面程式碼解決:

 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);
                        	}
                        }
3.圖2中紅色字型標註的日期 是數值型列 但是程式會自動給轉換成一個double型的數值型 這個數值表示的是此日期距離元日期的天數,知道這個數值表示的是什麼就很簡單了,下面直接上程式碼
double value = cell5.getNumericCellValue();//取數值型列特有的方法
                        detectionDate = DateUtil.getJavaDate(value);//使用工具類可以直接轉換成日期