apache poi로 엑셀의 셀 값을 읽을 때, 셀 서식과 맞지 않는 메소드를 사용하면 아래처럼 오류가 발생한다.
(이 경우는 서식이 숫자인 셀을 getStringCellValue 메소드로 읽기 시도한 경우)
Error Message
Cannot get a STRING value from a NUMERIC cell
읽으려고 시도하는 셀의 값과 서식을 미리 알고 있는 경우도 있다.
하지만 반대로 그렇지 않은 경우도 있기 때문에 아래와 같은 함수를 만들고 활용해야 한다.
private static String returnStringValue(Cell cell) {
CellType cellType = cell.getCellType();
switch (cellType) {
case NUMERIC:
double doubleVal = cell.getNumericCellValue();
return String.valueOf(doubleVal);
case STRING:
return cell.getStringCellValue();
case ERROR:
return String.valueOf(cell.getErrorCellValue());
case BLANK:
return "";
case FORMULA:
return cell.getCellFormula();
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
default:
return "";
}
}
case 세분화 - 사용자 지정 날짜 형식 처리
아래처럼 셀 서식을 사용자 지정 형식으로 설정한 경우 조건문에 세분화가 필요하다.
CellType을 NUMERIC으로 판단하여 getNumericCellValue 메소드를 사용, 값을 찍어보면 39966.0이라는 숫자가 나온다.
NUMERIC 타입 중에서도 날짜인 경우에는 DateUtil 클래스를 사용하여 한번 더 검사해야 한다.
HSSFDateUtilDateUtil 은 최신 버전의 apache poi에서 deprecated 되었다.
org.apache.poi.ss.usermodel.DateUtil 클래스를 사용해야 한다.
case 세분화 - 수식(formular) 처리
getCellFormula() 메소드를 사용해서 수식이 입력된 셀값을 찍으면 수식이 그대로 표시된다.
수식에 의한 결과값을 얻어 내려면 evaluateInCell() 메소드를 사용해야 한다.
완성된 case문
private static String returnStringValue(XSSFWorkbook workbook, Cell cell) {
CellType cellType = cell.getCellType();
switch (cellType) {
case NUMERIC:
double doubleVal = cell.getNumericCellValue();
if (DateUtil.isValidExcelDate(doubleVal)) {
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd");
return String.valueOf(dateFormatter.format(cell.getDateCellValue()));
} else {
return String.valueOf(doubleVal);
}
case STRING:
return cell.getStringCellValue();
case ERROR:
return String.valueOf(cell.getErrorCellValue());
case BLANK:
return "";
case FORMULA:
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter dataFormatter = new DataFormatter();
// System.out.println(cell.getCellFormula()); // 수식 그대로
return dataFormatter.formatCellValue(evaluator.evaluateInCell(cell)); // 수식 결과
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
default:
return "";
}
}
'코딩 > JAVA & JSP' 카테고리의 다른 글
Eclipse - 이클립스, JDK, 스프링 STS3 요구(호환) 버전 (0) | 2024.12.03 |
---|---|
JAVA - selenium을 사용한 웹페이지 크롤링(인스타그램 이미지) (0) | 2022.06.15 |
Log4j2 configuration - No log4j2 configuration file found (0) | 2016.09.05 |
JAVA - apache poi 모든 셀 읽기 (0) | 2016.09.05 |
[JDBC, MySQL 연동] select 결과 배열, HashMap으로 저장 (0) | 2016.08.22 |