IT/WEB

[Spring boot] 엑셀 다운로드 기능 공통 코드

오달달씨 2022. 7. 13. 13:12
728x90
반응형

엑셀 다운로드는 웬만한 CRUD 페이지에 필수적으로 들어가는 기능이다.

 

얼마전 엑셀 다운로드 기능을 다른 사람들의 소스를 참고하여 만들어 쓰고 있는

 

엑셀 다운로드 공통 기능에 대해서 정리해볼까 한다.

 

내가 참고한 소스도 누군가에게 참고되는 소스이기를 바라며...

 

<iframe id="fileDown" style='display: none' src="" width="1" height="1"></iframe>

-------------------------------------------------------------


$("#saveExcel").click(function(){
     let msg = "<p>전송결과 코드 리스트를 엑셀로 저장 하시겠습니까?</p>";
     msg += "<p class='c-mt2r'>전송결과_코드_리스트_" + new Date().format("yy mm dd", "") + ".xlsx</p>";
     openDialog(msg, "저장", "취소", true, "excelDownload");
   })

 function excelDownload(){
     let url = "/resultCode/excel?";
     let form = $("form[name=searchForm]").serialize();
     url += form;

     $("#fileDown").attr("src", encodeURI(url));
     $("#fileDown").submit();
 }

 

@RequestMapping(value = "/resultCode/excel", method = RequestMethod.GET)
    @ResponseBody
    public String resultCodeListExcel(HttpServletRequest request, HttpServletResponse response, ResultCodeEntity resultCodeEntity) {
        resultCodeService.resultCodeListExcel(request, response, resultCodeEntity);
        return "";
    }

 

public void resultCodeListExcel(HttpServletRequest request, HttpServletResponse response, ResultCodeEntity resultCodeEntity) {
        
        List<ResultCodeEntity> list = new ArrayList<>();
        
        resultCodeEntity.setPageSize(0);
        list = resultCodeMapper.getResultCodeList(resultCodeEntity);
        
        String[] exHeader = null;
        List<Object> exBody = null;
        
        exHeader = new String[]{"결과코드", "구분", "설명", "비고"};
        
        if(null != list && !list.isEmpty()) {
            exBody = new ArrayList<>();
            
            for(ResultCodeEntity entity : list) {
                
                exBody.add(entity.getResultCode());
                String type = entity.getType();
                if("D".equals(type))   
                    type = "메시지 전송 결과";
                else if("T".equals(type))   
                    type = "메시지 발송 결과";
                exBody.add(type);
                exBody.add(entity.getComment());
                exBody.add(entity.getNote());
            }
        }
        String fileName = "전송결과_코드_리스트_"+ DateUtil.format(new Date(), "yyMMdd");
        excelDownload(exHeader, exBody, fileName, list.size());
    }

 

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

......................................

public void excelDownload(String[] exHeader, List<Object> exBody, String fileName, int rowCnt){
        SXSSFWorkbook workbook = new SXSSFWorkbook();
        SXSSFSheet sheet = workbook.createSheet(fileName);
        sheet.trackAllColumnsForAutoSizing();
        SXSSFCell cell = null;
        int rowNo = 0;

        CellStyle headStyle = ExcelUtil.headerStyle(workbook);
        CellStyle bodyStyle = ExcelUtil.bodyStyle(workbook);

        bodyStyle.setWrapText(true);
        SXSSFRow row = sheet.createRow(rowNo++);

        int headLength = ExcelUtil.makeHeader(sheet, cell, row, headStyle, exHeader);

        row = sheet.createRow(rowNo++);
        if(null != exBody && !exBody.isEmpty()){
            ExcelUtil.makeBody(sheet, cell, row, bodyStyle, exBody, rowCnt, headLength, rowNo);
        }

        //LINE :: 셀 너비 자동 조절
        for(int i=0;i<headLength;i++){
            sheet.autoSizeColumn(i);
        }

        try {
            String browser = request.getHeader("User-Agent");

            // 컨텐츠 타입과 파일명 지정
            response.setContentType("ms-vnd/excel");

            //IE와 크롬의 파일 이름 방식이 다름
            if(browser.contains("MSIE") || browser.contains("Trident")){
                response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")+".xlsx");
            }else{
                response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"8859_1")+".xlsx");
            }

            // 엑셀 출력
            workbook.write(response.getOutputStream());
        }catch (IOException e){
            e.printStackTrace();
        }
    }

 

 

728x90
반응형