스프링프레임웍에서 아파치 POI 라이브러리를 사용해서 엑셀을 출력해 봅니다. 이번 예제는 "스프링 프레임웍에서 MyBatis, Oracle 사용하기" 에서 사용한 게시판 목록을 출력하는 것을 이용하여 엑셀로 출력하도록 구성한 것입니다. 전체 예제소스를 글 하단에 첨부하였습니다. 테스트를 위한 데이터베이스 생성 관련해서는 이전 글을 참조하시기 바랍니다.
1. POI 라이브러리 의존성을 pom.xml 파일에 추가하기
- POI 3.17 버전을 사용합니다.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
2. 엑셀 출력 작성하기
- 컨트롤러에 엑셀 출력 부분을 작성합니다.
@RequestMapping(value = "/excelDown.do")
public void excelDown(HttpServletResponse response) throws Exception {
// 게시판 목록조회
List<BoardVO> list = boardService.selectBoardList();
// 워크북 생성
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("게시판");
Row row = null;
Cell cell = null;
int rowNo = 0;
// 테이블 헤더용 스타일
CellStyle headStyle = wb.createCellStyle();
// 가는 경계선을 가집니다.
headStyle.setBorderTop(BorderStyle.THIN);
headStyle.setBorderBottom(BorderStyle.THIN);
headStyle.setBorderLeft(BorderStyle.THIN);
headStyle.setBorderRight(BorderStyle.THIN);
// 배경색은 노란색입니다.
headStyle.setFillForegroundColor(HSSFColorPredefined.YELLOW.getIndex());
headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 데이터는 가운데 정렬합니다.
headStyle.setAlignment(HorizontalAlignment.CENTER);
// 데이터용 경계 스타일 테두리만 지정
CellStyle bodyStyle = wb.createCellStyle();
bodyStyle.setBorderTop(BorderStyle.THIN);
bodyStyle.setBorderBottom(BorderStyle.THIN);
bodyStyle.setBorderLeft(BorderStyle.THIN);
bodyStyle.setBorderRight(BorderStyle.THIN);
// 헤더 생성
row = sheet.createRow(rowNo++);
cell = row.createCell(0);
cell.setCellStyle(headStyle);
cell.setCellValue("번호");
cell = row.createCell(1);
cell.setCellStyle(headStyle);
cell.setCellValue("이름");
cell = row.createCell(2);
cell.setCellStyle(headStyle);
cell.setCellValue("제목");
// 데이터 부분 생성
for(BoardVO vo : list) {
row = sheet.createRow(rowNo++);
cell = row.createCell(0);
cell.setCellStyle(bodyStyle);
cell.setCellValue(vo.getNum());
cell = row.createCell(1);
cell.setCellStyle(bodyStyle);
cell.setCellValue(vo.getName());
cell = row.createCell(2);
cell.setCellStyle(bodyStyle);
cell.setCellValue(vo.getTitle());
}
// 컨텐츠 타입과 파일명 지정
response.setContentType("ms-vnd/excel");
response.setHeader("Content-Disposition", "attachment;filename=test.xls");
// 엑셀 출력
wb.write(response.getOutputStream());
wb.close();
}
- 워크북 및 시트 생성하기
HSSFWorkbook객체를 생성합니다. 이 HSSFWorkbook 객체는 .xls 파일만을 지원합니다. wb.createSheet("게시판");에서 인자로 주어진 "게시판"은 엑셀파일의 시트 이름이 됩니다.
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("게시판");
- 행(Row) 생성하기
워크시트 객체의 createRow(); 메소드를 사용하여 행 객체를 생성합니다. 인자는 short 타입의 행번호 입니다. 행과 열의 처음 시작은 0번 부터 시작합니다.
Row row = sheet.createRow(0);
- 셀(Cell) 생성하기 및 값 입력하기
셀은 행 객체의 createCell() 메소드로 생성합니다. 인자는 셀의 번호입니다. 0번부터 시작합니다. 셀의 값을 입력할때는 cell.setCellValue() 메소드를 사용합니다. 이 메소드는 다양한 타입의 데이터를 받아들이도록 오버로딩 되어 있습니다.
Cell cell = row.createCell(0);
cell.setCellValue("셀값");
- 셀 스타일 객체 생성 및 적용하기
먼저 워크북의 createCellStyle() 메소드를 이용해서 CellStyle 객체를 생성합니다.
CellStyle headStyle = wb.createCellStyle();
테두리를 지정합니다. 여기서는 가는선(BorderSytle.THIN) 을 지정했습니다.
headStyle.setBorderTop(BorderStyle.THIN);
headStyle.setBorderBottom(BorderStyle.THIN);
headStyle.setBorderLeft(BorderStyle.THIN);
headStyle.setBorderRight(BorderStyle.THIN);
배경색을 지정합니다.
headStyle.setFillForegroundColor(HSSFColorPredefined.YELLOW.getIndex());
headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
데이터를 가운데 정렬합니다.
headStyle.setAlignment(HorizontalAlignment.CENTER);
셀에 적용 합니다.
cell.setCellStyle(headStyle);
※ POI에서 스타일을 지정하는 방법은 버전마다 많은 차이를 보입니다. 자신이 사용하는 POI 버전에 맞는 방법을 사용해야 하겠습니다. 전자정부표준프레임워크 3.6에는 POI 3.9 버전이 들어있는데, 이 버전에서 구현한다면 다음과 같이 될것 입니다.
CellStyle headStyle = wb.createCellStyle();
headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
headStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
headStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
- 엑셀파일로 출력하기
컨텐츠타입과 파일명을 지정합니다.
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=test.xls");
클라이언트(브라우저)로 출력합니다.
wb.write(response.getOutputStream());
wb.close();
3. 실행하기
브라우저에 http://localhost:8080/pentode/boardList.do 를 호출합니다.
[엑셀] 버튼을 눌러 다운받습니다.
다운로드된 결과 입니다.
지금까지 POI 라이브러리를 이용한 엑셀다운로드를 알아 보았습니다. 대용량 데이터를 엑셀로 다운 받으려면
"스프링프레임웍에서 POI를 사용한 대용량 엑셀 다운로드" 를 참조 하세요.
※ 예제 소스
'프로그래밍 > 스프링프레임워크' 카테고리의 다른 글
Spring + Quartz 주기적으로 작업 실행하기 (12) | 2018.04.20 |
---|---|
전자정부표준프레임워크 Tomcat + jndi로 dataSource 사용하기 (0) | 2018.04.20 |
스프링 시큐리티에서 중복 로그인 방지 및 세션 고정 공격 방지 (2) | 2018.04.20 |
스프링프레임웍 다국어 메세지 프로퍼티 파일에 한글 바로쓰기 (0) | 2018.04.20 |
전자정부표준프레임워크 Spring Security 사용시 로그인한 사용자정보에 추가정보 넣기 (0) | 2018.04.20 |