最近做数据导出为Excel,特地比较了一下JXL和POI的性能,顺便记录下二者的用法

先定义一下测试条件

public class TestCondition {

/**

* 生成的记录条数

*/

public static final int RECORD_COUNT = 21000;

/**

* 模板文件

*/

public static final String TEMPLATE_FILE = "E:/MyKernelPlatformWorkspace/Template/query_order.xls";

/**

* JXL生成文件位置

*/

public static final String JXL_TARGET_FILE_NAME = "E:/MyKernelPlatformWorkspace/Template/target/jxl_order.xls";

/**

* POI生成文件位置

*/

public static final String POI_TARGET_FILE_NAME = "E:/MyKernelPlatformWorkspace/Template/target/poi_order.xls";

/**

* JXL临时文件位置

*/

public static final String JXL_TEMP_DIR = "E:/MyKernelPlatformWorkspace/Template/temp";

}

然后在此测试条件下编写JXL和POI的测试类,首先是JXL的

public class JXLExcel {

/**

* 起始行

*/

private static final int start_row = 3;

private WorkbookSettings settings;

private File target;

public JXLExcel() {

this.settings = new WorkbookSettings();

//设定JXL在生成excel文件时使用临时文件

settings.setUseTemporaryFileDuringWrite(true);

settings.setTemporaryFileDuringWriteDirectory(new File(TestCondition.JXL_TEMP_DIR));

this.target = new File(TestCondition.JXL_TARGET_FILE_NAME);

}

public void execute() throws Exception {

// 读入模板文件

Workbook template = Workbook.getWorkbook(new File(TestCondition.TEMPLATE_FILE));

WritableWorkbook worbook = Workbook.createWorkbook(target, template, settings);

// 获取第一个sheet

WritableSheet sheet = worbook.getSheet(0);

Random random = new Random();

// 循环写入数据

for(int i = 0;i < TestCondition.RECORD_COUNT;i++) {

int row = i + start_row;

sheet.insertRow(row);

Label col1 = new Label(0, row, String.valueOf(i + 1));

Label col2 = new Label(1, row, String.valueOf(random.nextLong()));

Label col3 = new Label(2, row, String.valueOf(random.nextLong()));

Label col4 = new Label(3, row, "merchant" + (i +1));

jxl.write.Number col5 = new Number(4, row, random.nextDouble());

jxl.write.Number col6 = new Number(5, row, random.nextDouble());

jxl.write.Number col7 = new Number(6, row, random.nextDouble());

jxl.write.Number col8 = new Number(7, row, random.nextDouble());

Label col9 = new Label(8, row, String.valueOf(random.nextLong()));

Label col10 = new Label(9, row, "PAY");

Label col11 = new Label(10, row, "POS");

Label col12 = new Label(11, row, "2010-09-03 12:45:13");

Label col13 = new Label(12, row, "2010-09-09 12:45:13");

Label col14 = new Label(13, row, "interface" + (i + 1));

Label col15 = new Label(14, row, "18701001830");

Label col16 = new Label(15, row, "ccbc");

Label col17 = new Label(16, row, String.valueOf(random.nextLong()));

Label col18 = new Label(17, row, String.valueOf(random.nextLong()));

jxl.write.Number col19 = new Number(18, row, random.nextDouble());

jxl.write.Number col20 = new Number(19, row, random.nextDouble());

Label col21 = new Label(20, row, "payer" + (i + 1));

Label col22 = new Label(21, row, String.valueOf(random.nextLong()));

Label col23 = new Label(22, row, "192.168.1.1");

Label col24 = new Label(23, row, "192.168.1.1");

sheet.addCell(col1);

sheet.addCell(col2);

sheet.addCell(col3);

sheet.addCell(col4);

sheet.addCell(col5);

sheet.addCell(col6);

sheet.addCell(col7);

sheet.addCell(col8);

sheet.addCell(col9);

sheet.addCell(col10);

sheet.addCell(col11);

sheet.addCell(col12);

sheet.addCell(col13);

sheet.addCell(col14);

sheet.addCell(col15);

sheet.addCell(col16);

sheet.addCell(col17);

sheet.addCell(col18);

sheet.addCell(col19);

sheet.addCell(col20);

sheet.addCell(col21);

sheet.addCell(col22);

sheet.addCell(col23);

sheet.addCell(col24);

}

worbook.write();

worbook.close();

}

}

执行Main函数

