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行数 | 3000 | 6000 | 12000 | 20000 |
poi avg(ms) | 11.16 | 28.92 | 46.28 | 171.9 |
jxl avg(ms) | 29.76 | 24.22 | 25.99 | 43.06 |
poi total(ms) | 55.8 | 144.6 | 231,41 | 859.5 |
jxl total(ms) | 148.79 | 121.08 | 129.96 | 215.29 |
poi tps | 93.08 | 35.31 | 22.55 | 6.98 |
jxl tps | 33.77 | 47.48 | 47.36 | 25.23 |
poi内存占用(kb) | 11081.94 | 18653.23 | 42613.33 | 53047.9 |
jxl内存占用(kb) | 7033.92 | 7038 | 5724.46 | 7,030.30 |
1个sheet |
测试结果图:
每个sheet 6000条数据逐渐增加sheet个数
sheet个数 | 1 | 2 | 3 | 4 |
poi avg(ms) | 30.52 | 60.34 | 41.07 | 91.23 |
jxl avg(ms) | 31.22 | 22.75 | 25.62 | 27.89 |
poi total(ms) | 152.6 | 301.69 | 205.38 | 456.13 |
jxl total(ms) | 156.1 | 113.79 | 128.09 | 139.46 |
poi tps | 24.47 | 17.89 | 24.51 | 11.01 |
jxl tps | 42.21 | 45.04 | 50.95 | 44.78 |
poi内存占用(kb) | 18016.57 | 199449.01 | 52980.4 | 53882.59 |
jxl内存占用(kb) | 5727.59 | 7469.64 | 9235.39 | 9,236.00 |
6000条/sheet |
测试结论:
1. poi已消耗内存换取部分效率,而jxl在内存消耗上一直很稳定。POI很容易内存溢出
2.poi随着数据量的增大,性能直线下降,当我增大到24000条每个sheet的时候,内存溢出。jxl却能运行
建议在大数据量的时候使用jxl .可以保证效率和较小内存消耗。在具体开发中,对部分常用的excel下载,可生产副本文件,避免重复生产Excel消耗内存
3.在测试的过程中,发现POI极其不稳定。获得的数据有时候相差特别大。每种测试情况我是重复测试4次,然后取平均值