Spring

[Spring] - jxls로 간편하게 엑셀업로드 구현하기

김종현 2021. 1. 1. 22:57

저번장에는 jxls로 엑셀다운로드에 대해 다뤄보았는데 이번에는 엑셀업로드에 대해 예제와 함께 알아보자.
내용이 복잡하지 않고 약간의 설정만 추가해주면 된다.

jxls 의존성 등록

저번장에 등록해두었던 의존성을 추가하자 (이미 추가되있으면 하지않아도 된다.)

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-reader</artifactId>
    <version>2.0.5</version>
</dependency>

엑셀파일 생성

사용자에게 데이터를 입력받을 샘플 엑셀파일을 생성하자.
그리고 만들어둔 샘플 엑셀파일을 아래사진처럼 src/main/resources/template/excel 하위경로에 옮겨두자

 

xml 파일생성

해당양식에 맞는 xml파일을 생성하고 샘플엑셀파일과 동일한 경로에 옮겨두자.
그리고 각 태그들의 속성이 무엇을 의미하는지 알아보자.

 

Line 3

엑셀데이터가 작성되있는 Sheet의 인덱스 번호 및 Sheet 이름을 매핑한다.
엑셀파일에 명시된 Sheet이름 또는 Sheet의 인덱스번호를 적어준다.

 

Line 4

엑셀데이터를 읽어드릴때 건너뛸 셀의 로우영역을 지정한다.
위에 엑셀파일 생성사진부분을 보면 엑셀파일의 제목영역(A1 ~ A2)과 엑셀데이터의 헤더영역(A3)은 사용자가 입력한 데이터가 아니기 때문에 데이터를 읽어드릴때 해당영역은 무시하게된다. 해당값의 기준은 인덱스이다.

 

Line 5

엑셀데이터를 읽어드린 후 java객체와 매핑하여 값을 주입시켜준다.
startRow는 실제로 사용자가 데이터를 입력하는 행의 로우 인덱스번호를 말하며 endRow는 startRow와 값을 일치시켜주면된다. varType은 해당 데이터가 바인딩될 java 객체를 명시해주면 되고 items는 엑셀데이터들의 key값이 되며 var는 items에 매핑된 데이터들을 한 로우씩 꺼내어 저장한다.

 

Line 6 ~ 9

6라인에는 5라인에 명시되었던 startRow와 endRow의 값과 똑같은 값을 적어준다. (해당 로우부터 데이터를 읽어드린다는 것)
7라인에서 col='0'은 각 행의 맨 좌측 셀을 인덱스0번으로 잡고 데이터를 java 객체에 매핑시켜준다.
현재 위 사진에 A4행 인덱스 0번에 해당하는 셀은 '제목'이니 java 객체에 title 이라는 필드에 사용자가 입력한 데이터를
바인딩 한다.

 

Line 10 ~ 12

해당영역은 반복문의 break와 같다고 생각하면된다. 반복문을 빠져나올 조건을 명시해주면되는데 rowcheck offset='0'은
한행 한행씩 읽어드릴때 각 행의 모든셀이 비어있다는 조건이다.

엑셀파일 업로드

엑셀업로드 화면에서는 아까 만들어두었던 샘플파일을 사용자로부터 다운로드하게끔 하고
작성한 엑셀파일을 업로드하여 서버에 정상적으로 값이 오는지 확인해보자

샘플양식 다운로드

샘플양식파일을 다운로드받는 코드인데 현재 위와 같이 코드를 작성하면 매핑된 컨트롤러가 없기때문에
404가 나오게 된다. 아래와 같이 설정파일을 생성하고 해당코드를 추가하자.

 

/template 경로로 요청이 들어올경우 클래스패스의 하위디렉토리인 template의 하위경로로 요청이 전송된다.

엑셀파일 데이터 입력

엑셀파일 업로드

정상적으로 엑셀에 입력된 데이터가 업로드되어 java 객체에 매핑되었다. 근데 여기서 주의할점이 한가지 있다.
위사진의 화살표 표시한부분의 key값이 'studyList'인데 이 값은 위에서 생성한 xml파일의 items의 값과 동일해야한다.
만일 두개의 값이 서로 맞지않다면 아래와 같은 Exception이 발생하게 된다.

 

반복문 탈출조건 변경

xml파일 사진의 Line 10 ~ 12의 반복문 탈출조건을 다음처럼 변경할 수 도있다.

cellcheck를 별도로 추가해주면 된다. 위처럼 작성하게되면 한행한행씩 읽어드릴때
셀 인덱스 0번에 '오늘은 그만해야지' 라는 데이터가 있으면 다음행에 데이터가 있어도 읽어드리지 않고 빠져나온다.
직접 테스트해보자.

엑셀파일 데이터 수정

엑셀파일 업로드

 

데이터 중간에 반복문 탈출조건에 맞는 값을 넣고 다음행에 데이터를 입력해보았지만 해당데이터는 읽어드리질 않았다.
나중에 유용하게 쓰일것 같아서 이것도 한번 정리해보았다. ㅎㅎ

728x90