본문 바로가기
프로그래밍/스프링프레임워크

POI를 사용하여 엑셀 출력하기

by pentode 2018. 4. 20.

스프링프레임웍에서 아파치 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를 사용한 대용량 엑셀 다운로드"  를 참조 하세요.


※ 예제 소스

srping_poi.zip


반응형