엑셀의 내용을 도메인클래스에 셋팅하는 유틸리티 클래스를 만들어보았습니다.
우선 메소드는 아래와 같습니다.
/**
* @param excelFile : 읽어들일 엑셀파일
* @param clazz : 읽어들인 엑셀파일의 내용을 셋팅할 Domain 클래스
* @return 읽어들인 엑셀파일의 내용이 셋팅된 Domain 클래스 리스트
*/
public static <T> List<T> excelToDomain(File excelFile, Class<T> clazz)
만들면서 발생했던 이슈는,
처음에는 Domain 클래스의 setter 메소드를 엑셀의 셀의 순서대로 호출하는 것이였습니다.
이렇게 엑셀 데이터를 순차적으로 setter 메소드에 Reflection을 사용하여 셋팅하려 했습니다.
그런데 이 방법은 너무 위험해보였습니다.
하여,
public @interface ExcelOrder {
int value();
}
위와 같은 어노테이션을 만들고 엑셀의 데이터가 셋팅될 setter 메소드에 위의 에노테이션을 선언해주도록 했습니다.
@ExcelOrder(value=1)
public void setProcDt( Date procDt ){
this.procDt = procDt;
}
이런식으로요 ..
여기서 @ExcelOrder 의 value 값에 따라 셀의 값이 셋팅이 되도록 했습니다.
value 가 1 이면 A셀의 값이, 2 이면 B셀의 값이 셋팅되도록 했습니다.
처음에는 @ExcelOrder 어노테이션이 선언된 메소드를 추출하여, value 값에 따라 comparator 를 구현하여 sorting 되도록 했는데, 생각해보니 value 를 키로, Method 를 value 로 한 Map 이 더 나은것 같아서 변경했습니다.
최종적으로 테스트해보니 잘 돌아가네요 .. ㅎㅎ
소스를 업로드합니다.
필요하신분은 가져가셔서 사용하세요 ~
프로젝트가 스프링프레임워크 기반이여서 스프링에서 제공되는 각종 유틸리티 클래스를 사용하였습니다.
엑셀 라이브러리는 아파치 포이 사용하였구요.