[Apache POI] Excel 다운로드하기

smiler·2022년 12월 7일
0

Apache POI

목록 보기
3/4

  POI로 생성한 Excel을 클라이언트로 다운로드시키겠습니다.

1. 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");
        
        // 6. 다운로드를 시킵니다.
        download(workbook, response);
    }
}

SXSSFWorkbook을 다운로드할 수 있도록 download를 호출합니다.
SXSSFWorkbookHttpServletResponse를 전달해줍니다.


2. download 구현

public void download(SXSSFWorkbook workbook, HttpServletResponse response) throws IOException {
        // 1. OutputStream 생성
        OutputStream outputStream = null;
        try {
            // 2. mime-type을 설정한다.
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

            // 3. 파일명을 설정한다.
            response.setHeader("Content-Disposition", "Attachment; Filename=sample.xlsx");

            // 4. response의 OutputStream에 생성한 workbook을 write한다.
            outputStream = new BufferedOutputStream(response.getOutputStream());
            workbook.write(outputStream);
            outputStream.flush();

        } catch (Exception e) {
            // Exception 처리하세요.
        } finally {
            // 5. 사용한 Stream을 닫는다.
            if(outputStream != null) outputStream.close();
        }
    }
  1. OutputStream을 생성합니다. SXSSFWorkbook을 담을 Stream입니다.

  2. mime-type을 설정합니다. Excel 확장자에 따른 mime-type은 다음과 같습니다.
  • xlsx : application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • xls : application/vnd.ms-excel
  • xlsm : application/vnd.ms-excel.sheet.macroEnabled.12
  • xlsb : application/vnd.ms-excel.sheet.binary.macroEnabled.12

  1. Filename에 다운로드할 파일명을 설정해줍니다. 유동적으로 변경이 가능합니다.

  2. responseOutputStreamWorkBook을 Write합니다.

  3. finally block에서 사용한 Stream을 닫아줍니다.

3. 실행

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;

@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");

        download(workbook, response);
    }

    public void download(SXSSFWorkbook workbook, HttpServletResponse response) throws IOException {
        // 1. OutputStream 생성
        OutputStream outputStream = null;
        try {
            // 2. mime-type을 설정한다.
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

            // 3. 파일명을 설정한다.
            response.setHeader("Content-Disposition", "Attachment; Filename=sample.xlsx");

            // 4. response의 OutputStream에 생성한 workbook을 write한다.
            outputStream = new BufferedOutputStream(response.getOutputStream());
            workbook.write(outputStream);
            outputStream.flush();

        } catch (Exception e) {
            // Exception 처리하세요.
        } finally {
            // 5. 사용한 Stream을 닫는다.
            if(outputStream != null) outputStream.close();
        }
    }
}

0개의 댓글