java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell 에러 해결

에러 상황

cannot get a STRING value from a numeric cell
[그림 1] 에러 로그

 

 

Spring에서 Apache POI를 통해 엑셀 파일을 읽으려고 했다.

 

그런데 연도(year) 셀을 읽을 때 cannot get a STRING value from a numeric cell 라는 에러가 발생했다. 

 

해당 에러는 숫자가 입력된 셀에서 String을 추출하려고 할 때 발생한다.

 

그런데 엑셀 파일에서 해당 셀을 확인해보니 셀 서식이 텍스트로 되어있었다.

 

아파치 POI 라이브러리가 좀 멍청한건지, 숫자로 써져있어도 셀 서식이 텍스트면 String으로 읽어야 하는데 숫자로 읽는것 같다.

 

해결법

해결법 1

row.getCell(1).setCellType(CellType.String);
year = row.getCell(1).getStringCellValue();

 

첫번째 방법은 셀타입을 강제로 바꾸는 것이다. 

setCellType() 메서드를 통해 셀타입을 본인이 원하는 타입으로 변환하면 값을 원하는대로 읽을 수 있다.

 

하지만 이 방법은 setCellType() 메서드가 deprecated 됐기 때문에 추천하지 않는다.

 

 

해결법 2

if (row.getCell(1).getCellType() == CellType.NUMERIC) {
    year = String.valueOf(row.getCell(1).getNumericCellValue());
} else {
    year = row.getCell(1).getStringCellValue();
}

 

두번째 방법은 셀타입을 체크한 뒤 셀타입에 맞게 값을 읽은 뒤 그 값을 형변환하는 방법이다.

 

예를 들어 해당 셀 타입이 NUMERIC인데 String으로 읽고 싶다면, getNumericCellValue() 메서드로 값을 읽은 뒤

String.valueOf() 메서드로 형변환을 해주는 것이다.

 

나는 위와 같은 방법으로 문제를 해결했다. 

 

해결법 3

마지막 방법은 try-catch 문으로 에러가 발생할 경우에 처리해주는 방법이다.

try{
    year = row.getCell(1).getStringCellValue();
}catch(IllegalStateException e){
    String.valueOf(row.getCell(1).getNumericCellValue()); 
}

 

본인이 판단하기에 가장 효율적이라고 생각하는 방법을 택하면 될 것 같다.

 

반응형

댓글

Designed by JB FACTORY