사전 작업
엑셀파일은 생성하기 위한 템플릿 파일이 필요하다.
출력하고자 하는 데이터와 엑셀 템플릿 파일을 불러와 데이터를 템플릿 파일에 쓰는 형식으로 동작한다.
저렇게 jstl 형식으로 적으면 collection 일 경우 자동으로 반복문이 돌아 데이터를 쓰게 된다.
템플릿 파일의 위치는 다음과 같다.
해당 위치에 템플릿 파일을 위치시키고 작업을 진행한다.
엑셀 파일 생성 및 다운로드
- MakeExcel 클래스 생성
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
// MakeExcel이라는 클래스를 만들고 그 안에 download라는 메소드를 생성한다.
public class MakeExcel {
public void download(HttpServletRequest request, HttpServletResponse response,
Map<String, Object> bean, String fileName, String templateFile, String string)
throws ParsePropertyException, InvalidFormatException {
// 받아오는 매개변수 bean는 디비에서 뽑아온 데이터
// fileName 은 다운로드 받을때 지정되는 파일명
// templateFile 는 템플릿 엑셀 파일명이다.
// tempPath는 템플릿 엑셀파일이 들어가는 경로를 넣어 준다.
String tempPath = request.getSession().getServletContext().getRealPath("/WEB-INF/excel");
System.out.println("tempPath = " + tempPath);
// 엑셀 생성후 다운
try {
// 템플릿 엑셀파일 입력 스트림 생성
InputStream is = new BufferedInputStream(new FileInputStream(tempPath + "\\" + templateFile));
XLSTransformer xls = new XLSTransformer();
// 새 시트 등을 만들기 위한 최상위 개체
// data map을 엑셀 템플릿 기반으로 새로운 엑셀 파일 작성
Workbook workbook = xls.transformXLS(is, bean);
// 출력스트림을 위한 헤더 설정
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + ".xlsx\"");
// 출력 스트림 생성
OutputStream os = response.getOutputStream();
// 통합 문서를 출력 스트림에 기록
workbook.write(os);
} catch (IOException e) {
e.printStackTrace();
}
}
}
bean 이라는 파라미터에 출력하고자 하는 데이터가 있고,
입력 스트림으로 템플릿 파일을 불러와 Workbook 을 생성하여 출력 스트림에 데이터를 기록하여 다운로드 한다.
컨트롤러 동작
- BoardController.java
/*
* excel 다운
*/
@GetMapping("/board/downloadExcel.do")
public void downloadExcel(HttpServletRequest request,
HttpServletResponse response, BoardVO vo,
ModelMap modelMap, SearchVO searchVo) throws Exception, Exception {
// 그냥 평소에 마이바티스에서 데이터 뽑는 방법으로 데이터를 가져온다.
searchVo.setMenuNo(2);
List<BoardVO> dataList = boardService.getBoardList(searchVo);
// 받은 데이터를 맵에 담는다.
Map<String, Object> beans = new HashMap<String, Object>();
beans.put("dataList", dataList);
// 엑셀 다운로드 메소드가 담겨 있는 객체
MakeExcel me = new MakeExcel();
// request, response, data, filename, template file name, 아무거나 상관없음
me.download(request, response, beans, "board_list", "temp.xlsx", null);
}
jsp에서 해당 컨트롤러로 url 매핑하면 동작하는 컨트롤러
데이터를 조회하여 위에서 생성한 MakeExcel 클래스의 download 메서드를 실행
결과
해당 버튼을 클릭하게 되면 url이 매핑된 /board/downloadExcel.do 컨트롤러가 실행되어 엑셀 파일 생성 및 다운로드가 시작된다.
데이터가 엑셀파일에 잘 담기고 다운로드가 완료되었다.
- Just Do It -
반응형
'Spring' 카테고리의 다른 글
[Spring] 현재접속자 목록 (0) | 2023.07.30 |
---|---|
[Spring] 프론트(JSP) ↔ 백(Controller) 데이터 전달 (0) | 2023.02.27 |
[Spring] 페이징 / 검색 (0) | 2022.12.27 |
[Spring] spring, vue.js 를 이용해 todoList 만들기 (0) | 2022.09.15 |