본문 바로가기
SpringBoot

[Spring Boot] 09. Excel Download (POI, JXLS)

by 청양호박이 2019. 11. 16.

개발을 하다보면, Application을 통해 제공하는 Data가 자체 View로 보여주는 방법이 있을 수 있고... 아니면 타 시스템에 REST API를 통해서 전단해주는 방법... 그리고 사용자가 원할경우, 통계나 이력등에 대한 내용을 Excel로 Download가 가능할 필요가 있습니다. 

 

이번에는 MVC구조에서 사용자가 Controller로 Excel Download에 해당하는 Request URL을 선택하고, 내부적으로 업무 로직인 Service를 통해 Mapper로 가져온 데이터를 Excel로 변환하여 제공하는 방법에 대해서 알아보겠습니다. 여러가지 방법이 있겠지만 대표적으로 POI("포이")와 JXLS("제이엑셀")이 있습니다.

 

이번 블로그에는 JXLS를 사용하겠지만, 가볍게 POI란 무엇인가를 먼저 살펴보겠습니다.

 

Apache POI란? JAVA API for microsoft documents

(아파치 재단에서 MS Office파일 포맷을 JAVA로 읽고 쓰는 기능을 제공)

https://poi.apache.org/

 

Apache POI - the Java API for Microsoft Documents

Apache POI - the Java API for Microsoft Documents Project News 20 October 2019 - POI 4.1.1 available The Apache POI team is pleased to announce the release of 4.1.1. This release features performance improvements while writing large xlsx files, improved ch

poi.apache.org

역시 세부적인건 공식사이트를 참조하면 됩니다~~!!

 

그럼 JXLS를 한번 구현해 볼까요?? 단계는 아래의 순서로 진행합니다.

  • JXLS Dependency 설정
  • 구현하기
  • 확인하기
  • 발생 가능한 Exception 확인

 

1. JXLS Dependency 설정


Jxls is a small Java library to make generation of Excel reports easy. Jxls uses a special markup in Excel templates to define output formatting and data layout.

 

우선 그냥 JXLS의 공식 사이트에 접속합니다. (언제나 그렇듯...)

http://jxls.sourceforge.net/

 

JXLS -

Jxls v2.7.1 is released! This is a bugfix release for issue#184 jx:if within jx:each may cause problem The latest component versions org.jxls:jxls:2.7.1 org.jxls:jxls-poi:1.3.1 org.jxls:jxls-reader:2.0.6 Introduction Jxls is a small Java library to make ge

jxls.sourceforge.net

메뉴를 잘 찾아보면... 가이드를 제공해주는 Getting Started 를 확인해 봅니다.

 

 

아주 명확하게 어떤 Dependency를 추가해야 하는지 알려줍니다. 따로 Maven Repository를 접속할 필요도 없습니다.

		<!-- JXLS dependency -->
		<dependency>
		    <groupId>org.jxls</groupId>
		    <artifactId>jxls</artifactId>
		    <version>2.7.0</version>
		</dependency>
		<dependency>
		    <groupId>org.jxls</groupId>
		    <artifactId>jxls-poi</artifactId>
		    <version>1.3.0</version>
		</dependency>
		<dependency>
		    <groupId>org.jxls</groupId>
		    <artifactId>jxls-jexcel</artifactId>
		    <version>1.0.9</version>
		</dependency>

 

2. 구현하기


JXLS를 사용하는 방법은 다음의 절차로 수행이 됩니다.

  • Excel Template 작성
  • Excel Template 업로드
  • 요청을 받는 Controller에 RequestMapping 항목 생성
  • Service 로직 구현

[Excel Template 작성]

    - jx:area(lastCell="셀") - 명령어 영역의 마지막 셀. 이 이외의 셀에서는 명령어를 입력해도 실행되지 않음

    - jx:each(items="context명" var="Model명" lastCell="셀")

        (1) items : Spring Boot에서 생성한 컨텍스트 변수이름 , 반드시 이름을 맞춰야 정상동작 합니다.

        (2) var : 엑셀내에서 해당 컨텍스트를 사용할 변수 명 , 엑셀 셀 내에 ${var이름.속성명}으로 동작함

 

[Excel Template 업로드]

    - 아래의 경로에 위에 작성한 Template파일을 올려 놓습니다.

 

[Controller 작성]

    - 기존 UserController.java에 추가 작성하며, 따로 리턴값은 없으며, Service의 method만 호출

	@ApiOperation(httpMethod = "GET"
			,value = "Excel Download"
			,notes = "Excel Download User List")
	@RequestMapping(value = "/download", method = RequestMethod.GET)
	public ResponseEntity<?> downExcel(HttpServletRequest request, HttpServletResponse response){
		
		L.info("Download Start");
		
		userService.downExcel(request, response);		
		return ResponseEntity.ok().build();
	}

 

[Service 작성]

	public void downExcel(HttpServletRequest request, HttpServletResponse response) {

		response.setContentType("application/msexcel");
		response.setHeader("Content-Disposition", "attachment; filename=\"TestDown.xlsx\"");
		
		try {
			InputStream io = new ClassPathResource("templates/download_template.xlsx").getInputStream();
			OutputStream os = response.getOutputStream();
			
			ArrayList<UserDTO> dataList = selectUser();
			
			Context context = new Context();
			context.putVar("dataList", dataList);
			
			JxlsHelper.getInstance().processTemplate(io, os, context);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

 

3. 확인하기


브라우저에서 해당 경로를 입력하면, 엑셀이 다운로드됩니다. 열어보면, User table에 있는 데이터를 받아서 List로 뿌려줍니다.

성공이네요~!!

 

 

4. 발생가능한 Exception 확인하기


[Template 파일이상]

java.io.IOException: Your InputStream was neither an OLE2 stream, nor an OOXML stream

   = 이 경우는, 해당 Excel Template파일이 암호화 되어있는 경우 주로 발생함 / 암호화를 풀고 다시 업로드하여 시도

 

 

그럼 이만 마치겠습니다.

 

-Ayotera Lab-

 

 

 

댓글