(Spring) jxls를 사용하여 스프레드시트를 Excel 파일로 생성 및 다운로드

일하기 전에

Excel 파일을 생성하려면 템플릿 파일이 필요합니다.

출력할 데이터와 엑셀 템플릿 파일을 불러와 템플릿 파일에 데이터를 씁니다.


이렇게 jstl 형식으로 작성하고 모음이면 루프 문이 자동으로 회전하여 데이터를 씁니다.

템플릿 파일의 위치는 다음과 같습니다.


템플릿 파일을 적절한 위치에 놓고 작업을 진행합니다.

엑셀 파일 생성 및 다운로드

  • 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” 파라미터에 출력할 데이터가 있습니다.

템플릿 파일이 입력 스트림에 로드되고 통합 문서가 생성되며 데이터가 기록되고 출력 스트림에 다운로드됩니다.

컨트롤러 동작

  • 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가 실행되어 엑셀 파일 생성 및 다운로드가 시작됩니다.


데이터가 엑셀 파일에 잘 삽입되어 다운로드가 완료되었습니다.

-그냥 해-