엑셀 업로드 기능 쉬울 것 같지만, 왜 손이 많이 가는 기능 개발일까?
엑셀에 저장된 데이터를 데이터베이스에 등록하는 과정은 얼핏 보면, 쉬울 것 같은데 사실 내가 경험한 그냥 쉬운 기능 개발은 아니지만, 다른 직원들은 쉽게 생각하고 개발 일정을 넉넉히 잡지 않고 스케줄을 제출합니다.
엑셀 업로드는 엑셀 양식만 정해 놓으면 데이터베이스에 저장하는 게 쉽다고 생각하는데, 쉽지 않습니다.
오늘은 왜 엑셀에 저장된 데이터를 데이터베이스에 저장하는 기능이 왜 어려워지는 내 경험을 이야기해보려고 합니다.
엑셀 파일에서 데이터를 읽어오기 전에 양식을 체크한다.
규정된 엑셀 양식을 다운로드하여 올려야 하지만, 실무자마다 양식을 마음대로 바꾸거나 아예 본인이 양식을 만들어서 올리는 경우도 있다. 맞지도 않는 엑셀 양식을 올리고, 기능이 안 된다고 한다. 안 되는 게 당연하다. 그래서 양식이 맞지 않으면 아예 양식이 맞지 않는다고 알림 창으로 안내를 해야 한다.
- 시트 이름을 확인, 시트의 개수 확인
- 열의 개수, 열의 명칭이 맞는지 확인
- 각 열의 이름과 순서가 맞는지 체크
- 첫 번째 행이 헤더로 포함 유무
- 필수 입력 데이터가 포함되어 있는지 체크
- 비밀번호가 걸린 문서인지 체크
"O번째 행의 O열은 지정된 양식이 아닙니다."라는 식으로 안내를 해줘야 할 수도 있다.
참고로, 아래 코드는 엑셀 시트명과 엑셀이 비워있는지 체크하는 코드입니다.
/* 엑셀 시트명 확인과 데이터가 있는지 체크 */
Sheet sheet = workbook.getSheet("규정된시트이름");
if (sheet == null) {
throw new IllegalArgumentException("시트 이름이 맞지 않습니다.");
}
int rowCount = sheet.getPhysicalNumberOfRows();
if (rowCount == 0) {
throw new IllegalArgumentException("데이터가 없습니다.");
}
엑셀 파일의 버전 문제로 읽어오기가 안될 수도 있다.
아직까지. xls 확장자로 저장되는 버전의 엑셀 프로그램을 쓰시는 분들도 있기 때문이다. 규정된 엑셀 양식은. xlsx로 올리면 된다고... 실제 시스템을 유지보수 해보면 이런 버전 차이 때문에 문제가 되는 경우가 의외로 많다.
현재 엑셀파일을 읽어오는 오픈소스 중에 가장 많이 쓰는 오픈소스 POI는 엑셀파일을. xls로 사용할지,. xlsx로 사용할지에 따라서 엑셀에서 열의 값을 얻어오는 코드는 조금 다르기 때문에, xlsx 버전으로 읽어오는 코드를 작성했는데 파일이. xls로 들어오면 데이터를 엑셀에서 읽어올 수 없다.
만약, 2가지 버전을 다 올릴 수 있도록 해야 한다면 개발자는 2가지 버전의 코드를 만들어야 한다. 코딩 시간이 1.5배는 더 늘어가는 걸 예상해서 스케줄을 잡아야 한다.
참고로, 아래는 엑셀 파일인지 체크하는 소스입니다.
/* 엑셀 파일 형식 체크 */
String fileExtension = FilenameUtils.getExtension(fileName);
if (!fileExtension.equals("xls") && !fileExtension.equals("xlsx")) {
throw new IllegalArgumentException("지원하지 않는 파일 형식입니다.");
}
셀서식 또는 수식 때문에 오류가 날 수 있다.
규정된 엑셀양식의 셀서식은 "텍스트"로 지정되어야 데이터를 읽어오는데 오류가 적은 편인데, 규정된 엑셀양식에 여러 셀서식이 있는 경우라면 셀서식에 맞게 데이터는 가져와야 한다.
규정된 엑셀 양식에 들어오는 데이터 형식이 숫자형, 날짜형이 있을 수 있는데 이렇게 숫자형, 날짜형으로 오는 경우 사용자들이 엑셀에 수식을 넣는 경우가 있다.
숫자형의 경우, 엑셀 수식이 있어서 데이터 읽을 때 문제가 된다.
합산 또는 평균 데이터가 있는 셀에서 엑셀 수식을 사용해서 값이 계산된 데이터라면 엑셀에서 데이터를 읽어오면 수식값이 들어오고, 계산된 값이 들어오지 않는다. 때문에 엑셀 업로드 시에는 수식을 사용하면 안 된다고 해야 한다.
날짜형의 경우, 날짜형식으로 데이터를 읽지 못 하는 경우도 있다.
날짜 셀서식으로 지정하면 사용자는 엑셀의 입력 규정대로 20241213 이렇게 입력하더라도 수식에 의해서 2024-12-13 이렇게 입력해야 하는데, 이럴 경우 데이터베이스 칼럼 사이즈보다 커서 입력 오류가 날 수도 있다.
/* 셀 서식을 확인 */
CellType cellType = cell.getCellType();
if (cellType == CellType.NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
// Date 객체를 로컬 날짜 형식으로 변환
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(date);
System.out.println("날짜 값: " + formattedDate); // 출력: 2024-12-15
} else {
// 일반 숫자로 처리
double numericValue = cell.getNumericCellValue();
System.out.println(numericValue);
}
} else if (cellType == CellType.STRING) {
String textValue = cell.getStringCellValue();
System.out.println(textValue);
}
엑셀 업로드 기능이 단순할 것 같지만, 어떤 예외적인 데이터로 인해 업로드 과정에서 오류가 발생할지 아무도 모릅니다.
엑셀 파일을 100개 샘플로 테스트 후, 기능을 오픈했다가도 며칠 만에 100개의 샘플에서 발견되지 않은 예외적인 데이터(특수기호, 다국어 등)로 인해 코드를 수정해야 할 수도 있습니다.
엑셀 업로드 기능을 너무 단순하게만 생각하지 말고, 위에서 언급된 내용을 미리 체크하여 일정을 확인하셔야 할 것 같습니다.
'IT인터넷' 카테고리의 다른 글
효과적으로 주간보고를 받기 위한 보고서 양식 (0) | 2024.12.16 |
---|---|
회사에서 전화 받을 때 알아두면 좋은 팁 (1) | 2024.12.14 |
신입직원이 알아야 할 문서 작성의 기본 (0) | 2024.12.13 |
ChatGPT 사용 해보지 않았다면, 간단한 질문부터 시작한다. (2) | 2024.12.12 |
댓글