[JAVA] SXSSF 엑셀파일 전송 API

 

    /**
     * 엑셀 다운로드 구현
     */
    private void createExcelDownloadResponse(HttpServletResponse response, List<Map<String,Object>> ListData, String fileName) {

        try (SXSSFWorkbook workbook = new SXSSFWorkbook(100); OutputStream out = response.getOutputStream()) {
            SXSSFSheet sheet = workbook.createSheet("sheetName");
            // 헤더 생성
            SXSSFRow headerRow = sheet.createRow(0);

            // 데이터 유효성 검사
            if (ListData == null || ListData.isEmpty()) {
                SXSSFRow row = sheet.createRow(1);
                row.createCell(0).setCellValue("No data available");
                throw new BadRequestException(ServerResponse.DATA_NOT_EXIST);
            }

            // 컬럼 너비 자동 설정
            int columnIndex = 0;
            for (String key : ListData.get(0).keySet()) {
                SXSSFCell cell = headerRow.createCell(columnIndex);
                cell.setCellValue(key); // 키 값을 Header로 설정
                sheet.setColumnWidth(columnIndex, 256 * 15); // 기본 너비 설정
                columnIndex++;
            }

            // 데이터 입력
            int rownum = 1;
            for (Map<String,Object> info : ListData) {
                SXSSFRow row = sheet.createRow(rownum++);
                columnIndex = 0;
                for (String key : ListData.get(0).keySet()) {
                    row.createCell(columnIndex).setCellValue(getDefaultValue(info.get(key).toString(),""));
                    columnIndex++;
                }
            }

            // HTTP 응답 설정
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            String encodedFilename = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
            response.setHeader("Content-Disposition",
                    String.format("attachment; filename*=UTF-8''%s.xlsx", encodedFilename));

            workbook.write(out);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
            throw new BadRequestException(ServerResponse.FAIL_TO_CREATE_EXCEL);
        }
    }

 

설명은 주석참고

 

Service에서 적절한 데이터를 파밍후에
요 createExcelDownloadResponse함수에 HttpServletResponse, 조회한 List 데이터, 파일이름을 넣어주면 된다.

 

Controller에서 Service를 연결해주면 URL 입력시에 엑셀파일을 다운받을 수 있다.

 

Controller에서 Response를 변경하지 않도록 신경쓰자.

이런 오류가 생길 수 있다.