最近需要需要项目开发需要从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 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 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

描述: 项目代码

下载次数: 469

分享到:

2012-06-06 20:48

浏览 19914

评论

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

这个是什么工具监视的!

java jxl poi_java操作excel——jxl和poi比较相关推荐

  1. 使用JXL组件操作Excel和导出文件

    使用JXL组件操作Excel和导出文件 原文链接:http://tianweili.github.io/blog/2015/01/29/use-jxl-produce-excel/ 前言:这段时间参与 ...

  2. java excel row遍历空_用Java巧妙的解析Excel中的POI

    原标题:用Java巧妙的解析Excel中的POI 相信各位小伙伴们,在做Java开发的时候,有时候会需要你用Java语言去解析Excel中的POI,这个时候肯定很多小伙伴们会懵逼,那么究竟是怎么实现的 ...

  3. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

  4. Java利用jxl.jar操作Excel文件的方法——把两列相同的数据扫描输出到新的Excel文件中...

    为什么80%的码农都做不了架构师?>>>    最近公司在做数据库方面的改造,其中有两个核心库,可以把它们分别命名成A侧库和B侧库,改造的目的是把AB的库整合成一个库,其中表名相同的 ...

  5. java jxl包_java利用JXL包操作Excel表

    源码 package test; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; im ...

  6. Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  7. Java使用easyExcel操作Excel就是这么简单!

    文章目录 前言 第一步:导入依赖 第二步:创建一个EasyExcelReadListener类,继承easyExcel中的AnalysisEventListener类,实现里面的invoke()和do ...

  8. java mergecells_java怎么操作excel合并单元格

    展开全部 利用java操作Excel,有个开源的东东-jxl.jar,可以到http://sourceforge.net/project/showfiles.php?group_id=79926下载. ...

  9. java聚合excel_java操作excel

    1.工具准备 (1)下载poi.jar (2)eclipse 2.Excel准备 3.代码示例 import java.io.FileInputStream; import java.io.FileN ...

最新文章

  1. 最小二乘法+牛顿法+拟牛顿法+梯度下降法+梯度上升法+共轭梯度法
  2. [Javascipt] Immediately-Invoker 2
  3. JUC系列(五)| Synchonized关键字进一步理解
  4. 把Liststring集合,编程string,并以“,”号分割
  5. 常用工具说明--mongodb、mysql解压版、IDEA配置maven
  6. linux-facl权限控制-移除-复制
  7. Servlet梳理一
  8. python selenium模拟键盘_Python+Selenium自动化篇-7-模拟键盘操作
  9. MVC HtmlHelper扩展——实现分页功能
  10. Matlab曲线标记间距自定义
  11. 重装XP后无法启动LINUX的解决方案
  12. android游戏菜鸟教程,菜鸟教程app
  13. unity安装后 启动失败_Unity3D插件安装常见问题说明
  14. Halcon教程十二:回形针识别进阶
  15. 国产版谷歌地球到底有多牛?看入行20年“老人”怎么回答
  16. Unity机器学习3 ML-Agents模仿学习(Imitation Learning)
  17. WePhone手机软件已下架 疑因资金问题导致无法使用
  18. DataFrame上下或左右合并 pd.concat
  19. 少儿编程是选择线上与线下?
  20. php实现维吉尼亚算法,python实现维吉尼亚算法

热门文章

  1. 笔记本风扇噪音大的处理办法
  2. FZU 1851 组合数
  3. 如何彻底关闭win10实时防护以及解决无法找到gpedit.msc的问题
  4. 软件测试工程师一天的工作内容是什么呢?(含一天的详细步骤)
  5. jsp和MySQL实现会员卡功能_健身房会员卡管理系统的设计与实现(JSP,MySQL)(含录像)...
  6. Java | interface 和 implements 关键字【接口,看这篇就够了】
  7. python+moviepy音视频处理(三):视频特效方法-vfx模块
  8. Java Poi 读取 Excel2007 自定义属性
  9. 【ExcelPlanet】电商母婴用品购买情况分析
  10. 【EasyMouse】把你的安卓手机变成无线鼠标