설명


Spring MVC 에서 Excel 기능을 제공하는 View 가 있다.


  • AbstractExcelView (라이브러리에서 제공 하는 소스 일부 이다.)
@Component("AbstractExcelView")
public abstract class AbstractExcelView extends AbstractView {

    @Override
    protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // doing
    }

    /**
     * Subclasses must implement this method to create an Excel HSSFWorkbook document,
     * given the model.
     * @param model the model Map
     * @param workbook the Excel workbook to complete
     * @param request in case we need locale etc. Shouldn't look at attributes.
     * @param response in case we need to set cookies. Shouldn't write to it.
     */
    protected abstract void buildExcelDocument(
            Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response)
            throws Exception;
}


AbstractView 기능을 구현하기 위해서는 기본적으로 renderMergedOutputModel 메소드를 구현해야 한다. 시점은 Controller 처리 후 라고 보면 쉽게 이해 할 수 있다. model 값은 Controller 에서 modelMap, ModelAndView 에 넣었던 데이터들 이라고 생각 하면 된다.


AbstractExcelView 의 경우에는 Excel 생성 부분 buildExcelDocument 메소드만 Override 하여 구현 하면 됬는대, 인자로 넘어오는 HSSFWorkbook 는 Excel2003 버전을 지원 한다. 확장자 (.xls) 그 이상 버전을 지원하는 poi 라이브러리를 사용 하는 경우 AbstractView 를 직접 구현해야 한다.


적용 방법

1. Dependency Library 추가


<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.10.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.10.1</version>
</dependency>


2. SampleController 구현 하기


  • SampleController
@Controller("SampleController")
public class SampleController {

    @RequestMapping(value="/sample", method=RequestMethod.POST)
    public ModelAndView sample () {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("SampleExcelView");

        return mav;
    }

}


3. SampleExcelView 구현 하기


  • SampleExcelView
@Component("SampleExcelView")
public class SampleExcelView extends AbstractView {

    /** The content type for an Excel response */
    private static final String CONTENT_TYPE = "application/vnd.ms-excel";

    public AdminExcelView() {
        setContentType(CONTENT_TYPE);
    }

    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            Workbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = (XSSFSheet) workbook.createSheet();

            // Doing

            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);

            if (out != null) out.close();
        } catch (Exception e) {
            throw e;
        }
    }
}


Doing 부분을 AbstractExcelView 의 buildExcelDocument 구현하는 것 처럼 작성 하면 Excel2007 이상 지원하는 (.xlsx) 파일을 작성 할 수 있다.


참고 사이트


+ Recent posts