본문 바로가기
카테고리 없음

[Java]XSSFWorkbook 서버/로컬에 저장 않고 다운로드

by 꼬바리 2022. 4. 19.

controller단에선 값을받아서 전달만 하고 직접적인 기능은 service단에서 처리

 

   public void eventExcalDownload(HttpServletRequest request,HttpServletResponse response,EventVO eventVO) throws Exception {

        LOG.debug(">>> 엑셀 다운로드 시작.");
	    XSSFWorkbook xssfWb = new XSSFWorkbook();       //.xlsx 확장자 지원
		
        //엑셀 만드는 로직 (추가 해야함)
        makeExcel_eventPage(xssfWb,eventVO);

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

        String name = "출력될파명이름";
        //브라우저마다 파일명 인코딩 처리 로직 - 한글파일명이 깨짐(추가 해야함 )

        OutputStream outs = response.getOutputStream();
        
        try{
            //엑셀 출력
            xssfWb.write(outs);

        }catch (Exception  e) {
            e.printStackTrace();
            LOG.error(">>> 엑셀 다운중 오류 발생");
            response.reset();
        }finally {
            if(outs != null) outs.close();
            response.getOutputStream().flush();
            response.getOutputStream().close();
            LOG.debug(">>> 엑셀 다운로드 종료.");
        }
    }

 

 

XSSFWorkbook를 서버나 로컬에 다운하지않고 그대로 response 의  getOutputStream 을 이용하여 flush 해준다.
 
앞단의 경우 나는 href로 호출 하였다.

 

<a href={'/api/statistics/excel/download?data='+data}>

 

location.href로 호출 가능

 

 

크롬기준으로 바로 다운로드 폴더에 저장이 된다.

다운로드의 경우, ajax가 아닌 submit으로 해야 제대로 작동을 하는데..

기본적으로 파일 다운로드의 경우 Ajax를 사용하지 못한다고 한다. Ajax를 사용할 경우 파일 다운로드 응답을 브라우저에서 처리하지 않고 ajax내에서 처리하기때문에 브라우저에서의 파일 다운로드는 사용이 불가능하다.

때문에 submit 또는 a 태그등등 몇가지의 동기방식을 이용해야 한다.

 

난 a태그를 이용하였다.

728x90
반응형

댓글