포스트

2022-10-24-TIL

2022-10-24-TIL

Today I Learned

Apache POI HSSF vs XSSF vs SXSSF

HSSF는 xls만 사용가능하므로 제외하고, XSSF와 SXSSF 중에서는 메모리에 모두 올려놓지 않고 사용하는 SXSSF가 유리

세 API의 차이를 POI 문서 기준으로 정리하면 다음과 같다(Apache POI: Spreadsheet).

API파일 형식메모리특징
HSSF.xls (Excel 97-2007 바이너리)전체를 메모리에옛 형식이라 시트당 행 수 한도가 작다
XSSF.xlsx (Excel 2007 OOXML)전체를 메모리에, XML 기반이라 HSSF보다 더 큼읽기·쓰기, 임의 접근 모두 가능
SXSSF.xlsx슬라이딩 윈도우 안의 행만XSSF 위에 만든 쓰기 전용 스트리밍 API (POI 3.8 beta3부터)

SXSSF의 제약도 문서에 나와 있다. 한 시점에 접근할 수 있는 행이 제한되고, Sheet.clone()을 지원하지 않으며, 수식 계산(evaluation)을 할 수 없다. 그래서 위에서 아래로 데이터를 채워 내려받게 하는 보고서형 다운로드에는 SXSSF가 맞고, 이미 만든 행을 다시 고치거나 수식 결과를 서버에서 계산해야 하는 경우에는 맞지 않는다. 기본 창 크기, 임시 파일과 dispose() 같은 운영상 주의점은 10월 10일 TIL에 정리했다.

  • https://www.tutorialspoint.com/apache_poi/apache_poi_quick_guide.htm
  • https://stackoverflow.com/questions/45936257/apache-poi-hssf-vs-poi-xssf
  • https://erictus.tistory.com/entry/POI-HSSF-XSSF-SXSSF-%EC%84%B1%EB%8A%A5-%EB%B6%84%EC%84%9D
  • https://stackoverflow.com/questions/33047512/hssfworkbook-vs-xssfworkbook-vs-sxssfworkbook-apache-poi
  • https://poi.apache.org/components/spreadsheet/
  • https://poi.apache.org/components/spreadsheet/how-to.html#user_api
  • https://www.adoclib.com/blog/hssfworkbook-vs-xssfworkbook-vs-sxssfworkbook-apache-poi.html
  • https://j-dev.tistory.com/entry/SpringPOI-%EB%8C%80%EC%9A%A9%EB%9F%89-%EC%97%91%EC%85%80-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C
  • https://topic.alibabacloud.com/a/the-difference-between-hssfxssf-and-sxssf_8_8_31570522.html
  • https://okky.kr/articles/408564
  • https://poi.apache.org/apidocs/dev/org/apache/poi/xssf/streaming/SXSSFWorkbook.html
  • http://www.java2s.com/example/java-api/org/apache/poi/xssf/streaming/sxssfworkbook/sxssfworkbook-4-0.html
  • https://qiita.com/tool-taro/items/4b3c802bb114a9110ecb

Apache POI vs Fastexcel

fastexcel(dhatim/fastexcel)은 POI에 의존하지 않는 xlsx 쓰기·읽기 라이브러리다. README는 만든 이유를 POI 스트리밍 API의 한계에서 찾는다. 슬라이딩 윈도우 때문에 현재 쓰는 위치보다 위쪽 셀에 접근할 수 없고, 임시 파일을 쓰며, 공유 문자열(shared strings)이 기본으로 꺼져 있어 파일이 커진다는 점이다. fastexcel은 필요한 요소만 모아 두었다가 마지막에 XML을 출력 스트림으로 흘려보내고, 워크시트마다 다른 스레드로 생성할 수 있다.

README의 벤치마크(행 10만 개, 열 4개 시트 생성)에서는 POI 일반 API가 fastexcel보다 약 10배 느리고 힙을 12배 더 썼다. POI 스트리밍 API는 성능이 fastexcel과 거의 비슷했고, 메모리에 100행만 두기 때문에 힙은 오히려 적게 썼다고 README가 직접 밝힌다(fastexcel README). 즉 대용량 쓰기에서 fastexcel의 장점은 SXSSF 대비 속도보다, 위의 제약 없이 단순한 API를 쓸 수 있다는 데 있다. 대신 지원 기능이 기본 스타일 정도로 제한되고 차트는 지원하지 않는다. 리더 쪽은 셀 내용만 읽고 스타일과 차트는 버리는 스트리밍 리더다.

1
2
3
4
5
6
7
try (OutputStream os = response.getOutputStream();
     Workbook wb = new Workbook(os, "MyApplication", "1.0")) {
    Worksheet ws = wb.newWorksheet("report");
    ws.value(0, 0, "주문번호");
    ws.value(0, 1, "금액");
    // 데이터 행 채우기
}
  • https://automationqahub.com/top-2-alternatives-to-apache-poi-library-that-can-actually-make-your-life-better/
  • https://www.libhunt.com/compare-fastexcel-vs-poi
  • https://github.com/dhatim/fastexcel
  • https://www.baeldung.com/java-microsoft-excel
  • https://zetcode.com/java/fastexcel/
참고한 자료외부 출처 2

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다