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());
'Programming > JAVA' 카테고리의 다른 글
애니메이션 이미지인지 아닌지 체크하는 방법(Check image animated or not in JAVA) (0) | 2022.09.16 |
---|---|
[BufferedImage] 이미지 이진화(Image Binarize) (0) | 2022.09.16 |
[Tesseract] 이미지에서 텍스트 추출하기 (OCR) (0) | 2022.09.14 |
[HttpClient] 마지막 Redirect URL 구하기 (0) | 2022.08.30 |
[OpenCSV] Output Stream에 OpenCSV 쓰는 방법 (0) | 2022.08.18 |