poi 和jxl的性能比较,借鉴别人的,本人没有测试过,不过感觉自己可以接收这种解释

news/2024/7/21 6:35:07 标签: 测试, import, hashmap, null, excel, string

借鉴第一个网友的:

 

目前在项目中,因为需要操作Excel,所以对相关的excel开源项目进行了了解,目前对excel的操作支持比较完善的主有两个项目:一个是POI,一个是JXL。

关于POI与JXL的大致区别为:

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

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

支持Excel 95-2000的所有版本

生成Excel 2000标准格式

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

能够修饰单元格属性

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

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

POI

1.       效率高,这点很好

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

3.       能够修饰单元格属性

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

缺点:不成熟,代码不能跨平台。

这里再补充点更细节的区别,首先是POI不提供直接的通过单元格名称获取,如excel的某个单元格是B5,那么POI获取此单元格必须按行和列的编号进行获取,方法如getCell(1,4)这样;而JXL非常简单可以直接进行获取,方法如getCell("B5")这样。

还有一点是它们都具有一个共同的特点,就是都不提供复制功能,我所说的复制是从一个xls文件里的sheet复制到另一个xls文件里(不过POI提供在一个xls文件里的sheet复制)。后来我自己实现复制的操作。也略微明白了为什么它们都不提供复制功能,一个原因就是太复杂了。

关于POI复制(JXL也一样)需要注意以下几点:

1、printSetup的复制

2、CellStyle的复制

3、单元格合并

4、单元格隐藏

5、冻结窗口

6、FontStyle和Comment

7、各种单元格的类型(如数字型、字符型、公式类型、背景颜色等)

其中Cellstyle和FontStyle的复制有个小问题需要注意,就是不能创建太多的CellStyle和FontStyle,不然复制完成后,复制文件的大小比被复制文件的大小大很多。还有打开复制文件会报“单元格字体类型太多”或者是“单元格风格太多”之类的错误信息。CellStyle和FontStyle都需要进行缓存的方式进行处理。

 

 

 

借鉴第二个网友的:

 

测试环境:

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效率

