[Apache POI] POI로 Excel 작성하기

smiler·2022년 12월 7일
0

Apache POI

목록 보기
2/4
post-thumbnail

  이전 글에서 클라이언트가 요청을 보내면 서버가 해당 요청을 처리할 수 있게 만들었습니다. 이번에는 사용자가 다운로드 할 Excel을 만들어보겠습니다.

  이전 글에서 설명한것 같이 Excel에 데이터를 쓰는 속도는 SXSSF가 압도적으로 빠릅니다. 또한 XSSF는 쓰는 중간 Memory flush가 불가능하므로 개인 프로젝트에서도 사용이 불가능할 수 있습니다.(테스트 기준 2000 Cell 작성만 해도 웹서버가 다운됩니다.)

따라서 Excel파일에 데이터를 작성할때는 SXSSF를 사용합니다.

1. SXSSF로 Excel 작성하기

Excel파일을 생성하려면 다음과 같은 순서가 필요합니다.

@Controller
public class ExcelController {

    @RequestMapping("download")
    public void create(HttpServletRequest request, HttpServletResponse response) 
    														throws IOException {

        // 1. Excel Workbook(파일)을 생성한다.
        SXSSFWorkbook workbook = new SXSSFWorkbook(10);

        // 2. 생성된 Excel Workbook에 Sheet를 만든다.
        SXSSFSheet sheet = workbook.createSheet();

        // 3. 생성된 Sheet에 Row를 만든다.
        SXSSFRow row = sheet.createRow(0);

        // 4. 생성된 Row에 cell을 만든다.
        SXSSFCell cell = row.createCell(0);

        // 5. 생성된 Cell에 값을 입력한다.
        cell.setCellValue("value");

    }
}
  1. SXSSFWorkbook : Excel 파일과 같은 객체입니다.
    생성시 rowAccessWindowSize로 데이터 처리량을 결정합니다.

  2. SXSSFSheet : Excel의 Sheet입니다.

  3. SXSSFRow : Excel의 Sheet의 Row입니다.
    시작 Index는 0입니다.

  4. SXSSFCell : Excel의 Sheet의 Row의 Cell입니다.
    시작 Index는 0입니다.
    값이나 Cell의 속성값이 들어가는 객체입니다.

위 내용을 활용하여 DB에서 데이터를 가져왔다고 가정하고 엑셀을 만들어보겠습니다.

@Controller
public class ExcelController {

    @RequestMapping("download")
    public void create(HttpServletRequest request, HttpServletResponse response) 
    														throws IOException {

		// DB에서 가져온 데이터.
        String[][] dataArray = {{"Kim", "20", "Seoul"}
                                , {"Lee", "30", "Busan"}
                                , {"Park", "25", "Jeju"}};

        // 1. Excel Workbook(파일)을 생성한다.
        SXSSFWorkbook workbook = new SXSSFWorkbook(10);

        // 2. 생성된 Excel Workbook에 Sheet를 만든다.
        SXSSFSheet sheet = workbook.createSheet();

        for(int i = 0; i < dataArray.length; i++) {
            // 3. 생성된 Sheet에 Row를 만든다.
            SXSSFRow row = sheet.createRow(i);
            
            for(int j = 0; j < dataArray[i].length; j++) {
                // 4. 생성된 Row에 cell을 만든다.
                SXSSFCell cell = row.createCell(j);

                // 5. 생성된 Cell에 값을 입력한다.
                cell.setCellValue(dataArray[i][j]);
            }
        }
    }
}

2. 스타일 적용하기

  Excel을 작성하다보면 글자크기, 글자색상, 글자속성, Cell넓이, Cell높이 등을 설정해야 할 때가 있습니다.

2 .1. CellStyle 객체 생성

// Cell Style 객체를 생성한다.
CellStyle sampleStyle = workbook.createCellStyle();

2 .2. Cell 테두리 설정

// cell의 상하좌우 테두리선을 설정한다.
sampleStyle.setBorderTop(BorderStyle.THIN);
sampleStyle.setBorderBottom(BorderStyle.THIN);
sampleStyle.setBorderLeft(BorderStyle.THIN);
sampleStyle.setBorderRight(BorderStyle.THIN);

2 .3. 글자 정렬

// cell의 글자정렬을 가운데로 설정한다.
sampleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 세로 가운데
sampleStyle.setAlignment(HorizontalAlignment.CENTER); // 가로 가운데

2 .4. 배경색 설정

// 배경색을 설정한다.
sampleStyle.setFillForegroundColor(new XSSFColor(new byte[]{(byte) 192, (byte) 192, (byte) 192}));
sampleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

2 .5. 폰트 설정

// 폰트를 설정한다.
Font sampleFont = workbook.createFont();
sampleFont.setBold(true);
sampleFont.setFontName("나눔고딕");
sampleFont.setColor(IndexedColors.BLUE.getIndex());
sampleFont.setFontHeight((short) 180);
sampleStyle.setFont(sampleFont);

2 .6. Cell에 Style 적용

// Cell에 Style을 적용한다.
SXSSFCell cell = row.createCell(0);
cell.setCellStyle(sampleStyle);

@Controller
public class ExcelController {

    @RequestMapping("download")
    public void create(HttpServletRequest request, HttpServletResponse response) 
    														throws IOException {

        String[][] dataArray = {{"Kim", "20", "Seoul"}
                                , {"Lee", "30", "Busan"}
                                , {"Park", "25", "Jeju"}};

        // 1. Excel Workbook(파일)을 생성한다.
        SXSSFWorkbook workbook = new SXSSFWorkbook(10);

        // Cell Style 객체를 생성한다.
        CellStyle sampleStyle = workbook.createCellStyle();

        // cell의 상하좌우 테두리선을 설정한다.
        sampleStyle.setBorderTop(BorderStyle.THIN);
        sampleStyle.setBorderBottom(BorderStyle.THIN);
        sampleStyle.setBorderLeft(BorderStyle.THIN);
        sampleStyle.setBorderRight(BorderStyle.THIN);

        // cell의 글자정렬을 가운데로 설정한다.
        sampleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 세로 가운데
        sampleStyle.setAlignment(HorizontalAlignment.CENTER); // 가로 가운데

        // 배경색을 설정한다.
        sampleStyle.setFillForegroundColor(new XSSFColor(new byte[]{(byte) 192, (byte) 192, (byte) 192}));
        sampleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 폰트를 설정한다.
        Font sampleFont = workbook.createFont();
        sampleFont.setBold(true);
        sampleFont.setFontName("나눔고딕");
        sampleFont.setColor(IndexedColors.BLUE.getIndex());
        sampleFont.setFontHeight((short) 180);
        sampleStyle.setFont(sampleFont);

        // 2. 생성된 Excel Workbook에 Sheet를 만든다.
        SXSSFSheet sheet = workbook.createSheet();

        for(int i = 0; i < dataArray.length; i++) {
            // 3. 생성된 Sheet에 Row를 만든다.
            SXSSFRow row = sheet.createRow(i);
            for(int j = 0; j < dataArray[i].length; j++) {
                // 4. 생성된 Row에 cell을 만든다.
                SXSSFCell cell = row.createCell(j);

                // 5. 생성된 Cell에 값을 입력한다.
                cell.setCellValue(dataArray[i][j]);

                // 6. Cell에 Style을 적용한다.
                cell.setCellStyle(sampleStyle);
            }
        }
	}
}

0개의 댓글