설명
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 구현 하기
@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 구현 하기
@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) 파일을 작성 할 수 있다.
참고 사이트