아래 세 군데의 Reference사이트를 참고하여, 간단하게 xls 다운로드 하는 spring기능을 만들어 보았다.
기존 3가지가 다 약간씩 장점이 있으나, 복잡한 면이 있어서 이들을 섞으니 간단하게 된다.
참고0: https://okky.kr/article/421321
참고1: http://pkbad.tistory.com/26
참고2: http://heowc.tistory.com/66
1. xml 설정.
<!-- 엑셀 Download용 View -->
<beans:bean class = "org.springframework.web.servlet.view.BeanNameViewResolver">
<beans:property name = "order" value = "1" />
</beans:bean>
<!-- 엑셀 Download View는 컨트롤러 리턴시 다른것들보다 먼저 읽혀야 하기 때문에 order를 0과 1로 지정-->
<beans:bean class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<beans:property name = "order" value = "0" />
<beans:property name = "defaultErrorView" value = "error" />
<beans:property name = "exceptionMappings">
<beans:props>
<beans:prop key = "RuntimeException">error</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean name="ExcelXlsView" class="my.common.view.ExcelXlsView" />
2. ExcelXlsView class 작성.
@Component
public class ExcelXlsView extends AbstractXlsView {
@Override
protected Workbook createWorkbook(Map<String, Object> model, HttpServletRequest request) {
return (HSSFWorkbook)model.get("workbook");
}
@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Pragma","public");
response.setHeader("Expires","0");
//file이름 및 확장자
response.setHeader("Content-Disposition",
"attachment; filename=\"" + model.get("fileName") +".xls" + "\"");
}
}
3. Controller에서 excel 다운로드 수행.
@RequestMapping(value="/ExcelDownload.do")
public ModelAndView ExcelDownload(ModelMap modelMap, @ModelAttribute("modelVO")myVo infoVO,
HttpServletResponse response, HttpServletRequest request, HttpSession session) throws Exception {
//화면의 List와 똑같은 Query수행.
List<MyVo> resultList = service.selectList(infoVO);
//Excel 생성
Workbook xlsWb = new HSSFWorkbook();
Sheet sheet1 = xlsWb.createSheet("sheet1");
Row row = null;
Cell cell = null;
//Header Row생성
row = sheet1.createRow(0);
//필드별 헤더설정.
int k=0;
cell = row.createCell(k++);
cell.setCellValue("번호");
sheet1.setColumnWidth(k, 4000); //좀 넓은 column은 width설정. 4000정도하면 날짜가 여유있게 들어감.
cell = row.createCell(k++);
cell.setCellValue("생년월일");
//Data 출력
for(int i = 0; i < resultList.size(); i++) {
row = sheet1.createRow(i+1);
JdnumBunJadonVo oneRow = resultList.get(i);
int j = 0;
//필드별 값설정.
cell = row.createCell(j++);
cell.setCellValue(oneRow.getNo());
cell = row.createCell(j++);
cell.setCellValue(oneRow.getBirthday());
}
//model에 data넣어서, modelAndView 리턴.
modelMap.put("workbook", xlsWb);
modelMap.put("fileName", "excelList_" + CommonUtil.getCurrentDate()); //파일네임 앞부분 설정(.xls는 자동추가됨)
return new ModelAndView("ExcelXlsView");
}
4. 마지막으로, jsp에서는 아래와 같이 실행.
var url = '/ExcelDownload.do'; //+parameter 를 get방식으로 설정.
window.open(url, '_blank' );