public class JXLMain {

/**

* 描述:

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

long jxlStart = System.currentTimeMillis();

JXLExcel jxl = new JXLExcel();

jxl.execute();

long jxlStop = System.currentTimeMillis();

System.out.println("jxl takes : " + (jxlStop - jxlStart)/1000 + " seconds.");

}

然后是POI的

public class POIExcel {

/**

* 起始行

*/

private static final int start_row = 3;

public void execute() throws Exception {

// 读入模板文件

InputStream is = new FileInputStream(TestCondition.TEMPLATE_FILE);

POIFSFileSystem poifsFileSystem = new POIFSFileSystem(is);

HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);

// 获取第一个sheet

HSSFSheet sheet = workbook.getSheetAt(0);

Random random = new Random();

// 将模板的最后两行移动

sheet.shiftRows(3, 4, TestCondition.RECORD_COUNT);

OutputStream os = new FileOutputStream(

TestCondition.POI_TARGET_FILE_NAME);

// 循环写入数据

for (int i = 0; i < TestCondition.RECORD_COUNT; i++) {

int rowNum = i + start_row;

HSSFRow row = sheet.createRow(rowNum);

HSSFCell cell1 = row.createCell(0);

cell1.setCellValue(i + 1);

HSSFCell cell2 = row.createCell(1);

cell2.setCellValue(String.valueOf(random.nextLong()));

HSSFCell cell3 = row.createCell(2);

cell3.setCellValue(String.valueOf(random.nextLong()));

HSSFCell cell4 = row.createCell(3);

cell4.setCellValue("merchant" + (i +1));

HSSFCell cell5 = row.createCell(4);

cell5.setCellValue(random.nextDouble());

HSSFCell cell6 = row.createCell(5);

cell6.setCellValue(random.nextDouble());

HSSFCell cell7 = row.createCell(6);

cell7.setCellValue(random.nextDouble());

HSSFCell cell8 = row.createCell(7);

cell8.setCellValue(random.nextDouble());

HSSFCell cell9 = row.createCell(8);

cell9.setCellValue(String.valueOf(random.nextLong()));

HSSFCell cell10 = row.createCell(9);

cell10.setCellValue("PAY");

HSSFCell cell11 = row.createCell(10);

cell11.setCellValue("POS");

HSSFCell cell12 = row.createCell(11);

cell12.setCellValue(new Date());

HSSFCell cell13 = row.createCell(12);

cell13.setCellValue(new Date());

HSSFCell cell14 = row.createCell(13);

cell14.setCellValue("interface" + (i + 1));

HSSFCell cell15 = row.createCell(14);

cell15.setCellValue("18701001830");

HSSFCell cell16 = row.createCell(15);

cell16.setCellValue("ccbc");

HSSFCell cell17 = row.createCell(16);

cell17.setCellValue(String.valueOf(random.nextLong()));

HSSFCell cell18 = row.createCell(17);

cell18.setCellValue(String.valueOf(random.nextLong()));

HSSFCell cell19 = row.createCell(18);

cell19.setCellValue(random.nextDouble());

HSSFCell cell20 = row.createCell(19);

cell20.setCellValue(random.nextDouble());

HSSFCell cell21 = row.createCell(20);

cell21.setCellValue("payer" + (i + 1));

HSSFCell cell22 = row.createCell(21);

cell22.setCellValue(String.valueOf(random.nextLong()));

HSSFCell cell23 = row.createCell(22);

cell23.setCellValue("192.168.1.1");

HSSFCell cell24 = row.createCell(23);

cell24.setCellValue("192.168.1.1");

}

workbook.write(os);

os.close();

}

执行Main函数