Java代码
  1. package com.jarvis.mul;      
  2.      
  3. import java.io.File;      
  4. import java.io.FileInputStream;      
  5. import java.io.FileNotFoundException;      
  6. import java.io.FileOutputStream;      
  7. import java.io.IOException;      
  8. import java.io.InputStream;      
  9. import java.util.HashMap;      
  10.      
  11. import jxl.Cell;      
  12. import jxl.LabelCell;      
  13. import jxl.Sheet;      
  14. import jxl.Workbook;      
  15. import jxl.read.biff.BiffException;      
  16.      
  17. import org.apache.poi.hssf.usermodel.HSSFCell;      
  18. import org.apache.poi.hssf.usermodel.HSSFName;      
  19. import org.apache.poi.hssf.usermodel.HSSFRow;      
  20. import org.apache.poi.hssf.usermodel.HSSFSheet;      
  21. import org.apache.poi.hssf.usermodel.HSSFWorkbook;      
  22.      
  23. /**    
  24.  * @作者 Jarvis    
  25.  * @创建日期 Dec 2, 2009    
  26.  * @版本 V 1.0    
  27.  */     
  28.      
  29. public class PoiredadXLS {      
  30.     String filepath =string">"E:/5.xls" ;      
  31.     public void readSpeed(){      
  32.         try {      
  33. //           创建对Excel工作簿文件的引用      
  34.             long t1 = System.currentTimeMillis();      
  35.             FileInputStream rs = new FileInputStream(filepath) ;      
  36.             HSSFWorkbook workbook = new HSSFWorkbook(rs);      
  37.             long t2 = System.currentTimeMillis();      
  38.             System.out.println(string">"加载耗时:"+ (t2-t1));      
  39.             HashMap map = new HashMap();      
  40.             int total = workbook.getNumberOfSheets(); //获取sheet个数      
  41.             int start = 0;int end = 0 ;      
  42.             for(int i = 0 ; i < total ; i ++){      
  43.                 HSSFSheet sheet = workbook.getSheetAt(i);// 按索引获取sheet引用          
  44.                 System.out.println(sheet.getSheetName());      
  45.                 start = sheet.getFirstRowNum();  //sheet起始行索引      
  46.                 end = sheet.getLastRowNum();//sheet起结束行索引      
  47.                 int temp = 1;      
  48.                 HSSFRow row = null ;      
  49.                 HSSFCell cell1 = null ;      
  50.                 HSSFCell cell2 = null ;      
  51.                 while(temp < end){      
  52.                      row =  sheet.getRow(temp);//获取第N行表格数据      
  53.                      cell1 = row.getCell(2);//获取指定列单元格            
  54.                      cell2 = row.getCell(3);//获取指定列单元格        
  55.                      if(cell1 != null && cell1!= null){      
  56.                          map.put(cell1.toString(), cell2.toString()) ;      
  57.                      }      
  58.                      temp ++ ;      
  59.                 }      
  60.             }      
  61.         } catch (FileNotFoundException e) {      
  62.             // TODO Auto-generated catch block      
  63.             e.printStackTrace();      
  64.         } catch (IOException e) {      
  65.             // TODO Auto-generated catch block      
  66.             e.printStackTrace();      
  67.         }      
  68.      
  69.         }      
  70.     public void readExcel(){      
  71.         try {      
  72.             HashMap map = new HashMap();      
  73.             long t1 = System.currentTimeMillis();      
  74.             FileInputStream is = new FileInputStream(filepath);       
  75.             Workbook rwb = Workbook.getWorkbook(is); //         从输入流创建Workbook         
  76.             long t2 = System.currentTimeMillis();      
  77.             System.out.println(string">"加载耗时:"+ (t2-t1));      
  78.             String[] sheetname = rwb.getSheetNames();//获取所有的sheet名称,返回一个String数组      
  79.             int sleng = sheetname.length ;      
  80.             for(int i = 0 ; i < sleng ; i ++){      
  81.                 Sheet sheet = rwb.getSheet(sheetname[i]) ;      
  82.                 System.out.println(sheetname[i]);      
  83.                 int rows = sheet.getRows();//获取表格的总行数      
  84.                 int temp = 1;      
  85.                 Cell cell1 = null ;      
  86.                 Cell cell2 = null ;      
  87.                 while(temp < rows){      
  88.                     cell1 = sheet.getCell(2, temp);//第一个参数代表列 第二个参数代表行      
  89.                     cell2 = sheet.getCell(3, temp);//第一个参数代表列 第二个参数代表行      
  90.                     if(cell1 != null && cell2 != null){      
  91.                          map.put(cell1.getContents(), cell2.getContents()) ;      
  92.                     }      
  93.                     temp ++ ;      
  94.                 }      
  95.             }      
  96.             rwb.close();//关闭工作薄 流                 
  97.         } catch (BiffException e) {      
  98.             // TODO Auto-generated catch block      
  99.             e.printStackTrace();      
  100.         } catch (IOException e) {      
  101.             // TODO Auto-generated catch block      
  102.             e.printStackTrace();      
  103.         }      
  104.     }      
  105.     public static void main(String[] args) {      
  106.         PoiredadXLS r = new PoiredadXLS();      
  107.         long s = System.currentTimeMillis();      
  108.         r.readSpeed();      
  109.         r.readExcel();      
  110.         long e = System.currentTimeMillis();      
  111.         System.out.println(string">"总耗时:"+ (e-s));      
  112.     }      
  113.      
  114. }    
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行数据

 

 

 


http://www.niftyadmin.cn/n/614875.html

相关文章

java 读取 properties文件的各种方法

1。使用java.util.Properties类的load()方法示例&#xff1a; InputStream in lnew BufferedInputStream(new FileInputStream(name));Properties p new Properties();p.load(in);2。使用java.util.ResourceBundle类的getBundle()方法示例&#xff1a; ResourceBundle rb Re…

在tomcat中配置jndi

JNDI是J2EE中一个很重要的标准&#xff0c;通常我们是在J2EE编程中用到&#xff0c;Tomcat中提供了在JSP和Servelt中直接使用JNDI的方法&#xff0c;主要是通过dbcp连接池&#xff0c;下面谈一下我在Tomcat5.5中配置和使用JNDI的方法。一、先在自己应用程序WEB-INF目录下的web.…

jndi 详解

和多数java服务一样&#xff0c;SUN对JNDI也只提供接口&#xff0c;使用JNDI只需要用到JNDI接口而不必关心具体实现&#xff1a; private static Object jndiLookup() throws Exception { InitialContext ctx new InitialContext(); return ctx.lookup("java:comp/env…

jndi 数据源配置详解

web.xml中&#xff1a; 在<web-app>中加入以下内容 <resource-ref> <description>java_min</description> <res-ref-name>datasourceName</res-ref-name> 数据源名称&#xff0c;与tomcat中中的server.xml中的数据源名字保持…

ResourceBundle 对象读取属性文件

rb ResourceBundle.getBundle("com/util/Application",Locale.getDefault()); 根据默认的语言环境家在路径com/util下的 Application.properties 属性文件&#xff0c;上面写时不用带后缀的&#xff0c;该路径默认相对为src路径下 获取属性文件中的值 String value …

struts 标签讲解

配置&#xff1a; 由于struts标签和国际化紧密联系&#xff0c;所以要配置国际化文件。 1&#xff0c;在struts-config.xml文件中加入 <messageResources parameter"MessageResources" /> 2&#xff0c;拷贝MessageResources.properties文件到src下 标签是在服…

EL表达式讲解

EL表达式的使用前提是&#xff0c;容器必须在2.4及以上版本。 EL表达式中有隐式对象&#xff0c;pageScope,requestScope,sessionScope,applicationScope EL表达式默认查找变量的顺序会按照以上顺序从隐式对象中取值&#xff0c;为了提高效率&#xff0c;我们可以直接指定搜…

jstl标签库讲解

jstl标签库的配置 * 将jstl.jar和standard.jar拷贝到WEB-INF/lib下&#xff08;如果单纯的使用EL表达式&#xff0c;不用拷贝这两个jar&#xff09; 注意&#xff1a;jstl必须在能够支持j2ee1.4/servlet2.4/jsp2.0版本上的容器才能运行(因为jstl和EL表达式结合使用的)&#xff…