빈쿵바라기
좌충우돌 개발자의 기록
빈쿵바라기
전체 방문자
오늘
어제
  • 분류 전체보기 (53)
    • Programming (25)
      • JAVA (12)
      • Spring Boot (6)
      • JPA (7)
      • Python (0)
    • Database (12)
      • RDBMS (4)
      • NoSQL (7)
    • Server (11)
    • Elasticsearch (3)
    • ETC (2)

블로그 메뉴

    공지사항

    인기 글

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    빈쿵바라기

    좌충우돌 개발자의 기록

    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());

     

    저작자표시 (새창열림)

    '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
      'Programming/JAVA' 카테고리의 다른 글
      • [BufferedImage] 이미지 이진화(Image Binarize)
      • [Tesseract] 이미지에서 텍스트 추출하기 (OCR)
      • [HttpClient] 마지막 Redirect URL 구하기
      • [OpenCSV] Output Stream에 OpenCSV 쓰는 방법
      빈쿵바라기
      빈쿵바라기
      삽질하는 개발자의 좌충우돌 개발기

      티스토리툴바