POI和jxl.jar性能比较

JXL.jar  http://www.andykhan.com/jexcelapi/download.html  下载地址

优点:

Jxl对中文支持非常好,操作简单,方法看名知意。

Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写

支持Excel 95-2000的所有版本

生成Excel 2000标准格式

支持字体、数字、日期操作

能够修饰单元格属性

支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式

缺点:效率低,图片支持部完善,对格式的支持不如POI强大

POI,http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 下载poi

1.       效率高,这点很好

2.       支持公式,宏,一些企业应用上会非常实用

3.       能够修饰单元格属性

4.       支持字体、数字、日期操作

缺点:不成熟,代码不能跨平台,貌似不少同行在使用工程中还碰到让人郁闷的BUG

--------------------------------性能测试------------------------------------------------

jxl包:好像是1.4 低于2.0 (忘记了)

poi:poi-3.5-FINAL-20090928.jar

环境:CPU:Intel(R) Core(TM)2 Duo CPU T65702.1GHZ ,2GB内存 MyEclipse1.6  JDK1.6

先前做过一些关于POI和jxl效率的比较,但是由于那时候测试工具很简单,不标准,偶尔在网上获得以为网友提供的简单测试包,还不错。所以重新测试下POI和JXL的性能

创建代码如下:

/**
 * poi 创xcel
 */
public void writerPOI() {
    try {        
        long dir= (long) Math.round(Math.floor(Math.random() * 10000000));
        String dirPath = "c://11//".concat(String.valueOf(dir)) ;
        File file = new File(dirPath);
        if(file.exists()) {
            System.out.println(file.getName()+"存oi");
            if(file.delete()) {
                file.mkdir();
            }                
        }else {
            file.mkdir();
        }
        // 创xcel 工
        HSSFWorkbook newbook = new HSSFWorkbook();
        int j = 0;
        while(j < sheet){ //控heet创
            HSSFSheet sheet = newbook.createSheet("test"+j);
            HSSFRow row = null ;//行
            HSSFCell cell1 = null ;//列
            HSSFCell cell2 = null ;//列
            for(int i = 0 ; i < leng ; i ++){
                row = sheet.createRow(i) ;
                cell1 = row.createCell(0);//列
                cell2 = row.createCell(1);//列
                if(cell1 == null){
                    System.out.println("cell1 null ");
                }
                cell1.setCellType(HSSFCell.CELL_TYPE_STRING);// 定        
                cell1.setCellValue("A数OI"+i);// 在
                cell2.setCellType(HSSFCell.CELL_TYPE_STRING);// 定        
                cell2.setCellValue("B数OI"+1);// 在
            }
            j++ ;
        }
        // 新
         long l = (long) Math.round(Math.floor(Math.random() * 10000000));
        String name = "poi_".concat(String.valueOf(l)).concat(".xls");
        FileOutputStream fp = new FileOutputStream(dirPath.concat("//").concat(name));            
        newbook.write(fp);// 把xcel 工
        fp.flush();            
        fp.close();// 操
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Jxl代码:

/**
 * jxl 创xcel
 */
public void writerJXL() {
    try {
        long dir= (long) Math.round(Math.floor(Math.random() * 10000000));
        String dirPath ="c://11//".concat(String.valueOf(dir)) ;
        File file = new File(dirPath);
        if(file.exists()) {
            System.out.println(file.getName()+"存xl");
            if(file.delete()) {
                file.mkdir();
            }
 
        }else {
            file.mkdir();
        }
        //      打   
        long l = (long) Math.round(Math.floor(Math.random() * 1000000000));
        String name = "jxl_".concat(String.valueOf(l)).concat(".xls");
        WritableWorkbook book = Workbook.createWorkbook( new  File(dirPath.concat("//").concat(name)));
        int j = 0 ;
        while(j < sheet){ //控heet创
            WritableSheet sheet  =  book.createSheet("test"+j ,j);
            Label label1 = null ;
            Label label2 = null ;
            for(int i = 0 ; i < leng ;i ++){
                label1  =   new  Label(0,i,"A数xl"+i ); //第第
                label2  =   new  Label(1,i,"A数xl"+i );            
                sheet.addCell(label1);    //  将    
                sheet.addCell(label2);               
            }
            j++ ;
        }        
        book.write();
        book.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (RowsExceededException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (WriteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }    
}

 

 测试数据和结果如下:

 

一个sheet,逐渐增加数据量
sheet行数 3000 6000 12000 20000
poi avg(ms) 11.16 28.92 46.28 171.9
jxl avg(ms) 29.76 24.22 25.99 43.06
poi total(ms) 55.8 144.6 231,41 859.5
jxl total(ms) 148.79 121.08 129.96 215.29
poi tps 93.08 35.31 22.55 6.98
jxl tps 33.77 47.48 47.36 25.23
poi内存占用(kb) 11081.94 18653.23 42613.33 53047.9
jxl内存占用(kb) 7033.92 7038 5724.46 7,030.30
    1个sheet    

测试结果图:

 

每个sheet 6000条数据逐渐增加sheet个数

sheet个数 1 2 3 4
poi avg(ms) 30.52 60.34 41.07 91.23
jxl avg(ms) 31.22 22.75 25.62 27.89
poi total(ms) 152.6 301.69 205.38 456.13
jxl total(ms) 156.1 113.79 128.09 139.46
poi tps 24.47 17.89 24.51 11.01
jxl tps 42.21 45.04 50.95 44.78
poi内存占用(kb) 18016.57 199449.01 52980.4 53882.59
jxl内存占用(kb) 5727.59 7469.64 9235.39 9,236.00
    6000条/sheet    

 

测试结论:

1. poi已消耗内存换取部分效率,而jxl在内存消耗上一直很稳定。POI很容易内存溢出

2.poi随着数据量的增大,性能直线下降,当我增大到24000条每个sheet的时候,内存溢出。jxl却能运行

建议在大数据量的时候使用jxl .可以保证效率和较小内存消耗。在具体开发中,对部分常用的excel下载,可生产副本文件,避免重复生产Excel消耗内存

3.在测试的过程中,发现POI极其不稳定。获得的数据有时候相差特别大。每种测试情况我是重复测试4次,然后取平均值

你可能感兴趣的:(J2EE探索)