사전 작업

엑셀파일은 생성하기 위한 템플릿 파일이 필요하다.

출력하고자 하는 데이터와 엑셀 템플릿 파일을 불러와 데이터를 템플릿 파일에 쓰는 형식으로 동작한다.

저렇게 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 -

 

반응형
복사했습니다!