성능 분석이라고는 썻지만 그정도는 아니고, 이번 업무로 기존 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만 있음됨.
poi-ooxml-schemas-3.9-20121203.jar
poi-scratchpad-3.9-20121203.jar
그리고 한가지더!!
만약 jdk 1.5이하를 사용할 경우 jdk 1.6부터 추가된 "javax.xml.stream.*"관련 소스를 참조하기때문에 에러가 발생한다...
쫄지말자.. 까짓거 jdk1.6이상 소스에서 아래와 같은 파일만 추가하면된다...(물론 JDK1.6이상일 경우는 문제없다..)
이제 마지막으로 도움이 되셨길바라면서.. 뿅!
'Workspace > Web Dev' 카테고리의 다른 글
Spring JSON View 구현하기(1) - ResponseEntity (2) | 2013.09.24 |
---|---|
Tapestry auto load(자동빌드) 안될때 (0) | 2013.08.28 |
An invalid XML character (Unicode: 0xde2e) (0) | 2013.06.11 |
velocity 널체크.. (0) | 2013.04.22 |
List<HashMap>형태의 동적검색을 위한 ibatis Iterate 처리방법 (0) | 2013.01.16 |