Programming/JAVA

[POI] 대용량 엑셀 다운로드 SXSSFWorkbook

빈쿵바라기 2022. 8. 18. 18:55

Java에서 엑셀을 다루기 위해서는 POI 라이브러리를 사용합니다. POI에는 HSSF, XSSF, SXSSF 세가지 방식을 지원하는데, 대용량 엑셀 다운로드를 구현하기 위해서는 SXSSF방식으로 구현해야합니다.

HSSF : EXCEL 2007 이전 버전(.xls)  - 65535 라인까지 사용가능
XSSF : EXCEL 2007 이후 버전(2007포함 .xlsx) - 65535 라인 이상 사용가능
SXSSF : XSSF의 Streaming Version으로 메모리를 적게 사용 - 65535 라인 이상 사용가능

XSSF는 파일을 다운로드 시 메모리에 파일 데이터를 쌓아두었다고 다운로드 받는 방식이면, SXSSF는 임시 파일을 생성해 중간중간 임시파일에 작성하여 메모리를 적게 사용합니다.

Dependency 추가

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>5.2.2</version>
</dependency>


<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>5.2.2</version>
</dependency>

Example Code

SXSSFWorkbook wb = null;

try {
    // 워크북
    // 메모리에 100개의 row만 유지, 초과 시 자동으로 flush 
    wb = new SXSSFWorkbook(100); 

    // 임시파일에 데이터를 작성하는데 데이터가 많아 임시파일의 크기가 문제 될 수 있을 경우 gzip 압축을 사용하도록 지시
    wb.setCompressTempFiles(true); 

    // 엑셀 데이터 작성
    SXSSFSheet sheet = wb.createSheet();
    SXSSFRow row = sheet.createRow(0);
    SXSSFCell cell = row.createCell(0);
    cell.setCellValue("텍스트");

    // 임시파일 삭제
    wb.dispose(); 
    wb.close();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    wb.dispose();
    // SXSSFWorkbook 리소스를 사용 후 close()를 꼭 해줄 것(메모리 누수)
    wb.close();
}

Download Code

HttpServletResponse response; // Controller에서 전달받은 HttpServletResponse

// 파일명 : 한글깨짐 처리
String outputFileName= URLEncoder.encode("테스트.xlsx", "UTF-8");

response.setContentType("application/octer-stream");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition", "attachment;filename=\""+outputFileName +"\"");

wb.write(response.getOutputStream());