Java 讀取Excel表格日期類型數據的時候,讀出來的是這樣的 12-十月-2019,而Excel中輸入的是 2019/10/12 或 2019-10-12
poi處理excel時,當excel沒有明確指明是哪個類型的數據時,poi很可能處理單元格的日期數據時就有可能是一串數字,而使用java程序基本無法轉換。
為了解決以上的問題,本人收集了各種資料,目前來總結一下,供碰到此類問題的你作參考。
Excel數據處理:
Excel存儲日期、時間均以數值類型進行存儲,讀取時POI先判斷是是否是數值類型,再進行判斷轉化
1、數值格式(CELL_TYPE_NUMERIC):
1.純數值格式:getNumericCellValue() 直接獲取數據
2.日期格式:處理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式
1).判斷是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)
所有日期格式都可以通過getDataFormat()值來判斷
yyyy-MM-dd----- 14 yyyy年m月d日--- 31 yyyy年m月------- 57 m月d日 ---------- 58 HH:mm----------- 20 h時mm分 ------- 32
接下來是針對excel各種數據類型來進入轉換,基本涵蓋所需要的,如果沒有你需要的,可以在此基礎上添加
//獲取單元格各類型值,返回字符串類型 public static String getCellValueByCell(Cell cell) { //判斷是否為null或空串 if (cell==null || cell.toString().trim().equals("")) { return ""; } String cellValue = ""; int cellType=cell.getCellType(); switch (cellType) { case Cell.CELL_TYPE_NUMERIC: // 數字 short format = cell.getCellStyle().getDataFormat(); if (DateUtil.isCellDateFormatted(cell)) { SimpleDateFormat sdf = null; //System.out.println("cell.getCellStyle().getDataFormat()="+cell.getCellStyle().getDataFormat()); if (format == 20 || format == 32) { sdf = new SimpleDateFormat("HH:mm"); } else if (format == 14 || format == 31 || format == 57 || format == 58) { // 處理自定義日期格式:m月d日(通過判斷單元格的格式id解決,id的值是58) sdf = new SimpleDateFormat("yyyy-MM-dd"); double value = cell.getNumericCellValue(); Date date = org.apache.poi.ss.usermodel.DateUtil .getJavaDate(value); cellValue = sdf.format(date); }else {// 日期 sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } try { cellValue = sdf.format(cell.getDateCellValue());// 日期 } catch (Exception e) { try { throw new Exception("exception on get date data !".concat(e.toString())); } catch (Exception e1) { e1.printStackTrace(); } }finally{ sdf = null; } } else { BigDecimal bd = new BigDecimal(cell.getNumericCellValue()); cellValue = bd.toPlainString();// 數值 這種用BigDecimal包裝再獲取plainString,可以防止獲取到科學計數值 } break; case Cell.CELL_TYPE_STRING: // 字符串 cellValue = cell.getStringCellValue(); break; case Cell.CELL_TYPE_BOOLEAN: // Boolean cellValue = cell.getBooleanCellValue()+"";; break; case Cell.CELL_TYPE_FORMULA: // 公式 cellValue = cell.getCellFormula(); break; case Cell.CELL_TYPE_BLANK: // 空值 cellValue = ""; break; case Cell.CELL_TYPE_ERROR: // 故障 cellValue = "ERROR VALUE"; break; default: cellValue = "UNKNOW VALUE"; break; } return cellValue; }