今天测试了下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吧
测试环境: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吧
解决方案 »
- tomcat启动了 但网页无法访问
- 现在网站上有什么样的功能
- 关于DWR DWRUtil is not defined 错误
- struts导出excel问题,请教各位,先谢谢了!!!!!!!!!
- eclipse中配置tomcat失败!求助
- 在用hibernate+sturts 做新闻系统时向oracle数据库中类型为long 的字段中插值时长度超过4k就会失败,求救??????!!
- [急问]EJB QL的问题:如何往IN()里面传参数,在线等,谢谢
- 请各路高手介绍基本能对java学习有所提高的书~中英文都行~!
- 高手请进:小弟遇到这样的一个问题如何解决呢,请帮忙.
- java垃圾收集日志 Allocation Failure
- myeclipse9 struts2 struts.xml文件报错
- java 读写excel 使用什么方案效率最高
原帖见此:http://topic.csdn.net/u/20091112/14/5176c590-21db-4c44-8162-3665acbea34a.html
呵呵,你真以为我做事会这么马虎(哈哈),数据量一大,什么 POI,jXL ,都一边去,没用的,呵呵,不信的话,用 POI 解析个 10万条记录,肯定死翘翘,这是经过实践的,哈哈
哥们我没这意识。
POI是一次性加载所有文档,10万条记录是不是内存吃不消?
一个sheet最多6000多条记录 10万也差不多17个sheet
10万条记录你通常怎么处理?
一个 sheet 是 65536 好吧,你缩小10倍哟, MS 要告你诽谤哟。实际测试下来,内存到不会溢出,每个 sheet最好不要超过 2W 条,否则 POI会有问题。
当数据量增大到60000的时候 内存溢出!
remove只是清空,
shiftRows,如果目的行有merged region就不对了
啥也不说了,了解啦
小数据用poi
大数据就用JXL
你错了,数据读取用POI,只要不涉及单元格样式的写入使用jxl效率高点。
POI读取效率高,但是大数据量写入Excel效率比jxl慢,以上只是读取测试,写入测试我也做了,在博客里不过一般只会使用一种 要么POI,要么jxl 具体看开发数据量和处理要求了
POI功能比jxl强大,整体来说强于jxl
大部分企业应该使用POI多于jxl
jxl 27分钟现在我想把这个大文件按sheet分成多个文件,然后再去做读取工作 不知道会不会快一点 请问 poi jxl怎么去分