Hello

Apache poi excel 읽기 빈 값(null), 숫자를 문자로 읽기 본문

java

Apache poi excel 읽기 빈 값(null), 숫자를 문자로 읽기

nari0_0 2023. 4. 6. 18:29
728x90

Excel 빈값 처리

Row.MissingcellPolicy 클래스는 null 및 빈 셀의 경우 다른 가능한 정책을 지정하는 데 사용한다.

Row 클래스는 3개의 final MissingCellPolicy 필드를 갖고 있다.

/** Missing cells are returned as null, Blank cells are returned as normal */
public static final MissingCellPolicy RETURN_NULL_AND_BLANK = new MissingCellPolicy();
/** Missing cells are returned as null, as are blank cells */
public static final MissingCellPolicy RETURN_BLANK_AS_NULL = new MissingCellPolicy();
/** A new, blank cell is created for missing cells. Blank cells are returned as normal */
public static final MissingCellPolicy CREATE_NULL_AS_BLANK = new MissingCellPolicy();

RETURN_NULL_AND_BLANK - 누락된 셀은 null로 반환되고, 빈 셀은 정상적으로 반환됩니다.

RETURN_BLANK_AS_NULL - 누락된 셀과 빈 셀은 null로 반환됩니다.

CREATE_NULL_AS_BLANK - 누락된 셀은 새로운 빈 셀이 생성해 반환되고, 빈 셀은 정상적으로 반환됩니다.

 

나는 XSSF (*.xlsx 파일) 컴포넌트를 사용했기 때문에 아래 XSSFCell.getCell() 소스를 갖고왔다.

getCell() 내부적으로 policy를 구분해 리턴하는 것을 확인할 수 있다.

public XSSFCell getCell(int cellnum, MissingCellPolicy policy) {
   if(cellnum < 0) throw new IllegalArgumentException("Cell index must be >= 0");

    XSSFCell cell = _cells.get(cellnum);
   if(policy == RETURN_NULL_AND_BLANK) {
      return cell;
   }
   if(policy == RETURN_BLANK_AS_NULL) {
      if(cell == null) return cell;
      if(cell.getCellType() == Cell.CELL_TYPE_BLANK) {
         return null;
      }
      return cell;
   }
   if(policy == CREATE_NULL_AS_BLANK) {
      if(cell == null) {
         return createCell((short)cellnum, Cell.CELL_TYPE_BLANK);
      }
      return cell;
   }
   throw new IllegalArgumentException("Illegal policy " + policy + " (" + policy.id + ")");
}

getCell 메소드 사용 시 예) 

String cell2 = row.getCell(2).getStringCellValue(); // getCell(2) == null 인경우 NullPointerException 발생
String cell3 = row.getCell(3, Row.CREATE_NULL_AS_BLANK).getStringCellValue(); // getCell(3) == null 인경우 new Cell() 리턴

숫자 셀 문자로 처리

cell type을 문자로 변경 후 cell을 가져오면 된다:)

row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
String cell2 = row.getCell(2).getStringCellValue();

참고 :

https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Row.html

https://poi.apache.org/components/spreadsheet/quick-guide.html#Iterator

https://stackoverflow.com/questions/36776745/missing-cell-policy-of-apache-poi-java

 

728x90