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
외부 출처
- XSSF, SXSSF)Spreadsheet (HSSF
- dhatim/fastexcel README
댓글
아직 댓글이 없습니다