POI HSSF, XSSF, SXSSF 성능 분석..

2013. 3. 22. 16:43 - 에릭투스

성능 분석이라고는 썻지만 그정도는 아니고, 이번 업무로 기존 Jxl을 사용하던 방식에서 POI로 변환하는 부분인데, 겨우 9천건 ~ 3만건정도인데 너무 느리기에 이를 개선하는 업무였다.


따라서, 자연스럽게 엑셀 생성의 핵심인 Workbook에 대해 알아보자!!


Workbook의 종류로는 엑셀 97~2003버전인 HSSF , 엑셀 2007이상의 XSSF, 가장 최근에 나온 성능개선버전의 SXSSF...






결론부터 말하자면, "고전만큼 좋은게 없다"




public class test {
	private Sheet s;
	public static final int HSSF = 0;
	public static final int XSSF = 1;
	public static final int SXSSF = 2;
	private Workbook wb;
	public test(int type) {
		// TODO 자동 생성된 생성자 스텁
		switch(type){
			case HSSF : wb = new HSSFWorkbook();
				break;
			case XSSF : wb = new XSSFWorkbook();
				break;
			case SXSSF : wb = new SXSSFWorkbook(-1);
				break;
		}
	}
	
	public Row getRow(int i){
		Row r = s.getRow(i);
		if(r==null)
			r = s.createRow(i);
		return r;
	}
	
	public Cell getCell(int row,int cell){
		Row r = getRow(row);
		Cell c = r.getCell(cell);
		if(c==null)
			c = r.createCell(cell);
		return c;
	}
	
	public void setCellValue(int row, int cell, String cellvalue){
		Cell c = getCell(row,cell);
		c.setCellValue(cellvalue);
	}
	
	public void writeWorkbook(String fileName){
		long start = System.currentTimeMillis();
		try{
			s = wb.createSheet("sample Sheet");
			for(int i=0;i<10000;i++){
				setCellValue(i,0,"Test_Title_"+i);
				setCellValue(i,1,"Test_Title_"+i);
				setCellValue(i,2,"Test_Title_"+i);
				setCellValue(i,3,"Test_Title_"+i);
				setCellValue(i,4,"Test_Title_"+i);
				setCellValue(i,5,"Test_Title_"+i);
				setCellValue(i,6,"Test_Title_"+i);
				setCellValue(i,7,"Test_Title_"+i);
				setCellValue(i,8,"Test_Title_"+i);
				setCellValue(i,9,"Test_Title_"+i);
				setCellValue(i,10,"Test_Title_"+i);
			}
			wb.write(new FileOutputStream(fileName));
		}catch(Exception e){
			e.printStackTrace();
			System.err.println(e.getMessage());
		}
		long end = System.currentTimeMillis();
		System.out.println("writeHSSFWorkbook : "+(end-start));
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 자동 생성된 메소드 스텁
		test hssf = new test(test.HSSF);
		hssf.writeWorkbook("hssf-sample.xls");
		
		test xssf = new test(test.XSSF);
		xssf.writeWorkbook("xssf-sample.xls");
		
		test sxssf = new test(test.SXSSF);
		sxssf.writeWorkbook("sxssf-sample.xls");
		
	}

}


못믿겠다면 결과를 보자..



대략 3만건의 데이터를 만드는 소요 시간을 계산해보았당..

보다 싶이 HSSF와 SXSSF의 경우 속도가 괜찮지만....XSSF........


선택은 본인들이...



ps. SXSSF를 사용하게 될 경우, 생각보다 많은 의존성이 필요하다...(최소 이정도의 xml관련 Lib가 필요하다..)

HSSF 쓸 경우, poi-3.9....jar만 있음됨.


dom4j-1.6.1.jar


poi-3.9-20121203.jar


poi-ooxml-3.9-20121203.jar


poi-ooxml-schemas-3.9-20121203.jar


poi-scratchpad-3.9-20121203.jar


xbean.jar


xbean_xpath.jar


xmlbeans-qname.jar


xmlpublic.jar


xstream-1.4.1.jar




그리고 한가지더!!

만약 jdk 1.5이하를 사용할 경우 jdk 1.6부터 추가된 "javax.xml.stream.*"관련 소스를 참조하기때문에 에러가 발생한다...

쫄지말자.. 까짓거 jdk1.6이상 소스에서 아래와 같은 파일만 추가하면된다...(물론 JDK1.6이상일 경우는 문제없다..)



이제 마지막으로 도움이 되셨길바라면서.. 뿅!



다른 카테고리의 글 목록

Workspace/Web Dev 카테고리의 포스트를 톺아봅니다