에러 상황
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());
}
본인이 판단하기에 가장 효율적이라고 생각하는 방법을 택하면 될 것 같다.
반응형
'에러 해결' 카테고리의 다른 글
Ambiguous handler methods mapped for HTTP Method 에러 해결법 (0) | 2024.03.19 |
---|---|
윈도우 원격 데스크롭 연결 오류 'credssp 암호화 오라클 수정 때문일 수 있습니다' 해결 방법 (0) | 2024.03.12 |
Redis 오류 NOAUTH Authentication required 해결법 (0) | 2024.01.16 |
[에러] Feign Client로 multipart/form-data 보낼 때 required part ... is not present 오류 해결법 (0) | 2023.12.18 |
오즈리포트 들어오는 TDS(Tabular Data Stream)의 RPC(원격 프로시저 호출) 프로토콜 스트림이 잘못되었습니다... 에러 해결법 (0) | 2023.11.10 |