POI和jxl.jar性能比较

导出excel模板,由Jxls技术换为POI,以及解决POI与Jxls的jar包冲突问题 项目里有一个功能,是将数据库查询出的数据全部导出为excel报表,由于数据复杂,使用的是jxls模板,就是这样:jxls代码是这样的://      获得输出的响应 HttpServletResponse response = this.getResponse(); HSSFWorkbook workbook = JxlsManager.getWorkBookByTemplate( "te... 阅读详情

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行数300060001200020000
poi avg(ms)11.1628.9246.28171.9
jxl avg(ms)29.7624.2225.9943.06
poi total(ms)55.8144.6231,41859.5
jxl total(ms)148.79121.08129.96215.29
poi tps93.0835.3122.556.98
jxl tps33.7747.4847.3625.23
poi内存占用(kb)11081.9418653.2342613.3353047.9
jxl内存占用(kb)7033.9270385724.467,030.30
  1个sheet  

测试结果图:

 pj1

pjn1

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

sheet个数1234
poi avg(ms)30.5260.3441.0791.23
jxl avg(ms)31.2222.7525.6227.89
poi total(ms)152.6301.69205.38456.13
jxl total(ms)156.1113.79128.09139.46
poi tps24.4717.8924.5111.01
jxl tps42.2145.0450.9544.78
poi内存占用(kb)18016.57199449.0152980.453882.59
jxl内存占用(kb)5727.597469.649235.399,236.00
  6000条/sheet  

 

pj2 pjn2

测试结论:

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

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

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

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

Android中使用POI解析Excel的必备JAR包详解 Apache POI 是一个功能强大的 Java 库,广泛用于处理 Microsoft Office 格式文件,尤其是 Excel 文档。它不仅支持读取和写入 Excel 文件(包括 XLS 和 XLSX 格式),还提供了对图表、样式、公式等高级功能的支持。然而,由于其最初设计面向桌面和服务器端开发环境,直接在 Android 平台上使用时会面临诸多适配和性能问题。本章将深入剖析 Apache POI 的核心模块结构,并探讨其在 Android 平台上的适配现状与优化路径。 阅读详情

相关推荐

JXL库操作Excel详解及2.6版本jar包下载指南

JXL库,即Java Excel API,是由Philip Steele开发的一个开源项目,它允许Java应用程序读取和写入Microsoft Excel文件。JXL库的主要作用是为Java开发者提供一种方便、直接的方式来操作Excel文件,从而无需依赖于Microsoft Office或其它昂贵的第三方库。JXL库与Apache POI是处理Excel文件的两个流行库之一,但它更专注于读写兼容性更好的.xls格式文件。

weixin_35266799的博客 1108

jxl简单使用介绍

