본문 바로가기
Java, JSP

Apahce poi 엑셀 읽기(파싱)

by 수앙 2016. 7. 31.

엑셀 2007 이전 xls

엑셀 2007 부터 xlsx

에 대한 처리를 지원하는 Apache poi에 대해서 알아본다.

 

poi는 아파치 오픈 소스로서 엑셀을 읽거나 쓸 수 있다.

여기선 읽는 부분에 대해서 살펴보겠다.

 

홈페이지: http://poi.apache.org/

여기선 poi-3.14 버전으로 구현

 

기본적으로 엑셀을 읽는데 크게 2개의 클래스를 아래와 같이 제공한다.

  • HSSF: xls 읽기
  • XSSF: xlsx 읽기

확장명에 따라 처리가 가능하지만 2개를 나누어서 처리하기보다

WorkbookFactory.create를 쓰면 쉽게 처리가 가능하다.

 

예제

// 엑셀파일, 패스워드, 읽기전용
// 첫 번째 인자 엑셀 파일은 타입에 따라 생성 클래스가 다른데 살펴볼 필요가 있다.
Workbook workbook = WorkbookFactory.create(new File(excel), null, true);

// Cell에 값이 없을 경우 빈 값으로 가져오기
workbook.setMissingCellPolicy(MissingCellPolicy.CREATE_NULL_AS_BLANK);

// 수식된 값을 가져오기 위함
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();

// 0번째 시트를 가져옴
Sheet sheet = workbook.getSheetAt(0);

// 첫 번째 row부터 마지막 row까지 처리
for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
    // 첫 번째 column부타 마지막 column까지 처리
    for (short j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
        // Cell 타입 -> 수식일 경우는 수식이 적용된 값의 타입
        int cellType = (cell.getCellType() == Cell.CELL_TYPE_FORMULA)
                ? evaluator.evaluateFormulaCell(cell) : cell.getCellType();

        // Cell 타입에 따라 분기 처리
        switch (cellType) {
        case Cell.CELL_TYPE_NUMERIC:
            // 날짜 형태도 숫자로 인식하기 때문에 아래와 같이 날짜형태인 확인
            // 날짜에 문자가 있을 경우 예로 2016년 1월 1일 이럴 경우는 인식이 안되는 듯 하는데 확인 필요
            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                format.format(cell.getDateCellValue());
            } else {
                DecimalFormat df = new DecimalFormat();
                df.format(cell.getNumericCellValue());
            }
            break;
        default:
            cell.getStringCellValue();
            break;
        }
    }
}

 

끝.

댓글