상세 컨텐츠

본문 제목

[JAVA] Excel - POI (SXSSFWorkbook Example)

Spring/POI

by Chan.94 2023. 2. 22. 09:10

본문

반응형

Workbook 종류

HSSF : Excel 2007 하위버전(.xls) 파일 포맷을 사용할 때 사용
XSSF : Excel 2007 (.xlsx) 파일 포맷을 사용할 때 사용
SXSSF : 대용량 엑셀 파일을 출력할 때 사용

XSSF, SXSSF 차이

  • XSSF
    - 읽기, 쓰기가 가능하다.
    - 메모리에 파일데이터를 쌓아두고 사용하기 때문에 용량이 큰 경우 Out Of Memory 에러가 발생한다. 

  • SXSSF
    - 쓰기만 가능하다.
    - 임시파일을 중간중간 생성하여 메모리를 적게 사용하기 때문에 XSSF보다 매우 큰 엑셀 파일을 생성할 수 있다.
    - XSSF는 전체 행에 대한 컨트롤이 가능하지만 SXSSF는 지정된 행 (window size)에 관해서만 컨트롤이 가능해서 메모리를 적게 사용한다.

XSSFWorkbook사용법은 'XSSFWorkbook Example' 을 참고 바란다.

HSSFWorkbook과 XSSFWorkbook을 함께 사용하는 방법은 'WorkbookFactory'을 참고 바란다.


XSSFWorkbook Write Example

workbook 생성

SXSSFWorkbook workbook = new SXSSFWorkbook(accessRowSize);

XSSFWorkbook과의 가장 큰 차이다. ACCESS_ROW_SIZE를 정의하여 메모리를 적게 사용한다.

100으로 설정한다면 100개의 ROW씩 메모리에 올린다. 그렇기 때문에 XSSFWorkbook에서 발생하는 OutOfMemory 문제 즉 Memory leak 문제를 SXSSFWorkbook을 사용하여 해결할 수 있다.

 

 

sheet 생성

SXSSFSheet sheet = workbook.createSheet("sheet명");

row 객체

SXSSFRow row = sheet.createRow(index);

cell 객체

SXSSFCell cell = row.createCell(index);

cell 값

cell.setCellValue("value");

workbook 저장

FileOutputStream fos = new FileOutputStream(new File("excel경로"));
workbook.write(fos);
fos.close();

Write Example

String rootPath = "C:/DevLog/";

//생성일자
Calendar cal = Calendar.getInstance() ;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyyMMddhhmmsss");
String date = dateFormat.format(cal.getTime());
String time = timeFormat.format(cal.getTime());
String directoryPath = String.format("%s%s", rootPath, date);
String excelFullPath = String.format("%s/devlog(SXSSF)_%s.xlsx", directoryPath, time);
File directory = new File(directoryPath);	//디렉토리 경로

//디렉토리생성
if(!directory.exists()) {
	directory.mkdir();
}

//workbook 생성
int accessRowSize = 100;
SXSSFWorkbook workbook = new SXSSFWorkbook(accessRowSize);

//sheet 생성
SXSSFSheet sheet = workbook.createSheet("DevLog");
/*데이터 생성*/
int nRowCnt = 9;
int nColCnt = 9;
for(int nRow = 0 ; nRow <= nRowCnt ; nRow++) {
	//row 생성
	SXSSFRow row = sheet.createRow(nRow);
	for(int nCol = 0 ; nCol <= nColCnt ; nCol++) {
		SXSSFCell cell = row.createCell(nCol);
		cell.setCellValue(String.format("%s x %s = %s", nRow, nCol, nRow * nCol));
	}
}

//workbook 저장
FileOutputStream fos = new FileOutputStream(new File(excelFullPath));
workbook.write(fos);
fos.close();

workbook을 다루기 전에는 File Object를 사용할 수 있어야 한다.

File Object에 대한 내용은 'File Object 기본 사용법' 을 참고 바란다.

 

실행결과


 

XSSFWorkbook - 읽기, 쓰기

SXSSFWorobook - 쓰기

 

읽기도 하고 쓰기도 해야 하는 상황이라면 어떻게 해야 할까.

읽기, 쓰기 상황을 분기처리하여 사용해야 할까? 물론 그렇게 사용하여도 무방하다.

하지만 POI에서 WorkbookFactory라는 객체를 제공해 준다.

반응형

'Spring > POI' 카테고리의 다른 글

[JAVA] Excel - POI (WorkbookFactory)  (5) 2023.02.26
[JAVA] Excel - POI (XSSFWorkbook Example)  (6) 2023.02.21

관련글 더보기

댓글 영역

>