새 POI 가 져 오기 날짜 형식 cell 값 프로 세 스 도해

4051 단어 POI획득날짜.cell
POI 로 Excel 값 을 읽 는 학생 은 날짜 유형 에 미 친 적 이 있 습 니 다!
POI 는 셀 날짜 에 대한 처리 가 약 하고 대상 이 없 는 유형 이 며 날짜 유형 도 double 값 이기 때문에 같은 수치 유형 으로 합 니 다.cell.setCellType(CellType.STRING)을 사용 하 더 라 도 숫자 를 되 돌려 줍 니 다.
인터넷 의 대부분 방법 은:
cell.getCellType()
그러나 새 판 POI 에서 예 를 들 어 3.15 판 은 이미 사용 을 포기 했다.프로젝트 가 필요 하기 때문에 jar 가방 을 조정 할 수 없 기 때문에 억지로 해결 할 수 밖 에 없다.

나중에 한 가지 방법 을 발견 했다.
cell.getCellStyle().getDataFormattString()은 셀 의 형식 유형 을 판단 할 수 있 습 니 다.다음 그림 입 니 다.

그래서 다음 과 같은 방법 으로 판단 할 수 있다.

if("yyyy/mm;@".equals(cell.getCellStyle().getDataFormatString()) || "m/d/yy".equals(cell.getCellStyle().getDataFormatString())
    || "yy/m/d".equals(cell.getCellStyle().getDataFormatString()) || "mm/dd/yy".equals(cell.getCellStyle().getDataFormatString())
    || "dd-mmm-yy".equals(cell.getCellStyle().getDataFormatString())|| "yyyy/m/d".equals(cell.getCellStyle().getDataFormatString())){
  return new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue());
}
이 방법 으로 판단 하 는 형식 은 한계 가 있 으 며,셀 형식 을 한정 할 수 있다 면 충분히 해결 할 수 있다.
하지만 제 프로젝트 는 엑셀 의 날짜 형식 도 고정 되 지 않 고 다른 길 을 찾 아야 합 니 다.
디 버 깅 을 할 때 분명히 이 cell 의 값 이 표시 되 어 있 는 날 짜 였 다.

위의 그림 과 같이 이 날짜[31-1 월-2005]는 이 cell 아래 의 특정한 요소 에 있 지 않 습 니 다.적어도 저 는 오랫동안 찾 았 지만 찾 지 못 했 습 니 다.cell.toString()으로 만 받 을 수 있 습 니 다.
마지막 으로 제 해결 방법 은 cell.getCellStyle().getDataFormattString()을 사용 하여 판단 하고 얻 을 수 있 으 면"yyy/MM/dd"형식의 날 짜 를 되 돌려 주 는 것 입 니 다.얻 지 못 하면 마지막 으로 cell.toString()으로 돌아 갑 니 다.이렇게 하면 적어도 하나의 숫자 를 되 돌려 주지 않 을 것 이 고,다른 유형의 단원 격 에 영향 을 미 칠 지 모 르 지만,현재 몇 장의 시 계 를 뛰 어 다 녔 지만 잘못 보고 하지 않 았 다.
이런 해결 방법 은 당연히 좋 지 않 습 니 다.분명 좋 은 방법 이 있 을 것 입 니 다.제 가 찾 지 못 했 을 것 입 니 다.만약 에 어떤 협객 이 찾 았 다 면 말씀 해 주 십시오.감사합니다.
마지막 까지 역시 나 를 귀 찮 게 했 어.[31-1 월-2005]격식 이 안 돼.'yyy/MM/dd'격식 으로 바 꿔 야 돼.
그리고 정규 표현 식 을 쓰 지 않 고 문자열 을 판단 하 는 방식 으로 날짜 형식 을 판단 하려 고 합 니 다.아버 지 를 속 였 으 니 바로 쓸 줄 모른다.....................................................간단 하 다 고 생각 했 는데 틀 렸 어.
그리고 잔 머리 를 굴 려 자바 의 문자열 로 조금씩 나 누 어 판단 하고 코드 를 먼저 넣 는 것 으로 바 꾸 었 습 니 다.

/**
   *             
   *
   * @param cell    
   * @return      
   */
  public static String convertCellToString(Cell cell){
    //   null     ,        
    if (cell == null)
      return "";

    //POI          ,       ,            double ,          
    //    2006/11/02          ,POI     “02-   -2006”  
    if(cell.toString().contains("-") && checkDate(cell.toString())){
      String ans = "";
      try {
        ans = new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue());
      } catch (Exception e) {
        ans = cell.toString();
      }
      return ans;
    }

    cell.setCellType(CellType.STRING);
    return cell.getStringCellValue();
  }

  /**
   *      “02-   -2006”       
   */
  private static boolean checkDate(String str){
    String[] dataArr =str.split("-");
    try {
      if(dataArr.length == 3){
        int x = Integer.parseInt(dataArr[0]);
        String y = dataArr[1];
        int z = Integer.parseInt(dataArr[2]);
        if(x>0 && x<32 && z>0 && z< 10000 && y.endsWith(" ")){
          return true;
        }
      }
    } catch (Exception e) {
      return false;
    }
    return false;
  }
학생 들 은 천천히 이해 하 세 요.코드 가 조금 좌절 되 었 지만 정확 하 다 고 보장 할 수 는 없 지만 적어도 이런 상황 에서 사용 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기