public class POIMain {

/**

* 描述:

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

long jxlStart = System.currentTimeMillis();

POIExcel poi = new POIExcel();

poi.execute();

long jxlStop = System.currentTimeMillis();

System.out.println("poi takes : " + (jxlStop - jxlStart)/1000 + " seconds.");

}

}

经过测试发现,在默认的JVM内存下,24列数据,POI在15000行以上就会发生out of memory异常,而jxl到21000以上才会发生异常,jxl使用时急着开启使用临时文件,可以有效地提高导出性能。

另外POI支持excel2003和2007,而jxl只支持excel2003。

分享到:

2012-04-13 18:51

浏览 4749

分类:互联网

评论

3 楼

18335864773

2017-06-06

使用POI、JXL直接生成Excel,很容易就造成内存溢出了。即使不溢出,由于代码执行耗时太久也会长时间阻塞web页面,导致web系统并发访问性能急剧下降。

一个PageOffice软件,本质上也是在客户端生成Excel表格的,但是这个产品提供的是服务器端的编程对象,接口很简单,调用起来比js舒服多了,通过对这个产品提供的服务器端Excel操作对象编程,客户端就能在用户需要Excel表格的时候实时生成,也同时解决了文件的在线预览和打印问题。PageOffice肯定是对Excel的接口做过深度优化的,填充上万行数据也能瞬间完成,还支持赋值公式、单元格样式和文本样式的设置,所以在此与大家分享一下,有兴趣可以去PageOffice的官网下载一个试用版测试。

2 楼

18335864773

2017-06-06

使用POI、JXL直接生成Excel,很容易就造成内存溢出了。即使不溢出,由于代码执行耗时太久也会长时间阻塞web页面,导致web系统并发访问性能急剧下降。

1 楼

安静听歌

2015-08-04

我想请问一下,jxl 开启临时文件怎么用啊,我的报:系统找不到指定的路径。我看过了的,temp文件我也试过手动创建,,,都是不行,,,

jxl导不出来_JXL和POI导出数据相关推荐

  1. 使用POI导出数据到excel代码

    使用POI导出数据到excel代码 POM文件 <!-- 导出excel --> <dependency><groupId>org.apache.poi</g ...

  2. Java使用poi导出数据到excel(包括xls和xlsx两种格式)并通过浏览器下载

    情景:将数据导出到excel是java开发常用的功能,数据量不大的时候,xls和xlsx两种格式的文件都行,但是数据量太大的时候就有区别了,xls格式的文件一个sheet页最多只能存六万多条数据,而x ...

  3. POI导出数据内存溢出问题

    POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好.3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWo ...

  4. poi导出数据文件名错误_POI导出Excel报错“扩展名与文件的格式不匹配”

    下面是我用POI导出Excel的实例: 依赖的jar包 org.apache.poi poi 4.0.1 工具类 public class ExportExcel { // 显示的导出表的标题 pri ...

  5. POI导出数据至Excel,cpu飙升 cpu占用很高,原因排查

    零 干货满满 1测试环境开启GC日志 -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+HeapDumpBeforeFull ...

  6. jxl导不出来_JXL导出及添加批注实战

    导出效果: //使用submit或a标签访问导出方法,千万不能用ajax,不刷新就不会出现下载框哦 //省略方法名接参查询等等操作 response.setContentType("appl ...

  7. poi导出数据到word,带图片且图片数量不确定(能确定数量范围,这里是3-20张)

    注:有更好解决方法,参考:https://blog.csdn.net/m0_49605579/article/details/122583318 1.导入依赖 maven版: <dependen ...

  8. 使用POI导出数据和图片,

    一个方法,需要传入 有参数的实体类,赋值到xls里面,和一个有多张图片的base64字段的字符串, @Overridepublic HSSFWorkbook getHSSFWorkbook(List& ...

  9. 关于POI导出数据的util与工具类

    // 使用前先将 FileUtil与PoiUtil两个工具类导入,再将ContractPrint导入action中,new contractprint 将三个参数传入即可 package cn.itc ...

最新文章

  1. 终于搞懂了sleep/wait/notify/notifyAll
  2. 性能指标TP99之我解
  3. python网络安全工具箱界面_Python开发案例:设计启动工具箱,显示图形界面的方式...
  4. 给大家展示一下最近在Yeslab安全实验室测试的设备!
  5. 【报告分享】2020年国风爆品的进阶之路-详析花西子的社媒营销策略.pdf(附下载链接)...
  6. 8月第三周网络安全:境内感染网络病毒主机数73.7万个
  7. 引入方式之行内样式表(CSS、HTML)
  8. Tortoise SVN安装后右键没有菜单的解决方法
  9. Unity 讯飞实时语音转写(一)—— 使用WebSocket连接讯飞语音服务器
  10. PS 2020版本放大工具无法鼠标左右拖动精细放大的解决方案
  11. printf左右对齐
  12. Python第二阶段学习 day17
  13. solidworks出专利图小技巧
  14. 用Excel做直方图(2):频率分布直方图
  15. html中怎样设置邮件地址,我该如何为自己的域名设置邮箱地址呢?
  16. 烤仔TVのCCW | 智能合约间的四种调用(下)
  17. 电脑的dns服务器未响应怎么解决,电脑DNS服务器未响应怎么解决
  18. VueCli3以下获取process.env.NODE_ENV数据
  19. 相似度(距离计算)汇总
  20. mysql循环方法总结

热门文章

  1. 计算机毕业设计java+ssm公交站牌广告灯箱管理系统(源码+系统+mysql数据库+Lw文档)
  2. Yottachain区块链存储泛圈科技芝麻云节点服务器共同肩负数据存储生态
  3. 机器人庄园作文_友谊伴我成长作文400字
  4. 国际化:理解Java平台上的Locale
  5. stable diffusion(杂谈)
  6. 格式工厂 wav 比特率_想拥有一款音频格式转换工具吗?TunesKit Audio Converter
  7. 用flask做microblog遇到的一些问题
  8. UV Micro-LED 用于传感、生产和通信的
  9. 软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
  10. restore和recover 区别