아래 세 군데의 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' ); 

Posted by yongary
,