Spring Boot 2.0을 이용한 엑셀 다운로드 구현 방법
Spring Boot 2.0을 이용하여 간편히 excel을 다운로드 하는 방법을 가이드 해드리겠습니다.
우선 pom.xml 파일에 maven dependency 추가 합니다. spring boot는 기본적으로 셋팅되었다는 가정하에 진행하겠습니다.
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
엑셀 다운로드를 위한 propertis 정의합니다. 저는 properties 파일을 yml파일을 사용하기 때문에 아래와 같이 정의합니다. 가이드하는 예제에서는 아래 내용을 정의하지 않아도 예제를 구현하는데 문제가 없습니다. 필요가 없으신 분들은 넘어 가셔도 됩니다.
application.yml
spring:
mvc:
contentnegotiation:
favor-parameter: true
favor-path-extension: true
media-types:
xls: application/vnd.ms-ecel
- favor-parameter: 이 값이 true면 ContentNegotiationViewResolver가 format 파라미터로 지정한 미디어 타입을 사용하도록 설정
- favor-path-extension: 이 값이 true면 ContentNegotiationViewResolver가 확장자로 지정한 미디어 타입을 사용하도록 설정
- media-types.타입: 타입에 해당하는 컨텐츠 타입을 지정
Xls 뷰를 생성합니다. 간단히 첫 행에는 타이틀을 넣고 2번째 행에 간단한 샘플 데이터를 넣는 예제입니다.
다운로드 파일명을 변경하시고 싶으시면 response header에서 filename 값을 변경하시면 다운로드하는 파일명을 변경할 수 있습니다. 그리고 주의할게 컴퍼는트를 정의하셔야 컨트롤러에서 해당 뷰를 찾을 수 있습니다. 컴퍼넌트 설정은 @Component("sampleXls") 이렇게 하시면 됩니다.
SampleXlsView.java
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractXlsView;
@Component("sampleXls")
public class SampleXlsView extends AbstractXlsView {
@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.setHeader("Content-Disposition", "attachment; filename=\"sample.xls\"");
CellStyle numberCellStyle = workbook.createCellStyle();
DataFormat numberDataFormat = workbook.createDataFormat();
numberCellStyle.setDataFormat(numberDataFormat.getFormat("#,##0"));
Sheet sheet = workbook.createSheet("sample_sheet");
Row row0 = sheet.createRow(0);
Cell cell0 = row0.createCell(0);
cell0.setCellValue("날짜");
Cell cell1 = row0.createCell(1);
cell1.setCellValue("이름");
Cell cell2 = row0.createCell(2);
cell2.setCellValue("연봉");
Row row1 = sheet.createRow(1);
cell0 = row1.createCell(0);
cell0.setCellValue("2019-01-01");
cell1 = row1.createCell(1);
cell1.setCellValue("홍길동");
cell2 = row1.createCell(2);
cell2.setCellType(CellType.NUMERIC);
cell2.setCellValue(1000000);
cell2.setCellStyle(numberCellStyle);
}
}
다음으로는 뷰를 호출하기 위한 Controller입니다. Get Method로 작성하였고 /download/sample 로 호출하시면 xls를 다운로드 받을 수 있습니다. 중요한건 여기서 media type을 지정을 해주셔야 합니다. 아래 보시면 produces에 xls 타입을 지정한 것을 보실 수 있습니다. 타입을 지정해주셔야 "sampleXls" 컴퍼넌트를 리턴시 xls타입의 뷰가 다운로드 되게 됩니다. 여기서 sampleXls는 위에 작성한 뷰입니다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ExcelDownloadController {
@GetMapping(path="/download/sample", produces = "application/vnd.ms-excel")
public String downloadExcel() {
return "sampleXls";
}
}
다음은 다운로드를 위한 html 소스입니다. 간단하기 때문에 설명은 생략하겠습니다.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>엑셀 다운로드 예제</title>
</head>
<body>
<a href="/download/sample">엑셀 다운로드</a>
</body>
</html>
화면을 띄우고 다운로드 링크를 누르면 정상적으로 sample.xls 파일이 다운로드 되는 것을 확인할 수 있습니다.