`
lanhuidong
  • 浏览: 227287 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java操作excel——jxl和poi比较

    博客分类:
  • Java
阅读更多

最近需要需要项目开发需要从excel导入数据到数据库,于是就开始找开源的java操作excel的框架。貌似比较流行的有jxl和poi两个框架。网上有些对这两个框架比较的文章,但都不是最近的。根据项目需要,下面对jxl和poi读写excel的性能做个比较。

 

jxl:jxl-2.6.12.jar

poi:poi-3.8.jar

 

JXLTestMain.java

package com.nexusy.excel.jxl;

import java.io.File;
import java.io.IOException;
import java.util.List;

import jxl.Cell;
import jxl.CellType;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import com.nexusy.excel.Record;
import com.nexusy.excel.TestUtil;

public class JXLTestMain {
    
    private final static String filename = "jxltest.xls";
    private final static String[] headers = {"ID", "标题", "价格", "数量", "描述"};
    
    private final static int rows = 65535;

    public static void main(String[] args) {
        writeExcel();
        readExcel();
    }
    
    public static void writeExcel() {
        try {
            Thread.sleep(1000*20);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        try {
            WritableWorkbook workbook = Workbook.createWorkbook(new File(filename));
            
            WritableSheet  sheet = workbook.createSheet("jxl测试", 0);
            
            for (int i = 0; i < headers.length; i++) {
                Label label = new Label(i, 0 , headers[i]);
                sheet.addCell(label);
            }
            
            List<Record> records = TestUtil.getRecords(rows);
            long s1 = System.nanoTime();
            int c = 1;
            for (Record record : records) {
                sheet.addCell(new Number(0, c, record.getId()));
                sheet.addCell(new Label(1, c, record.getTitle()));
                sheet.addCell(new Number(2, c, record.getPrice()));
                sheet.addCell(new Number(3, c, record.getQuantity()));
                sheet.addCell(new Label(4, c, record.getDesc()));
                c++;
            }
            
            workbook.write();
            workbook.close();
            long s2 = System.nanoTime();
            System.out.println("jxl write " + rows + " rows to excel:" + (s2-s1));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (RowsExceededException e) {
            e.printStackTrace();
        } catch (WriteException e) {
            e.printStackTrace();
        }

    }

    public static void readExcel() {
        try {
            Thread.sleep(1000*20);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        try {
            long s1 = System.nanoTime();
            Workbook workbook = Workbook.getWorkbook(new File(filename));
            Sheet sheet = workbook.getSheet(0);
            System.out.println(sheet.getName());
            for(int i = 0; i < sheet.getRows(); i++){
                Cell[] cells = sheet.getRow(i);
                for (Cell cell : cells) {
                    if(cell.getType() == CellType.NUMBER){
                        System.out.print(((NumberCell)cell).getValue()+"  ");
                    } else if(cell.getType() == CellType.LABEL){
                        System.out.print(cell.getContents()+"  ");
                    }
                }
                System.out.println();
            }
            workbook.close();
            long s2 = System.nanoTime();
            System.out.println("jxl read " + rows + " rows from excel:" + (s2-s1));
        } catch (BiffException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

POITestMain.java

package com.nexusy.excel.poi;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

import com.nexusy.excel.Record;
import com.nexusy.excel.TestUtil;

public class POITestMain {
    
    private final static String filename = "poitest.xls";
    private final static String[] headers = {"ID", "标题", "价格", "数量", "描述"};
    
    private final static int rows = 65535;

    public static void main(String[] args) {
        writeExcel();
        readExcel();
    }

    public static void writeExcel() {
        try {
            Thread.sleep(1000*20);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        Workbook wb = new HSSFWorkbook();
        try {
            FileOutputStream fileOut = new FileOutputStream(filename);
            
            Sheet sheet = wb.createSheet("poi测试");
            Row row = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                row.createCell(i).setCellValue(headers[i]);
            }
            
            List<Record> records = TestUtil.getRecords(rows);
            long s1 = System.nanoTime();
            int r = 1;
            for (Record record : records) {
                row = sheet.createRow(r);
                row.createCell(0).setCellValue(record.getId());
                row.createCell(1).setCellValue(record.getTitle());
                row.createCell(2).setCellValue(record.getPrice());
                row.createCell(3).setCellValue(record.getQuantity());
                row.createCell(4).setCellValue(record.getDesc());
                r++;
            }
            
            wb.write(fileOut);
            fileOut.close();
            long s2 = System.nanoTime();
            System.out.println("poi write " + rows + " rows to excel:" + (s2-s1));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void readExcel() {
        try {
            Thread.sleep(1000*20);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        try {
            long s1 = System.nanoTime();
            InputStream inp = new FileInputStream(filename);
            Workbook wb = new HSSFWorkbook(inp);
            Sheet sheet = wb.getSheetAt(0);
            System.out.println(sheet.getSheetName());
            
            for(Row row : sheet){
                for(Cell cell : row){
                    switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.print(cell.getNumericCellValue() + "  ");
                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.print(cell.getStringCellValue() + "  ");
                        break;

                    default:
                        break;
                    }
                }
                System.out.println();
            }
            inp.close();
            long s2 = System.nanoTime();
            System.out.println("poi read " + rows + " rows from excel:" + (s2-s1));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

}

 

 测试结果如下:

jxl写入65535行数据

 

jxl读取65535行数据: 

 

 

poi写入65535行数据:


 poi读取65535行数据:

 

 

  • 大小: 41.4 KB
  • 大小: 38.6 KB
  • 大小: 40.1 KB
  • 大小: 40.2 KB
  • excel.zip (3.5 MB)
  • 描述: 项目代码
  • 下载次数: 469
分享到:
评论
11 楼 zi_wu_xian 2016-09-02  
不管用POI还是JXL都是第三的操作excel的组件,都有破坏excel文件格式的可能,还是用PageOffice动态生成excel文件,操作excel文件中的数据比较好,因为是调用的Office自己的VBA接口,所以不会有格式问题。
10 楼 lanhuidong 2014-03-29  
weimeili8211 写道
我用poi,jxl都 会内存溢出

9 楼 weimeili8211 2014-03-28  
我用poi,jxl都 会内存溢出
8 楼 tony_jingzhou 2013-10-16  
tangzililiang 写道
这样比较太片面了哦,如果尝试用POI的事件驱动模式读取我相信内存占用会大大降低,JXL将文件一次性加载到内存,读取大文件是短板(原理可参照xml文件读取方式dom和sax的区别)

采用事件模型,poi读取10M以上的Excel 还是会内存溢出?
7 楼 tangzililiang 2013-07-01  
这样比较太片面了哦,如果尝试用POI的事件驱动模式读取我相信内存占用会大大降低,JXL将文件一次性加载到内存,读取大文件是短板(原理可参照xml文件读取方式dom和sax的区别)
6 楼 lanhuidong 2013-05-09  
bamboo_prince 写道
好像效率差不多嘛,你推荐用哪种啊?

我自己选择了poi
5 楼 bamboo_prince 2013-05-08  
好像效率差不多嘛,你推荐用哪种啊?
4 楼 lanhuidong 2013-05-02  
winerlinwen1 写道
我怎么读到2760行就爆了!我用poi操作的!

什么爆了?
3 楼 winerlinwen1 2013-04-28  
我怎么读到2760行就爆了!我用poi操作的!
2 楼 lanhuidong 2012-09-10  
zhangjian420 写道
这个是什么工具监视的!

jvisualvm,jdk自带的工具,在bin目录中。兄弟可有更好的监视工具推荐?
1 楼 zhangjian420 2012-07-24  
这个是什么工具监视的!

相关推荐

    浅谈jxl解析excel —————复制、修改excel表

    本文将围绕“浅谈jxl解析excel ——复制、修改excel表”这一主题,深入探讨JXL库的使用方法和关键知识点。 首先,JXL库提供了丰富的API,使得开发人员可以方便地操作Excel文件的各个部分,如工作表、单元格、样式等...

    jxl和poi读取写入表格jar包,文档和示例

    本资源提供了两个流行的库——JXL和Apache POI,用于读取和写入Excel表格,同时还附带了相关的文档和Java项目源码示例,方便开发者快速理解和应用。 JXL是一个Java库,它允许开发人员对Microsoft Excel文件进行读写...

    jxl.jar——JavaExcel library.zip

    JavaExcel库,通常以jxl.jar的形式出现,是Java开发者用于读取和写入Microsoft Excel文件的一个强大工具。这个库提供了方便的API,使得在Java应用程序中操作Excel电子表格变得非常简单。它不仅支持基本的读写功能,...

    java 操作excel代码和jar包

    在这个场景中,我们关注的是如何使用Java来操作Excel,并且涉及到了一个关键的库——jxl.jar,以及一个名为OperaterExcel的Java类。 首先,jxl.jar是一个广泛使用的Java库,它允许开发者读写Microsoft Excel文件。...

    jxl.jar包(java导入导出Excel文件)

    **Java Excel工具包——jxl.jar** 在Java编程中,处理Excel文件是一项常见的任务,尤其在数据导入导出、报表生成或数据分析等场景下。jxl.jar是一个专门为Java设计的库,它允许开发者轻松地读取、写入和修改Excel...

    java 操作 excel教程

    #### 二、Java操作Excel的核心库——JXL JXL(Java Excel API)是一款用于读写Excel文件的强大Java库。它能够帮助开发者轻松地实现对Excel文件的操作,包括但不限于读取、修改和创建Excel文档。该库适用于处理`.xls`...

    java操作 Excel 的jar包--jxl.jar

    Java 操作 Excel 的工具库——JExcelApi 深度解析 在 Java 开发中,处理 Excel 文件是一项常见的任务,例如读取数据、写入数据、格式化单元格等。JExcelApi 是一个广泛使用的开源库,专为 Java 开发者提供对 ...

    jxl操作excel文件例子

    描述中提到的“通过jxl操作excel,简单方便”,暗示了JXL库的一个关键优点——简洁易用的API,使得对Excel文件的操作变得相当直观。 JXL库支持多种Excel文件操作,包括但不限于: 1. **读取Excel文件**:你可以使用...

    jxl.jar excel操作包

    这时,jxl.jar就扮演了这样一个角色——它是一个专门用于操作Excel文件的Java库。 jxl.jar的核心功能在于,它允许Java应用程序读取、写入以及修改Excel文件。这个小巧的库以其快速的执行速度和低内存占用而备受赞誉...

    jxl.jar完整包 用于操作Excel

    这就引出了我们今天要讨论的主角——jxl.jar。 jxl.jar是一个Java库,它允许开发者在Java程序中读取、写入和修改Excel文件。这个库的功能强大,易于使用,为开发者提供了丰富的API,使得在Java环境下处理Excel工作...

    java-exal制作

    本篇文章将详细探讨两种主流的Java库——JXL和Apache POI,用于读取和写入Excel文件的机制。 首先,JXL(Java Excel API)是一个轻量级的库,它提供了对Excel文件的读写功能。JXL支持老版本的Excel文件格式,即....

    Java处理Excel文件

    #### 一、Java与Excel交互的核心库——JXL(JExcelApi) 在Java开发中,处理Excel文件通常涉及到读取、修改、创建Excel文档的功能,而`JXL`(Java eXcel API)正是为这一需求提供了强大的支持。JXL是一个开源的Java...

    jxl-2.6.12.jar

    本文将深入探讨jxl库的最新版本——jxl-2.6.12.jar,揭示其核心功能、使用方法以及实际应用中的最佳实践。 jxl库是Java中用于读写Microsoft Excel文件的开源库,它的出现极大地简化了Java开发者与Excel文件之间的...

    jxl读取Excel报表

    在Java编程环境中,处理Excel数据是一项常见的任务,而“jxl”库则为开发者提供了方便的接口来读取和写入Excel文件。标题中的“jxl读取Excel报表”指的是利用jxl库来操作Excel文件,特别是从Excel文件中提取数据以...

    Android 开发Excel需要的jar包

    本文将详细介绍如何在Android应用中实现Excel的读写操作,并重点讲解两个关键的Java库——jxl.jar和poi.jar。 首先,`jxl.jar`是一个Java API,用于读写Microsoft Excel文件。它支持Biff8格式的Excel 97-2003工作簿...

    java导出Excel

    这里,我们探讨三种不同的Java库——Apache POI、JExcelApi(jxl)以及在JSP中实现Excel导出的方法。 1. Apache POI: Apache POI是一个开源库,专门用于读写Microsoft Office格式的文件,包括Excel。它提供了HSSF...

    jxl2.6.5

    《Java操作Excel:JXL库详解》 在Java编程中,处理Excel文件是一项常见的任务,尤其是在数据导入导出、报表生成等领域。对于这样的需求,Java社区提供了一个强大的库——JExcelApi(简称JXL),其版本号为2.6.5。这...

    jxlpoi-1.0-bin.zip

    "jxlpoi"这个名字暗示了它是两个流行Java库——JXL和Apache POI的结合体,旨在提供更强大的Excel操作功能。 【描述】"jxlpoi-1.0-bin.zip" 提供的是二进制版本的库,意味着它包含了编译好的Java类文件,可以直接在...

Global site tag (gtag.js) - Google Analytics