https://forest71.tistory.com/77 - SW 개발이 좋은 사람
Java에서 데이터를 엑셀로 다운로드 하는 방법은 몇 가지 방법이 있다.
http://greatkim91.tistory.com/72
개인적으로 jXLS를 방법을 선호하는데
jXLS은 템플릿 방식으로 Java의 MVC를 그대로 활용할 수 있기 때문이다.
다만, 엑셀 2003(XLS) 파일만 지원되다 엑셀 2007(XLSX) 파일 지원은 뒤늦게 지원되어
관련 문서가 많지 않아 (못 찾은 것일 수도),
여기에 문서로 정리한다.
http://jxls.sourceforge.net/getting_started.html
http://blog.naver.com/PostView.nhn?blogId=likerkawk&logNo=220260084312
이상의 문서를 참조해서 다음의 예제를 만들었다.
기본 개념들은 위 자료를 참고하길 바란다.
개인적으로 오랫동안 jXLS를 사용해 왔고 선호하는 이유는
Java의 MVC 개념을 적용하여 사용할 수 있기 때문이다.
Java의 MVC에서 V (view)는 JSP를 의미하는데
처리된 데이터를 적절하게 디자인하여 화면에 출력하게 된다.
jXLS를 사용하면 기존 코드(M과 C)를 그대로 활용하고
JSP 대신 엑셀 파일을 사용하여 처리한다.
JSP로 보여주나 Excel로 보여주나(다운로드)
같은 개념으로 보고 그림과 같이 View만 바꿔서 사용하는 것이다.
예를 들어, 게시판 리스트를 작성한다고 하면
다음과 같이 컨트롤을 작성한다. (게시판 예제 참조)
@RequestMapping(value = "/boardList") public String boardList(HttpServletRequest request, BoardSearchVO searchVO, ModelMap modelMap) { searchVO.pageCalculate( boardSvc.selectBoardCount(searchVO) ); List<?> listview = boardSvc.selectBoardList(searchVO); modelMap.addAttribute("searchVO", searchVO); modelMap.addAttribute("listview", listview); return "board/BoardList"; }
jXLS를 사용하여 다음과 같이 사용할 수 있다.
@RequestMapping(value = "/boardListExcel") public void boardListExcel(HttpServletRequest request, HttpServletResponse response, BoardSearchVO searchVO) { List<?> listview = boardSvc.selectBoardList(searchVO); Map<String , Object> beans = new HashMap<String , Object>(); beans.put("listview" , listview ); MakeExcel me = new MakeExcel(); me.download(request, response, beans, me.get_Filename("project9"), "board.xlsx"); }
ModelMap으로 값을 JSP로 전달하는 대신
Map을 사용하고
board/BoardList(.jsp)파일을 반환하는 대신
board.xlsx라는 엑셀 템플릿을 지정한다.
이외에 엑셀은 모든 데이터를 받기 때문에
페이징 처리를 위한 개수(selectBoardCount) 계산을 하지 않는 차이가 있다.
JSP와 엑셀 모두 같은 서비스와 SQL을 사용하기 때문에
복잡한 별도 처리 없이 코드 재사용성을 높일 수 있다.
MakeExcel 클래스의 주요 코드는 다음과 같고
jXLS를 메소드 호출(download)만으로 사용하기 위해
미리 jXLS 사용 코드를 함수화 한 코드일 뿐이다.
download 메소드를 호출해서 사용하는 것만 알면 되므로
클래스에 대한 자세한 설명을 하지 않는다.
public void download(HttpServletRequest request, HttpServletResponse response, Map<String , Object> beans, String filename, String templateFile) { String tempPath = request.getSession().getServletContext().getRealPath("/WEB-INF/templete") ; try { InputStream is = new BufferedInputStream(new FileInputStream(tempPath + "\\" + templateFile)); XLSTransformer transformer = new XLSTransformer(); Workbook resultWorkbook = transformer.transformXLS(is, beans); response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + ".xlsx\""); OutputStream os = response.getOutputStream(); resultWorkbook.write(os); } catch (ParsePropertyException | InvalidFormatException | IOException ex) { LOGGER.error("MakeExcel"); // System.out.println(ex); } }
마지막으로 view에서 처리가 있다.
JSP에서 다양한 디자인과 함께 데이터를 출력하게 된다.
엑셀에서는 그림과 같이 적절한 디자인을 하고
${} 안에 Map으로 넘긴 변수명을 넣어 사용하면 된다.
Map으로 넘긴 변수명이 listview이니 ${listview} 이고
listview는 글제목(brdtitle), 작성자(brdwriter), 작성일자(brddate) 등을 가지는
VO 클래스들을 가지고 있기 때문에 그림과 같이
${listview.brdtitle}, ${listview.brdwriter} 등으로 사용하게 된다.
listview는 LIST 형으로 JSP에서는 반복문을 사용해야 하지만
jXLS에서는 알아서 처리해주기 때문에
그림과 같이 작성만 하면 된다.
자세한 코드는 project9에 샘플로 작성되어 있다.
https://github.com/gujc71/project9
jXLS을 사용하면
엑셀의 챠트 등 엑셀에서 제공하는 대부분의 기능을 사용할 수 있는 장점도 있다.
추가해야 할 라이브러리는 다음과 같다.
<dependency> <groupId>net.sf.jxls</groupId> <artifactId>jxls-core</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>1.0.9</version> </dependency> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-jexcel</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency>
출처: https://forest71.tistory.com/77 [SW 개발이 좋은 사람]
댓글 ( 5)
댓글 남기기