今天测试了下POI和jxl.jar性能
测试环境:jxl包:好像是1.4 低于2.0 (忘记了)
poi:poi-3.5-FINAL-20090928.jar
环境:CPU:Pentium(R) 1.4GHZ ,1.5GB内存 MyEclipse5.0  JDK1.5
机器不行,不同电脑上跑出效果不一样,但是仍然可以窥视到POI和jxl效率
package com.jarvis.mul;   
  
import java.io.File;   
import java.io.FileInputStream;   
import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.io.InputStream;   
import java.util.HashMap;   
  
import jxl.Cell;   
import jxl.LabelCell;   
import jxl.Sheet;   
import jxl.Workbook;   
import jxl.read.biff.BiffException;   
  
import org.apache.poi.hssf.usermodel.HSSFCell;   
import org.apache.poi.hssf.usermodel.HSSFName;   
import org.apache.poi.hssf.usermodel.HSSFRow;   
import org.apache.poi.hssf.usermodel.HSSFSheet;   
import org.apache.poi.hssf.usermodel.HSSFWorkbook;   
  
/**  
 * @作者 Jarvis  
 * @创建日期 Dec 2, 2009  
 * @版本 V 1.0  
 */  
  
public class PoiredadXLS {   
    String filepath ="E:/5.xls" ;   
    public void readSpeed(){   
        try {   
//           创建对Excel工作簿文件的引用   
            long t1 = System.currentTimeMillis();   
            FileInputStream rs = new FileInputStream(filepath) ;   
            HSSFWorkbook workbook = new HSSFWorkbook(rs);   
            long t2 = System.currentTimeMillis();   
            System.out.println("加载耗时:"+ (t2-t1));   
            HashMap map = new HashMap();   
            int total = workbook.getNumberOfSheets(); //获取sheet个数   
            int start = 0;int end = 0 ;   
            for(int i = 0 ; i < total ; i ++){   
                HSSFSheet sheet = workbook.getSheetAt(i);// 按索引获取sheet引用       
                System.out.println(sheet.getSheetName());   
                start = sheet.getFirstRowNum();  //sheet起始行索引   
                end = sheet.getLastRowNum();//sheet起结束行索引   
                int temp = 1;   
                HSSFRow row = null ;   
                HSSFCell cell1 = null ;   
                HSSFCell cell2 = null ;   
                while(temp < end){   
                     row =  sheet.getRow(temp);//获取第N行表格数据   
                     cell1 = row.getCell(2);//获取指定列单元格         
                     cell2 = row.getCell(3);//获取指定列单元格     
                     if(cell1 != null && cell1!= null){   
                         map.put(cell1.toString(), cell2.toString()) ;   
                     }   
                     temp ++ ;   
                }   
            }   
        } catch (FileNotFoundException e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        } catch (IOException e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        }   
  
        }   
    public void readExcel(){   
        try {   
            HashMap map = new HashMap();   
            long t1 = System.currentTimeMillis();   
            FileInputStream is = new FileInputStream(filepath);    
            Workbook rwb = Workbook.getWorkbook(is); //         从输入流创建Workbook      
            long t2 = System.currentTimeMillis();   
            System.out.println("加载耗时:"+ (t2-t1));   
            String[] sheetname = rwb.getSheetNames();//获取所有的sheet名称,返回一个String数组   
            int sleng = sheetname.length ;   
            for(int i = 0 ; i < sleng ; i ++){   
                Sheet sheet = rwb.getSheet(sheetname[i]) ;   
                System.out.println(sheetname[i]);   
                int rows = sheet.getRows();//获取表格的总行数   
                int temp = 1;   
                Cell cell1 = null ;   
                Cell cell2 = null ;   
                while(temp < rows){   
                    cell1 = sheet.getCell(2, temp);//第一个参数代表列 第二个参数代表行   
                    cell2 = sheet.getCell(3, temp);//第一个参数代表列 第二个参数代表行   
                    if(cell1 != null && cell2 != null){   
                         map.put(cell1.getContents(), cell2.getContents()) ;   
                    }   
                    temp ++ ;   
                }   
            }   
            rwb.close();//关闭工作薄 流              
        } catch (BiffException e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        } catch (IOException e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        }   
    }   
    public static void main(String[] args) {   
        PoiredadXLS r = new PoiredadXLS();   
        long s = System.currentTimeMillis();   
        r.readSpeed();   
        r.readExcel();   
        long e = System.currentTimeMillis();   
        System.out.println("总耗时:"+ (e-s));   
    }   
  
}  测试数据和结果如下:文件               POI加载耗时   POI总耗时    JXL加载耗时   Jxl总耗时     
文件大小57KB          1172 ms     1172 ms       1265 ms      2250 ms
100行数据文件大小652KB       2297 ms        2313 ms      4406 ms       9750 ms
 1000行数据
 
