publicclassSXSSFAdvanced { publicstaticvoidmain(String[] args) { // 윈도우 크기 설정 (메모리에 유지할 행 수) SXSSFWorkbookworkbook=newSXSSFWorkbook(1000);
// 임시 파일 압축 사용 (메모리 절약) workbook.setCompressTempFiles(true);
// 자동 플러시 설정 Sheetsheet= workbook.createSheet("Data");
// ... 데이터 작성 ...
// 반드시 dispose() 호출하여 임시 파일 정리 workbook.dispose(); } }
장점
매우 낮은 메모리 사용량
대용량 데이터 처리 가능 (수백만 행)
OutOfMemoryError 방지
스트리밍 방식으로 빠른 쓰기 성능
단점
읽기 불가능 (쓰기 전용)
이전 행으로 돌아가서 수정 불가 (윈도우 밖의 행)
임시 파일 생성 (반드시 dispose() 호출 필요)
랜덤 액세스 불가
주의사항
// 잘못된 예시 - 메모리 누수 발생 SXSSFWorkbookworkbook=newSXSSFWorkbook(); workbook.write(outputStream); workbook.close(); // dispose() 호출 안 함 - 임시 파일이 삭제되지 않음!
// 올바른 예시 SXSSFWorkbookworkbook=newSXSSFWorkbook(); try { workbook.write(outputStream); } finally { workbook.dispose(); // 임시 파일 정리 workbook.close(); }
비교표
구분
HSSFWorkbook
XSSFWorkbook
SXSSFWorkbook
파일 형식
.xls
.xlsx
.xlsx
Excel 버전
97-2003
2007+
2007+
최대 행
65,536
1,048,576
1,048,576
최대 열
256
16,384
16,384
Cell Style 제한
4,000
64,000
64,000
메모리 사용
중간
높음
낮음
처리 속도
빠름
보통
빠름 (쓰기)
읽기 지원
✅
✅
❌
쓰기 지원
✅
✅
✅
랜덤 액세스
✅
✅
⚠️ 제한적
대용량 처리
❌
⚠️ 제한적
✅
임시 파일
❌
❌
✅
사용 시나리오별 추천
HSSFWorkbook 사용 권장
오래된 Excel 파일(.xls) 호환성이 필요한 경우
데이터가 65,536행 이하인 경우
빠른 처리 속도가 중요한 경우
레거시 시스템과의 통합
// 레거시 시스템용 if (legacySystem) { Workbookworkbook=newHSSFWorkbook(); // ... }
XSSFWorkbook 사용 권장
현대적인 Excel 기능이 필요한 경우
읽기와 쓰기를 모두 수행해야 하는 경우
데이터 수정이 필요한 경우
중간 규모의 데이터 (수만 행)
// 읽기 및 수정 작업 try (FileInputStreamfis=newFileInputStream("input.xlsx")) { XSSFWorkbookworkbook=newXSSFWorkbook(fis); Sheetsheet= workbook.getSheetAt(0);
// 데이터 읽기 및 수정 Rowrow= sheet.getRow(0); Cellcell= row.getCell(0); cell.setCellValue("Updated Value");
// 저장 try (FileOutputStreamfos=newFileOutputStream("output.xlsx")) { workbook.write(fos); } }
SXSSFWorkbook 사용 권장
대용량 데이터 생성 (10만 행 이상)
메모리가 제한적인 환경
쓰기 전용 작업
리포트 생성, 데이터 내보내기
// 대용량 리포트 생성 publicvoidgenerateLargeReport(List<Data> dataList)throws IOException { SXSSFWorkbookworkbook=newSXSSFWorkbook(100);
try { Sheetsheet= workbook.createSheet("Report");
introwNum=0; for (Data data : dataList) { // 수백만 건 Rowrow= sheet.createRow(rowNum++); row.createCell(0).setCellValue(data.getId()); row.createCell(1).setCellValue(data.getName()); // ... }
try (FileOutputStreamfos=newFileOutputStream("report.xlsx")) { workbook.write(fos); } } finally { workbook.dispose(); // 임시 파일 정리 workbook.close(); } }
성능 비교
메모리 사용량 (100,000행 기준)
HSSFWorkbook: 지원 불가 (행 수 제한 초과) XSSFWorkbook: 약 500MB - 1GB SXSSFWorkbook: 약 50MB - 100MB (윈도우 크기에 따라)
처리 시간 (100,000행 쓰기)
HSSFWorkbook: N/A XSSFWorkbook: 약 15-20초 SXSSFWorkbook: 약 8-12초
publicstatic Workbook createWorkbook(String fileType, int estimatedRows) { if ("xls".equalsIgnoreCase(fileType)) { if (estimatedRows > 65000) { thrownewIllegalArgumentException( "XLS format does not support more than 65,536 rows" ); } returnnewHSSFWorkbook(); }
// xlsx 형식 if (estimatedRows > 50000) { // 대용량: SXSSFWorkbook 사용 returnnewSXSSFWorkbook(100); } else { // 중소량: XSSFWorkbook 사용 returnnewXSSFWorkbook(); } }
publicstaticvoidmain(String[] args)throws Exception { // 사용 예시 Workbookworkbook= createWorkbook("xlsx", 200000);