에러 해결
java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell 에러 해결
연구소장 J
2024. 1. 31. 10:05
에러 상황
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());
}
본인이 판단하기에 가장 효율적이라고 생각하는 방법을 택하면 될 것 같다.
반응형