文件大小2.24M       3109ms         3140ms      16313ms        37453ms
大约6000行数据
 
 
机器比较烂,跑出的时间都很长大家以后用POI吧
 

解决方案 »

  1.   

    呵呵,我一向都是用 POI ,倒没有从效能方面考虑,只是感觉POI更加 OO 些。 楼主这个工作做的有价值。幸苦啦。呵呵
      

  2.   

    类似的测试在javaeye上早就有人测试过啦,o(∩_∩)o...哈哈
      

  3.   

    现在一直在用jxl,未来有需要就研究下poi。不过上次用jxl时居然有莫名其妙的问题,至今未找到原因,我有些怀疑他的源码似乎某处有点儿问题。
    原帖见此:http://topic.csdn.net/u/20091112/14/5176c590-21db-4c44-8162-3665acbea34a.html
      

  4.   


    呵呵,你真以为我做事会这么马虎(哈哈),数据量一大,什么 POI,jXL ,都一边去,没用的,呵呵,不信的话,用 POI 解析个 10万条记录,肯定死翘翘,这是经过实践的,哈哈
      

  5.   


    哥们我没这意识。
    POI是一次性加载所有文档,10万条记录是不是内存吃不消?
    一个sheet最多6000多条记录 10万也差不多17个sheet
    10万条记录你通常怎么处理?
      

  6.   


    一个 sheet 是 65536 好吧,你缩小10倍哟, MS 要告你诽谤哟。实际测试下来,内存到不会溢出,每个 sheet最好不要超过 2W 条,否则 POI会有问题。
      

  7.   

    测试了加入20000和30000条数据量 没问题 但是POI出奇的慢,jxl很稳定。poi耗时差不多是jxl的3-5倍
    当数据量增大到60000的时候 内存溢出!
      

  8.   

    小弟顺便问个问题:POI怎样彻底删除行?
    remove只是清空,
    shiftRows,如果目的行有merged region就不对了
      

  9.   

    楼主幸苦了..
    啥也不说了,了解啦
    小数据用poi
    大数据就用JXL
      

  10.   


    你错了,数据读取用POI,只要不涉及单元格样式的写入使用jxl效率高点。
    POI读取效率高,但是大数据量写入Excel效率比jxl慢,以上只是读取测试,写入测试我也做了,在博客里不过一般只会使用一种  要么POI,要么jxl 具体看开发数据量和处理要求了
      

  11.   

    我咋感觉 JXL 比 POI 更容易内存溢出?
      

  12.   


    POI功能比jxl强大,整体来说强于jxl
    大部分企业应该使用POI多于jxl
      

  13.   

    为什么我用POI读 10000 rows * 1000 columns, 没跑多久就出现了 OutOfMemory error. 内存占用1.5G多,从任务管理器看到是POI load 时候内存已经占到1.5G多了,为什么内存会占用这么多?有好的方式读取大数据量excel的方法吗?注:XP下最大内存只能配到1.5G啊 -Xmx
      

  14.   

    11w数据测试通过文件大小80M只读取poi 37分钟
          jxl 27分钟现在我想把这个大文件按sheet分成多个文件,然后再去做读取工作 不知道会不会快一点 请问 poi jxl怎么去分