본문으로 바로가기

JAVA - apache poi 셀 서식 판단하여 값 읽기

category 코딩/JAVA & JSP 2016. 8. 31. 15:29

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 "";
	    }

	}