Springboot

SpringBoot/java POI 이용해서 엑샐 생성하기

25G 2023. 8. 17. 19:21

POI?

아파치에서 만든 java로 엑셀을 핸들링할 수 있게 해주는 라이브러리 입니다.

의존성 (gradle)

    implementation group: 'org.apache.poi', name: 'poi', version: '4.1.2'
    implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2' // .xlsx 를 사용하려면 해당 의존성을 추가해야합니다.

사용법

기본 적인 사용법은 간단합니다.

용어

  • workbook
    • 하나의 엑셀파일을 의미합니다.
    • 가장 큰 단위로 생각 하면 됩니다.
  • sheet
    • sheet는 말그대로 엑셀 시트를 생성해 주는 것 입니다.
    • Sheet sheet = workbook.createSheet("시트명");
  • row
  • cell
    • 열 (컬럼)

위 네가지 용어만 알면 쉽게 사용 할 수 있습니다.
먼저 workbook 을 생성하는데 워크북에는 xls 를 만들어주는 클래스(HSSFWorkbook), xlsx를 만들어주는 클래스(XSSFWorkbook) 대용량 엑셀을 만들때 사용하는 클래스 정도가 있는것 같습니다.

그리고 그 workbook 안에 목차 (sheet)를 생성해주고
그 sheet안에 엑셀을 상상하며 행과 열을 만들어가며 엑셀을 만들어 주면 되는 것 입니다.

sheet

        Workbook workbook = new XSSFWorkbook();

                    Sheet sheet = workbook.createSheet("시트명");


            // 컬럼 너비 설정
            sheet.setColumnWidth(0, 5000);
            sheet.setColumnWidth(1, 3000);

첫번째 인자는 컬럼 인덱스 위치를 넣어주고 두번째 인자에 너비를 넣어줍니다.

ROW & Cell

row 를 만들고 cell을 생성해준다
이 순서만 이해하고 진행하면 쉽게 만들 수 있습니다.

            row = sheet.createRow(0);

            Row row = null;
            Cell hCell = null;

            hCell = row.createCell(i); //  위 0번째 로우에 i번째 셀을 생성하겠다
            hCell.setCellValue(headerKey[i]); 
            hCell.setCellStyle(headerStyle); // 스타일 객체넣어서 셀에 스타일 입히기

Style

저는 다른 분이 만든거 참고정도만 하고 더 다양하게 할 수 있습니다.
핵심은 Style객체를 만들어서 cell객체 하나하나마다 style객체를 넣어주는것이 핵심입니다.

    public CellStyle CellStyleSetting(Workbook workbook, String kind) {
        //테이블 스타일
        CellStyle cellStyle = workbook.createCellStyle();

        //가는 경계선
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);

        if (kind.equals("header")) {
            //배경색 회색
            cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        }

        //데이터는 가운데 정렬
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //중앙 정렬

        //폰트 설정
        Font fontOfGothic = workbook.createFont();
        fontOfGothic.setFontName("맑은 고딕");
        cellStyle.setFont(fontOfGothic);

        return cellStyle;
    }

Response api

       // 위에서 만든 Workbook 객체를 받아온다 
        try {
            String fileName = URLEncoder.encode("테스트", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
            File tmpFile = File.createTempFile("TMP~", ".xlsx");
            try (OutputStream fos = new FileOutputStream(tmpFile)) {
                workbook.write(fos);
            }
            InputStream res = new FileInputStream(tmpFile) {
                @Override
                public void close() throws IOException {
                    super.close();
                    if (tmpFile.delete()) {
                      log.info("삭제완료")
                    }
                }
            };
            return ResponseEntity.ok()
                    .contentLength(tmpFile.length())
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .header("Content-Disposition", String.format("attachment;filename=\"%s.xlsx\";", fileName))
                    .body(new InputStreamResource(res));