POI POI HSSF, XSSF, SXSSF 성능 분석

황제낙엽 2013.11.05 15:10 조회 수 : 1590

sitelink1 http://erictus.tistory.com/86 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

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


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


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


POI_workbook별_성능.PNG





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




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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");
         
    }
 
}


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


POI벤치마크.PNG


대략 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이상일 경우는 문제없다..)


javax.xml.gif

번호 제목 글쓴이 날짜 조회 수
57 셀 크기 조정 (자동 크기 조정) 황제낙엽 2011.05.03 7740
56 Cell 의 wrap 설정 (텍스트 개행) file 황제낙엽 2011.05.09 2966
» POI HSSF, XSSF, SXSSF 성능 분석 file 황제낙엽 2013.11.05 1590
54 병합된 셀의 스타일( border) 설정하기 황제낙엽 2011.05.03 1564
53 Parsing and Processing Large XML Documents with Digester Rules (해석중) file 황제낙엽 2008.05.13 1478
52 POI 셀 스타일 설정을 위한 예제 소스 file 황제낙엽 2008.05.16 1379
51 엑셀(Excel)문서 처리 패키지 황제낙엽 2007.01.22 1334
50 POI-HSSF and POI-XSSF - Java API To Access Microsoft Excel Format Files 황제낙엽 2013.11.05 984
49 Comma Separated Values (CSV) - au.com.bytecode.opencsv file 황제낙엽 2007.01.23 626
48 Parsing, indexing, and searching XML with Digester and Lucene 황제낙엽 2008.05.07 429
47 POI HSSF 기능 가이드 -- 퀵·가이드 (한글) 황제낙엽 2008.05.16 373
46 JUnit 3.8에서 JUnit 4, TestNG 활용으로 황제낙엽 2007.09.17 369
45 Junit 을 이용한 효율적인 단위 테스트 전략 황제낙엽 2007.01.30 317
44 Library & Properties 파일 file 황제낙엽 2011.12.23 313
43 XSSF Examples file 황제낙엽 2011.05.04 254
42 사용자 정의 Appender 정의하여 Log4j 확장하기 황제낙엽 2009.05.28 220
41 log4j-1.2.15.jar 와 log4j.properties 예제 file 황제낙엽 2017.08.04 187
40 접속 클라이언트의 아이피별로 로그 화일 기록하기 file 황제낙엽 2009.06.01 183
39 Comma Separated Values (CSV) - com.Ostermiller.util Java Utilities 황제낙엽 2007.01.23 177
38 Apache Log4j 2 Configuration 파일 설정 황제낙엽 2020.04.01 150