2009-05-14 5 views
30

Java에서 Excel을 조작 할 때 POI HSSF API를 사용하고 있습니다. 나는 나의 탁월한 셀 중 하나에서 날짜 값 "8/1/2009"를 가졌으며 HSSF API를 사용하여이 값을 읽으려고 시도하면서 숫자로 셀 유형을 탐지하고 내 날짜의 'Double'값을 반환합니다. 아래 샘플 코드를 참조하십시오.POI HSSF API를 사용하여 Excel 셀에서 날짜 값을 읽음

cell = row.getCell(); // date in the cell '8/1/2009' 
switch (cell.getCellType()) { 

case HSSFCell.CELL_TYPE_STRING: 
    cellValue = cell.getRichStringCellValue().getString(); 
    break; 
case HSSFCell.CELL_TYPE_NUMERIC: 
    cellValue = new Double(cell.getNumericCellValue()).toString(); 
    break; 
default: 
} 

Cell.getCellType()은 NUMERIC_TYPE을 반환하므로이 코드는 날짜를 double로 변환합니다! :(

는 HSSF POI에서와 같이 날짜를 읽을 수있는 방법이 있습니까

답변

37

당신은 한 번 봐 걸릴 수 있습니다!? 자세한 내용은 POI 끔찍한 스프레드 시트 형식의 API를 참조

HSSFDateUtil.isCellDateFormatted() 

을 HSSFDateUtil에 : 또한 엑셀 getExcelDate() 반환에 대한 몇 가지 헬퍼 메소드를 제공

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFDateUtil.html

및 Java날짜. 그러나 ...

을 당신은

Excel에서 날짜 및 시간을 숫자로 취급
+8

나는 그 POI 개발자가 ... 자신의 소스 코드를 언급 할 Jon

+2

DateUtil.isCellDateFormatted 호출은() HSSFs 및 XSSFs에서 코드를 자유롭게의 방법으로 앞서 단계가 될 것입니다 바랍니다. XLS/XLSX 종속 HSSF/XSSF 하위 대신 글로벌 부모를 사용하면 코드를 훨씬 보편적으로 만들 수 있습니다. –

6

이 ... 존이 더 나은했다 ...하지만 다른 날짜 형식의 다소주의 할 필요가, 그래서 나는 그를 여기 에코하지 않습니다 당신은 당신이 다음

cell.getDateCellValue() 메소드를 사용할 수있는 POI 3.5을 사용하는 경우이 문제에 넣어 한 일에 대한 샘플 코드는 http://poi.apache.org/spreadsheet/quick-guide.html#CellContents

+0

링크를 보내 주셔서 감사합니다 – nantitv

6

이다. 이것은 2007 년에도 잘 작동합니다.

20

Excel 파일에서와 같은 형식으로 날짜를 참조하려면 CellDateFormatter를 사용해야합니다. 샘플 코드 :

CellValue cValue = formulaEv.evaluate(cell); 
double dv = cValue.getNumberValue(); 
if (HSSFDateUtil.isCellDateFormatted(cell)) { 
    Date date = HSSFDateUtil.getJavaDate(dv); 

    String dateFmt = cell.getCellStyle().getDataFormatString(); 
    /* strValue = new SimpleDateFormat(dateFmt).format(date); - won't work as 
    Java fmt differs from Excel fmt. If Excel date format is mm/dd/yyyy, Java 
    will always be 00 for date since "m" is minutes of the hour.*/ 

    strValue = new CellDateFormatter(dateFmt).format(date); 
    // takes care of idiosyncrasies of Excel 
} 
+0

이 방법은 원시 열 값을 얻는 것이 의미가 있습니다 ... – Makky

0

POI 3.15 beta3 이후로 일부 기능은 deprecated입니다. 데이터 형식을 확인하고 Java Date으로 검색 할 수 있습니다.

SimpleDateFormat format = new SimpleDateFormat(""); 
String cellValue; 
if(cell != null && cell.getCellTypeEnum() != CellType.STRING && 
    cell.getCellTypeEnum() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)){ 

    cellValue = format.format(cell.getDateCellValue()); 
}