[JAVA] Apache poi로 엑셀 저장하기

jihun Choi·2023년 9월 12일
0

안녕하세요 오늘은 Apache poi로 엑셀 다운로드를 하는 로직을 구현해 보도록 하겠습니다


😎 Apache poi란?

Apache POI는 Excel 파일과 관련된 내용을 처리하기 위해 다른 많은 오픈 소스 라이브러리 중에서 신뢰할 수 있는 라이브러리입니다. 또한 Apache POI 라이브러리를 사용하여 MS Word 및 MS PowerPoint 파일을 읽고 쓸 수 있습니다.

😎 bulid.gradle에 Apache poi 의존성 추가하기

bulid.gradle 파일에 의존성을 추가해줍니다.

implementation group: 'org.apache.poi', name: 'poi', version: '4.1.2'
implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2'

😎 엑셀 저장기능 구현하기

  • ExcelUtil.java
public static void excelDownload(HttpServletResponse response, List<?> list, @NonNull String fileName) throws Exception{
        Workbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet(fileName);

        Row row = null;
        Cell cell = null;
        int rowNum = 0;
        int columnNum = 0;

        //제목 스타일 지정
        CellStyle style1 = wb.createCellStyle();
        style1.setAlignment(HorizontalAlignment.CENTER);
        style1.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
        style1.setFillPattern(FillPatternType.BRICKS);
        style1.setBorderRight(BorderStyle.THIN);
        style1.setBorderLeft(BorderStyle.THIN);
        style1.setBorderTop(BorderStyle.THIN);
        style1.setBorderBottom(BorderStyle.THIN);

        //리스트 스타일 지정
        CellStyle style2 = wb.createCellStyle();
         style2.setAlignment(HorizontalAlignment.CENTER);
         style2.setBorderRight(BorderStyle.THIN);
         style2.setBorderLeft(BorderStyle.THIN);
         style2.setBorderTop(BorderStyle.THIN);
         style2.setBorderBottom(BorderStyle.THIN);

        //vo의 제목 셋팅
        row = sheet.createRow(rowNum++);
        for(Field field : list.get(0).getClass().getDeclaredFields()){
            field.setAccessible(true);
            Object value = field.get(list.get(0));

            cell = row.createCell(columnNum);
            cell.setCellStyle(style1);
            cell.setCellValue(field.getName());

            columnNum += 1;
        }

        // vo의 리스트 셋팅
        for (int i=0; i<list.size(); i++) {
            columnNum = 0;
            row = sheet.createRow(rowNum++);
            for(Field field : list.get(i).getClass().getDeclaredFields()){
                field.setAccessible(true);
                Object value = field.get(list.get(i));

                cell = row.createCell(columnNum);
                cell.setCellStyle(style2);
                cell.setCellValue((String)value);
                columnNum += 1;
            }
        }

        // 컨텐츠 타입과 파일명 지정
        response.setContentType("ms-vnd/excel");

        // 정규식 사용하여 파일명에 .@$^공백이 있을경우 _로 대체
        fileName = fileName.replaceAll("[.@$^\\s]", "_");
        // 헤더에 한글 셋팅
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename="+fileName+".xlsx");

        // Excel File Output
        wb.write(response.getOutputStream());
        wb.close();
    }
  • mainController.java

    @GetMapping("/excel/download")
    public void excelDownload(HttpServletResponse response) throws Exception {
        List<UserVO> list = mainService.getAllUsers();
        String excelFileName = "고객 정보";

        ExcelUtil.excelDownload(response, list, excelFileName);

    }

😎 구현 결과

로직 개발 후 실행결과 고객_정보라는 엑셀파일이 생성된 것을 확인 할수 있었습니다. 다음엔 더 재미있는 소재로 찾아뵙도록 하겠습니다.

profile
성장을 위해 열심히 노력하는 개발자 입니다

0개의 댓글