2013-10-16 18 views
2

DATE(year, month, day) 수식을 셀에 포함하는 xlsx 파일을 사용하고 있습니다. 이 셀은 날짜 형식이므로 Excel/OpenOffice는 적절한 날짜를 표시합니다. 예 : 셀 내용은 '=DATE(2013;1;1)'이며 다음을 생성합니다. '01.01.2013' 지금까지 - 아주 좋았습니다. 엑셀 날짜() 함수에서 날짜를 읽는 아파치 poi가 잘못된 날짜를 나타냄

내가 할 POI 라이브러리이 파일을 읽기 :

XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File("/home/detlef/temp/test.xlsx"))); 
XSSFSheet sheet = workbook.getSheet("Sheet A"); 
XSSFCell cell = sheet.getRow(0).getCell(0); 
System.out.println(cell.getDateCellValue()); 

이 출력됩니다 : 나는 POI 3.9을 사용하고

Sun Dec 31 00:00:00 CET 1899 

.

아무도 왜 이런 일이 일어 났는지 말해 줄 수 있습니까?

그것을 할 수있는 방법을 찾았습니다

if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { 
    FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
    CellValue evaluate = evaluator.evaluate(cell); 
    Date date = DateUtil.getJavaDate(evaluate.getNumberValue()); 
    System.out.println(date); 
} 

생산하고 그 :

Tue Jan 01 00:00:00 CET 2013 

감사 어쨌든. 당신이 설명했다

답변

3

모든 것은 완전히 정확하고

엑셀 저장 셀에 수식뿐만 아니라 그것을 수식 자체 (A .XLSX에서 문자열, 또는 .XLS에 대한 분석 토큰 형태 중 하나를 저장 않습니다

예상), 해당 수식의 마지막 평가 응답도 저장합니다. 즉, Excel이로드 될 때 표시 할 수식 결과를 계산하는 연령대를 갈아 치울 필요가 없으며 다른 셀과 마찬가지로 마지막 값으로 렌더링 할 수 있습니다. 당신이 당신의 엑셀 변경 아파치 POI로 파일을 만들 때, 당신은 모든 캐시 된 공식 값을 업데이트하는 평가를 실행해야하는 이유

이있다, 그래서 당신은 해당 셀

에 가기 전에 그것은 Excel에서 바로 보이는 그러나 Excel에는 휘발성으로 정의 된 몇 가지 특수 수식 함수가 있습니다. 이 함수는 매번 다른 값을 항상 반환하는 함수입니다 (예 : DATE).이 Excel에서는 셀에 더미 값 (예 : 0 또는 -1)을 쓰고로드시 다시 평가합니다.

읽을 때 POI에있는 수식 셀의 숫자 값은 캐시 된 값을 다시 돌려줍니다. POI가 수식을 평가하도록하려면

Excel의 날짜는 1900 년 1 월 1 일 또는 1 월 1 일부터의 부분 일수로 저장됩니다 (깃발에 따라 다름).). 값 -1은 1899 년 12 월 31 일이므로 Excel에서 -1을 쓰고 날짜로 요청하면 표시됩니다.

관련 문제