来源 : http://www.iteye.com/topic/422117
范例
http://devbbs.doit.com.cn/thread-72-1-1.html
看过很多关于Excel导出时出现内存溢出的情况,也有很多解决方案。现提供如下解决方案,如有不妥,请指正:
该项目使用B/S架构,由于POI、JXL在导出excel大数据量情况下会产生大量对象最终导致内存溢出。其实Excel可以另存为html文件,保存为html后的文件内容如下: Html代码
<html xmlns="urn:schemas-microsoft-comfficeffice"
xmlns:x="urn:schemas-microsoft-comffice:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 11">
……样式信息……
<body link=blue vlink=purple>
<table x:str border=0 cellpadding=0 cellspacing=0 width=620 style='border-collapse:
collapse;table-layout:fixed;width:466pt'>
<col width=129 style='mso-width-source:userset;mso-width-alt:4128;width:97pt'>
<col class=xl25 width=72 span=2 style='width:54pt'>
<col class=xl25 width=63 style='mso-width-source:userset;mso-width-alt:2016;
width:47pt'>
<col class=xl25 width=118 style='mso-width-source:userset;mso-width-alt:3776;
width:89pt'>
<col width=166 style='mso-width-source:userset;mso-width-alt:5312;width:125pt'>
<tr height=19 style='height:14.25pt'>
<td height=19 class=xl24 width=129 style='height:14.25pt;width:97pt'>字段1</td>
<td class=xl24 width=72 style='width:54pt'>字段2</td>
<td class=xl24 width=72 style='width:54pt'>字段3</td>
<td class=xl24 width=63 style='width:47pt'>字段4</td>
<td class=xl24 width=118 style='width:89pt'>字段5</td>
<td width=166 style='width:125pt'></td>
</tr>
……数据……
<![if supportMisalignedColumns]>
<tr height=0 style='display:none'>
<td width=129 style='width:97pt'></td>
<td width=72 style='width:54pt'></td>
<td width=72 style='width:54pt'></td>
<td width=63 style='width:47pt'></td>
<td width=118 style='width:89pt'></td>
<td width=166 style='width:125pt'></td>
</tr>
<![endif]>
</table>
</body>
</html>
<html xmlns="urn:schemas-microsoft-comfficeffice"
xmlns:x="urn:schemas-microsoft-comffice:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 11">
……样式信息……
<body link=blue vlink=purple>
<table x:str border=0 cellpadding=0 cellspacing=0 width=620 style='border-collapse:
collapse;table-layout:fixed;width:466pt'>
<col width=129 style='mso-width-source:userset;mso-width-alt:4128;width:97pt'>
<col class=xl25 width=72 span=2 style='width:54pt'>
<col class=xl25 width=63 style='mso-width-source:userset;mso-width-alt:2016;
width:47pt'>
<col class=xl25 width=118 style='mso-width-source:userset;mso-width-alt:3776;
width:89pt'>
<col width=166 style='mso-width-source:userset;mso-width-alt:5312;width:125pt'>
<tr height=19 style='height:14.25pt'>
<td height=19 class=xl24 width=129 style='height:14.25pt;width:97pt'>字段1</td>
<td class=xl24 width=72 style='width:54pt'>字段2</td>
<td class=xl24 width=72 style='width:54pt'>字段3</td>
<td class=xl24 width=63 style='width:47pt'>字段4</td>
<td class=xl24 width=118 style='width:89pt'>字段5</td>
<td width=166 style='width:125pt'></td>
</tr>
……数据……
<![if supportMisalignedColumns]>
<tr height=0 style='display:none'>
<td width=129 style='width:97pt'></td>
<td width=72 style='width:54pt'></td>
<td width=72 style='width:54pt'></td>
<td width=63 style='width:47pt'></td>
<td width=118 style='width:89pt'></td>
<td width=166 style='width:125pt'></td>
</tr>
<![endif]>
</table>
</body>
</html>
至此,可通过数据生成如上格式的HTML文本信息则避开大量对象的建立,如果将该HTML直接以application/excel返回浏览器时则Excel文件会比普通大一点,可以通过配置过滤器对该HTML进行压缩即可,如下:
Java代码
response.reset();
response.setContentType("application/zip;charset=GBK");
String s = "查询-" + new java.sql.Date(System.currentTimeMillis()).toString().replaceAll("-","") + ".xls";
String filename = s + ".zip";
response.addHeader("Content-Disposition", "inline;filename=" + filename);
response.reset();
response.setContentType("application/zip;charset=GBK");
String s = "查询-" + new java.sql.Date(System.currentTimeMillis()).toString().replaceAll("-","") + ".xls";
String filename = s + ".zip";
response.addHeader("Content-Disposition", "inline;filename=" + filename);
以上只是一种导出Excel大数据量的解决方案。请大家给予意见!谢谢!
sjpsega 写道
biguan 写道
tidus2005 写道
biguan 写道
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。呵呵。原创的。因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。采用基本的jdbc技术+io流。 1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.html。 2.用记事本打开网页a.html,就看到源代码。把源代码分成三部分:头+记录行+尾。 3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。 a.html的头代码+记录行代码(已经被5万条替换)+尾代码。
没有看太懂你的意思, 用html是干什么?
用java的io写txt格式的文件,大家都会吧? 其实,也可以用java的io写xls格式的文件的。关键是你得按一定的excel文件格式写,才能保证生成的是excel文件。 这个格式怎样得到呢?方法是这样: 你先建一个excel文件,如a.xls。填上两条伪数据。然后另存为网页,即htm格式,如a.htm。 然后,用记事本打开htm格式的a.htm,这样excel文件格式代码就暴露在你面前。 剩下的事,呵呵,就是把a.htm源代码的伪数据部分,替成数据库里的数据,然后把替换后的整个a.htm源代码,用java的io写成一个后缀为xls的文件。就打完收工了。 注意:为了不给内存增加压力,要把a.htm源代码分成三部分:头(伪数据部分 前的代码) + 伪数据部分 + 尾(伪数据部分 后的代码)。 先把 头 写到文件,并flush。然后是 伪数据部分 ,替一条数据库里的记录就写到文件里,并flush。最后把 尾 写到文件,并flush。
呵呵,你的方法很好啊,其实我本来也想到直接用io生成XLS文件的,不会我是直接用记事本打开的,结果看到乱码 - - 还有写io你提到了重点,就是要经常flush,不然数据大就OOM了。 我的方法也主要就是拼字符串,还有就是从数据库读取的数据采用分页的形式,用list分次读取出来,结束采用list.clear()一下,及时把资源释放。
biguan 写道
tidus2005 写道
biguan 写道
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。
呵呵。原创的。
因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。
采用基本的jdbc技术+io流。
1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.html。
2.用记事本打开网页a.html,就看到源代码。把源代码分成三部分:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。
a.html的头代码+记录行代码(已经被5万条替换)+尾代码。
没有看太懂你的意思, 用html是干什么?
用java的io写txt格式的文件,大家都会吧?
其实,也可以用java的io写xls格式的文件的。关键是你得按一定的excel文件格式写,才能保证生成的是excel文件。
这个格式怎样得到呢?方法是这样:
你先建一个excel文件,如a.xls。填上两条伪数据。然后另存为网页,即htm格式,如a.htm。
然后,用记事本打开htm格式的a.htm,这样excel文件格式代码就暴露在你面前。
剩下的事,呵呵,就是把a.htm源代码的伪数据部分,替成数据库里的数据,然后把替换后的整个a.htm源代码,用java的io写成一个后缀为xls的文件。就打完收工了。
注意:为了不给内存增加压力,要把a.htm源代码分成三部分:头(伪数据部分 前的代码) + 伪数据部分 + 尾(伪数据部分 后的代码)。
先把 头 写到文件,并flush。然后是 伪数据部分 ,替一条数据库里的记录就写到文件里,并flush。最后把 尾 写到文件,并flush。
呵呵,你的方法很好啊,其实我本来也想到直接用io生成XLS文件的,不会我是直接用记事本打开的,结果看到乱码 - -
还有写io你提到了重点,就是要经常flush,不然数据大就OOM了。
我的方法也主要就是拼字符串,还有就是从数据库读取的数据采用分页的形式,用list分次读取出来,结束采用list.clear()一下,及时把资源释放。
分享到:
相关推荐
见到导出大量数据 自己定义Excel表格样式 用html当时定义见到导出大量数据 自己定义Excel表格样式 用html当时定义见到导出大量数据 自己定义Excel表格样式 用html当时定义见到导出大量数据 自己定义Excel表格样式 用...
解决大批量数据导出Excel产生内存溢出的方案
java解决大批量数据导出Excel产生内存溢出的方案
POI百万级大数据量EXCEL导出 - 请叫我猿叔叔的博客 - CSDN博客.htm
轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着
以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是...
开发测试时候导入数据遇到大数据导入的问题,整理了下,需要的朋友可以参考下
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
主要为大家详细介绍了Java实现excel大数据量导入,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基于Apache poi框架的Java Excel数据导出方案实现
jxl实现excel大数据导出,26000条记录,测试导出时间是19s,例子不算复杂,没有excel样式的处理,可以自己扩展哈,有数据库文件,部署即可看到效果!!! 有三个功能:代码构建数据的导出、数据库数据的导出(从配置...
分享实现把大批量数据导出到Excel的各种方案
改资源包含 数据量超过20万以上导出解决方案,还有动态获取数据公共类 1) 把数据分成多个sheet导出。 2) 把数据分成多个excel 导出。 全部都有,还有实例。
·利用大量数据透视表的诀窍; ·在数秒钟内创建功能强大的汇总报表: ·方便地构建高级(ad-hOC)查询工具: ·增强执行报表的能力; ·筛选出前10位客户或者产品的报表: ·将动态图表添加到报表中; ...
决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助...
·利用大量数据透视表的诀窍; ·在数秒钟内创建功能强大的汇总报表: ·方便地构建高级(ad-hOC)查询工具: ·增强执行报表的能力; ·筛选出前10位客户或者产品的报表: ·将动态图表添加到报表中; ...
对于写入较低版本的Excel2003,POI使用了用户模式来处理,就是将整个文档加载进内存,如果数据量大的话就会出现内存溢出的问题,Excel2003Writer就是使用这种方式。据笔者的测试,如果数据量大于3万条,每条8列的话...
·利用大量数据透视表的诀窍; ·在数秒钟内创建功能强大的汇总报表: ·方便地构建高级(ad-hOC)查询工具: ·增强执行报表的能力; ·筛选出前10位客户或者产品的报表: ·将动态图表添加到报表中; ...
生产、研发业务上往往使用大量word和excel文档来作为资料载体,如操作规程、控制手册、卡片……,这些文档会反复使用到一些设备、工艺等参数数据。参数属性主要是名称、编码、正常范围、报警上下限、单位等,这些...
·利用大量数据透视表的诀窍; ·在数秒钟内创建功能强大的汇总报表: ·方便地构建高级(ad-hOC)查询工具: ·增强执行报表的能力; ·筛选出前10位客户或者产品的报表: ·将动态图表添加到报表中; ...