POI library excel > HSSF, XSSF, SXSSF

이건영·2023년 6월 11일
1
post-custom-banner

Apache POI Library는 코드상에서 excel을 생성이 가능하게 도와주는 library이다.
해당 library를 쓰다보면 엑셀 생성의 핵심인 Workbook을 생성하게 된다.
Workbook 종류는 3가지가 있다.

  1. HSSF
  2. XSSF
  3. SXSSF

1. HSSF

  • excel 97 ~ 2003 버전

2. XSSF

  • excel 2007 이상의 버전

3. SXSSF

  • POI 3.8 beta3 버전부터 지원하는 성능개선 버전

HSSF는 excel 2007이후로는 지원가능 하지 않아 기존에는 XSSF버전을 사용하고 있었다.
하지만 row수가 수만 ~ 10만건이 넘어가다 보니 OOM이 발생하게 된다.
서버 리소스를 늘려야 고민하던 때에 눈에 띄인 SXSSF

SXSSF는 지정한 row만큼 memory에 올려놓고 생성하다가 지정한 row에 도달하면 임시 XML 파일로 disk에 기록을 하고 memory를 비워주는 streaming이라 생각하면 편하다.
XSSF는 파일생성이 끝나기 전까지 모든 row를 memory위에 올려놓는 것과는 다르게 메모리 절약에 굉장히 효과적이었다.

지정한 row는 기본 500줄이며 희망 시 Workbook 생성 시 지정 가능하다.

public SXSSFWorkbook getWorkbook() {
	//인자 값 없이 new SXSSFWorkbook()을 호출하면 기본값 500줄
	SXSSFWorkbook workbook = new SXSSFWorkbook(1000);
	...
}

다만 streaming 서비스 이다 보니 XSSF와 비교하면 다음과 같은 제한사항이 있다.

  1. 이미 xml file로 disk에 기록 된 row에 접근 불가능 하다.
public void drawContent(SXSSFSheet sheet) {
	for(int i = 0; i < 501; i++) {
    	Row row = sheet.createRow(i);
        Cell cell = row.createCell(0);
        cell.setCellValue("value");
        
        if(i < 0) {
        	continue;
        }
        
        //i가 501에서 에러가 난다. > 0번째 index의 row는 이미 메모리에서 없어짐
        Row prevRow = sheet.getRow(0);
        Cell prevCell = row.getCell(0);
        String value = cell.getCellVaue();
    }
}
  1. Sheet.clone()은 지원되지 않는다.(1번 이유와 마찬가지)
  2. excel 기능중 하나인 'Formula evaluation'는 지원 되지 않는다.

참고

https://poi.apache.org/components/spreadsheet/

profile
일단 해보자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 3월 2일

덕분에 좋은 정보 잘 보고 갑니다.
감사합니다.

답글 달기