往Excel表中写数据: public class jxlWriteExcel { public static void main(String[] args) { // 获取文件 File file = new File("F:\\temp.xls"); try { // 如果文件不存在,那就创建一个新的文件 if (!file.exists()) { file.cr

qq_42449963的博客 1255

Java操作Excel实战:基于JXL的简洁读写实现

JXL(Java Excel API)是一个轻量级的Java库,专为读写Excel 97-2003格式(.xls)文件而设计。它以简单易用、资源消耗低的特点在早期Java开发中广受欢迎,尤其适用于数据导入导出、报表生成等业务场景。其核心功能包括:读取Excel中的单元格数据、支持多种数据类型解析(如字符串、数字、日期)、创建和写入新的Excel文件,并支持基本的样式设置。对于小型项目或对性能要求不苛刻的场景,JXL是一个快速上手的解决方案。要在Java项目中使用JXL,需下载其JAR包(如。

weixin_42611177的博客 1206

JXL jar包官方下载

jxl官方下载地址: http://maven.ibiblio.org/maven2/net/sourceforge/jexcelapi/jxl/2.6.12/ (上述链接是2.6.12版本下载地址) 如图: 备注: 1.直接在浏览器中输入上述地址时,因路径较深,且每个路径下文件过多,加载慢,所以会自动跳转到http://maven.ibiblio.org/maven2 ,请务必依...

涅磐 4万+

jxl.jar(java操作excel表格的工具类库)

[百度百科] jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的。 支持Excel 95-2000的所有版本 生成Excel 2000标准格式 支持字体、数字、日期操作 能够修饰单元格属性 支持图像和图表

Excel数据操纵-jar包-jxl.jar

通过java操作excel表格的工具类库   支持Excel 95-2000的所有版本   生成Excel 2000标准格式   支持字体、数字、日期操作   能够修饰单元格属性   支持图像和图表   应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。   搭建环境   将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。   (很大总是不能很好的加载,我想补充一下:把你下载好的JXL.JAR包放入D:\JAVA\jre\lib\ext中(我的是JDK1.6)就OK了。我相信在配置TOMCAT时也需要把相关的三个包放到这里面。)   基本操作   一、创建文件   拟生成一个名为“测试数据.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:   代码(CreateXLS.java):   //生成Excel的类   import java.io.*;   import jxl.*;   import jxl.write.*;   public class CreateXLS   {   public static void main(String args[])   {   try   {   //打开文件   WritableWorkbook book=   Workbook.createWorkbook(new File(“测试.xls”));   //生成名为“第一页”的工作表,参数0表示这是第一页   WritableSheet sheet=book.createSheet(“第一页”,0);   //在Label对象的构造子中指名单元格位置是第一列第一行(0,0)   //以及单元格内容为test   Label label=new Label(0,0,”test”);   //将定义好的单元格添加到工作表中   sheet.addCell(label);   /*生成一个保存数字的单元格   必须使用Number的完整包路径,否则有语法歧义   单元格位置是第二列,第一行,值为789.123*/   jxl.write.Number number = new jxl.write.Number(1,0,789.123);   sheet.addCell(number);   //写入数据并关闭文件   book.write();   book.close();   }catch(Exception e)   {   System.out.println(e);   }   }   }   编译执行后,会在当前位置产生一个Excel文件。   三、读取文件   以刚才我们创建的Excel文件为例,做一个简单的读取操作,程序代码如下:   //读取Excel的类   import java.io.*;   import jxl.*;   public class ReadXLS   {   public static void main(String args[])   {   try   {   Workbook book=   Workbook.getWorkbook(new File(“测试.xls”));   //获得第一个工作表对象   Sheet sheet=book.getSheet(0);   //得到第一列第一行的单元格   Cell cell1=sheet.getCell(0,0);   String result=cell1.getContents();   System.out.println(result);   book.close();   }catch(Exception e)   {   System.out.println(e);   }   }   }   程序执行结果:test   四、修改文件   利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他操作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表:   //修改Excel的类,添加一个工作表   import java.io.*;   import jxl.*;   import jxl.write.*;   public class UpdateXLS   {   public static void main(String args[])   {   try   {   //Excel获得文件   Workbook wb=Workbook.getWorkbook(new File(“测试.xls”));   //打开一个文件的副本,并且指定数据写回到原文件   WritableWorkbook book=   Workbook.createWorkbook(new File(“测试.xls”),wb);   //添加一个工作表   WritableSheet sheet=book.createSheet(“第二页”,1);   sheet.addCell(new Label(0,0,”第二页的测试数据”));   book.write();   book.close();   }catch(Exception e)   {   System.out.println(e);   }   }   }   执行结果如图:   高级操作   一、 数据格式化   在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。   1、 字串格式化   字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:   WritableFont font1=   new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); 或//设置字体格式为excel支持的格式 WritableFont font3=new WritableFont(WritableFont.createFont("楷体_GB2312"),12,WritableFont.NO_BOLD );① WritableCellFormat format1=new WritableCellFormat(font1); ② Label label=new Label(0,0,”data 4 test”,format1) ③ 其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。 ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。 ③处使用了Label类的构造子,指定了字串被赋予那种格式。 在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定:   //把水平对齐方式指定为居中   format1.setAlignment(jxl.format.Alignment.CENTRE);   //把垂直对齐方式指定为居中   format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);   //设置自动换行   format1.setWrap(true);   二、单元格操作   Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。   1、 合并单元格   WritableSheet.mergeCells(int m,int n,int p,int q);   作用是从(m,n)到(p,q)的单元格全部合并,比如:   WritableSheet sheet=book.createSheet(“第一页”,0);   //合并第一列第一行到第六列第一行的所有单元格   sheet.mergeCells(0,0,5,0);   合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。   2、 行高和列宽   WritableSheet.setRowView(int i,int height);   作用是指定第i+1行的高度,比如:   //将第一行的高度设为200   sheet.setRowView(0,200);   WritableSheet.setColumnView(int i,int width);   作用是指定第i+1列的宽度,比如:   //将第一列的宽度设为30   sheet.setColumnView(0,30);   五、操作图片   public static void write()throws Exception{   WritableWorkbook wwb=Workbook.createWorkbook(new File("c:/1.xls"));   WritableSheet ws=wwb.createSheet("Test Sheet 1",0);   File file=new File("C:\\jbproject\\PVS\\WebRoot\\weekhit\\1109496996281.png");   WritableImage image=new WritableImage(1, 4, 6, 18,file);   ws.addImage(image);   wwb.write();   wwb.close();   }   很简单和插入单元格的方式一样,不过就是参数多了些,WritableImage这个类继承了Draw,上面只是他构造方法的一种,最后一个参数不用了说了,前面四个参数的类型都是double,依次是 x, y, width, height,注意,这里的宽和高可不是图片的宽和高,而是图片所要占的单位格的个数,因为继承的Draw所以他的类型必须是double,具体里面怎么实现的我还没细看:)因为着急赶活,先完成功能,其他的以后有时间慢慢研究。以后会继续写出在使用中的心得给大家。   读:   读的时候是这样的一个思路,先用一个输入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet从工作薄中得到工作表,用Cell得到工作表中得某个单元格.   InputStream->Workbook->Sheet->Cell,就得到了excel文件中的单元格   代码:   String path="c:\\excel.xls";//Excel文件URL   InputStream is = new FileInputStream(path);//写入到FileInputStream   jxl.Workbook wb = Workbook.getWorkbook(is); //得到工作薄   jxl.Sheet st = wb.getSheet(0);//得到工作薄中的第一个工作表   Cell cell=st.getCell(0,0);//得到工作表的第一个单元格,即A1   String content=cell.getContents();//getContents()将Cell中的字符转为字符串   wb.close();//关闭工作薄   is.close();//关闭输入流   我们可以通过Sheet的getCell(x,y)方法得到任意一个单元格,x,y和excel中的坐标对应.   例如A1对应(0,0),A2对应(0,1),D3对应(3,2).Excel中坐标从A,1开始,jxl中全部是从0开始.   还可以通过Sheet的getRows(),getColumns()方法得到行数列数,并用于循环控制,输出一个sheet中的所有内容.   写:   往Excel中写入内容主要是用jxl.write包中的类.   思路是这样的:   OutputStream<-WritableWorkbook<-WritableSheet<-Label   这里面Label代表的是写入Sheet的Cell位置及内容.   代码:   OutputStream os=new FileOutputStream("c:\\test.xls");//输出的Excel文件URL   WritableWorkbook wwb = Workbook.createWorkbook(os);//创建可写工作薄   WritableSheet ws = wwb.createSheet("sheet1", 0);//创建可写工作表   Label labelCF=new Label(0, 0, "hello");//创建写入位置和内容   ws.addCell(labelCF);//将Label写入sheet中   Label的构造函数Label(int x, int y,String aString)xy意同读的时候的xy,aString是写入的内容.   WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD, false);//设置写入字体   WritableCellFormat wcfF = new WritableCellFormat(wf);//设置CellFormat   Label labelCF=new Label(0, 0, "hello");//创建写入位置,内容和格式   Label的另一构造函数Label(int c, int r, String cont, CellFormat st)可以对写入内容进行格式化,设置字体及其它的属性.   现在可以写了   wwb.write();   写完后关闭   wwb.close();   输出流也关闭吧   os.close;   OK,只要把读和写结合起来,就可以在N个Excel中读取数据写入你希望的Excel新表中,还是比较方便的.   下面是程序一例:   程序代码:sql = "select * from tablename";   rs = stmt.executeQuery(sql);   //新建Excel文件   String filePath=request.getRealPath("aaa.xls");   File myFilePath=new File(filePath);   if(!myFilePath.exists())   myFilePath.createNewFile();   FileWriter resultFile=new FileWriter(myFilePath);   PrintWriter myFile=new PrintWriter(resultFile);   resultFile.close();   //用JXL向新建的文件中添加内容   OutputStream outf = new FileOutputStream(filePath);   jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(outf);   jxl.write.WritableSheet ws = wwb.createSheet("sheettest", 0);   int i=0;   int j=0;   for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {   ws.addCell(new Label(k,0,rs.getMetaData().getColumnName(k+1)));   }   while(rs.next()){   out.println(rs.getMetaData().getColumnCount());   for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {   ws.addCell(new Label(k,j+i+1,rs.getString(k+1)));   }   i++;   }   wwb.write();   wwb.close();   }catch(Exception e){e.printStackTrace();}   finally{   rs.close();   conn.close();   }   response.sendRedirect("aaa.xls");

jxl和poi的对比及简单使用

1. 内存消耗对比 定量:数据量3000条,每条60列,JVM大小64M 使用jxl:3000条全部出来,并且内存还有21M的空间 使用poi:运行到2800条左右就内存溢出 2. 速度效率(读取Excel数据)数据来自网络 文件大小 jxl加载耗时 jxl总耗时 poi加载耗时 poi总耗时 57kb 1265ms 2250ms 1172ms 1172ms 652kb 4406ms 9750ms 2297ms 2313ms 2.24M 16313ms 37453ms 3109ms

兀行者的博客 2345

java操作excel——jxl和poi比较

项目代码 博文链接:https://lanhuidong.iteye.com/blog/1553532

POI和jxl.jar性能比较 .

JXL.jar  http://www.andykhan.com/jexcelapi/download.html  下载地址 优点: Jxl对中文支持非常好,操作简单,方法看名知意。 Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写 支持Excel 95-2000的所有版本 生成Excel 2000标准格式 支持字体、数

xiao190128的专栏 1005

手把手解决AutoDock安装那些坑:从autogrid报错到.map文件生成(Win10/11环境)

本文详细解析了在Win10/11环境下安装AutoDock时遇到的常见问题,特别是autogrid报错和.map文件生成失败的情况。通过实战验证的解决方案,包括环境变量设置、Python版本管理、文件权限调整等,帮助用户顺利完成安装并提升分子对接研究效率。

weixin_42548888的博客 198

Xilinx SDK工程编译、链接、调试注意事项

1、添加工程 启动SDK时选取workspace,如下图所示: 对应的workpace文件夹中会生成如下几个文件: 如果当前workspace是首次加载工程,SDK会进入启动界面 点击Import Project,导入已有工程 点击Browse,添加工程路径,一个完整的工程包含一个bsp文件夹,一个HW文件夹,和一个src文件夹(添加C功能函数) 点击Fini...

Autumn_He的博客 1万+

jxl 与poi 区别

最近在做report开发,用java将数据生成excel 表格,主要利用jxl.jar 和poi.jar来实现。 我看过两段代码,刚好一个是jxl写的,另一个是poi写的,区别可以看出来,^_^ 下面这些看不出来的是前人总结的: POI为apache公司的一个子项目,主要是提供一组操作windows文档的Java API. JavaExcel俗称jxl是一开放源码项目,通过它Java开发

舒婷(Zoe) 1万+

logisim计组实验八 乘法器

原理:点这里 有问题欢迎留言哦~ 文章目录五位阵列乘法器电路图时间延迟分析六位补码阵列乘法器五位无符号乘法流水线原理图电路图原码一位乘法器原理图电路图补码一位乘法器 五位阵列乘法器 电路图 此处注意:全加器FA的cout端是进位端而非输出端 使用硬件控制比循环累加的速度快得多。 但是存在串行进位链 改进版: 时间延迟分析 T是计算相加数的一级门延迟 3n–>2n 性能差别在1.5倍 ...

treblez's blog 2万+
上一篇: POI操作Excel
下一篇: 用事实证明POI和jxl写入效率
jarvis_java
博客等级 码龄17年 38粉丝 20原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值