JAVA导出上万行Excel数据的解决方案ITeye - 威尼斯人

JAVA导出上万行Excel数据的解决方案ITeye

2019年03月26日11时48分16秒 | 作者: 元绿 | 标签: 数据,导出,上万 | 浏览: 426

  在Java Web开发中,常常需求导出很多的数据到Excel,动辄就上千,上万行的数据让咱们的程序感觉压力很大,乃至都呈现无法导出的状况,运用POI、JXL直接生成Excel,很简单就形成内存溢出了。即便不溢出,因为代码履行耗时太久也会长时刻堵塞web页面,导致web体系并发拜访功用急剧下降。

  怎样处理内存溢出问题呢?用POI处理的话,究竟数据仍是一次性在内存中进行保存的,数据量太大JVM就内存溢出了,这时咱们想是不是能够导出多个Excel呢?

  沿着这个思路去想问题,首要咱们要确认数据量有多大,然后确认一个Excel导出多少条数据,这样就能够确认导出的Excel的数量,所以咱们就能够循环的导出Excel并保存在恣意的暂时目录中去,这样假如内存不行的话虚拟机就会去进行收回现已保存的Excel在内存中的空间。

  假定咱们咱们现已成功的生成了多个Excel,这时咱们怎样把这N个Excel文档传到客户端展现呢?其实一个一个的传也未尝不可,可是考虑那样对用户来说体会不行好,用户保存一个个文件到本地再翻开,再一个一个阅读或许打印很是不方便。

  用生成多个文件发送到客户端的计划增加了开发难度,生成文件的速度也更慢了。假如换一种办法,绕过JVM的内存约束问题应该怎样处理呢?能够在客户端生成文件。

  网上能找到几家做在线修改office文件的产品,有的供给了js调用Office的VBA接口的目标,采用在客户端翻开文件时,用js经过VBA接口把数据填充到Excel单元格中去生成文件,这样就绕过了服务器上内存溢出的问题,减轻了服务器的压力,是不是可行呢?经测验,此办法生成几千行数据的Excel表格速度就比较慢了,一旦上万行数据,履行功率就会急速下降乃至程序死掉。更为可怕的是,怎样把后台代码查询的数据集的上万行数据传递给前台页面的js,编程更苦楚。没有更好的办法了吗?也不是。

  自己最近研讨了一个国产的商业软件PageOffice,本质上也是在客户端生成Excel表格的,可是这个产品供给的是服务器端的编程目标,接口很简单,调用起来比js舒畅多了,经过对这个产品供给的服务器端Excel操作目标编程,客户端就能在用户需求Excel表格的时分实时生成,也一起处理了文件的在线预览和打印问题。PageOffice肯定是对Excel的接口做过深度优化的,自己测验的成果,填充上万行数据也能瞬间完结,还支撑赋值公式、单元格款式和文本款式的设置(因为自己开发的项目中无需处理这些,关于这些功用没做研讨,所以无法做深化的描绘),所以在此与我们共享一下,有爱好能够去PageOffice的官网下载一个试用版测验。


  附自己测验PageOffice导出2万行Excel表格的代码:

  Workbook wb = new Workbook();
  Sheet sheet1 = wb.openSheet("Sheet1");
  Table table = sheet1.openTable("B1:F2");
  for(int i=0; i 20000;i++) {
table.getDataFields().get(0).setValue (String.valueOf(i));//B列
table.getDataFields().get(1).setValue("测验");//C列
table.getDataFields().get(2).setValue("测验");//D列
table.getDataFields().get(3).setValue("测验");//E列
table.getDataFields().get(4).setValue("测验");//F列
table.nextRow();
}
table.close()

PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
poCtrl1.setServerPage("poserver.do"); //此行有必要
poCtrl1.webOpen("doc/template.xlsx", OpenModeType.xlsSubmitForm, "");
poCtrl1.setTagId("PageOfficeCtrl1"); //此行有必要

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章