您的位置:首页 > 大数据

大数据量导出到Excel时需要注意的问题

2012-12-11 14:04 323 查看
大数据量导出到Excel时需要注意的问题

1、现象:问题描述

我们发现当统计的数量超大时候,在统计总量明细时,导出到Excel表格的时候就会抛出如下表格的异常

(1)内存溢出异常

javax.servlet.ServletException: Servlet execution threw an exception

com.huawei.insa2.filter.EncodingFilter.doFilter(EncodingFilter.java:67)

java.lang.OutOfMemoryError

(2)超过边界值

jxl.write.biff.RowsExceededException: The maximum number of rows permitted on

a

worksheet been exceeded at

jxl.write.biff.WritableSheetImpl.getRowRecord(WritableSheetImpl.java:

779)

2、关键过程:根本原因分析

(1) 内存溢出问题,是因为一次性将大量数据载入到内存中,导致虚拟内存不足

(2) 对边界值问题,对该现象进行分析。

private void exportSMDownData(HttpServletRequest request,

HttpServletResponse response) throws IOException

{

response.setContentType("application/vnd.ms-excel");

try

{

jxl.write.WritableWorkbook workbook =

jxl.Workbook.createWorkbook(response.getOutputStream());

jxl.write.WritableSheet sheet = workbook.createSheet("发送短

信统计", 0);

…………………………..

sheet.addCell(new jxl.write.Label(0, 0, "开始时间:"));

sheet.addCell(new jxl.write.Label(1, 0, s1));

}

看下日志抛异常的地方,在向Excel表格写数据时,超过了Excel表格所允许的最大容量,导致异常发生

3、结论:解决方案及效果

(1) 对第一个问题:可以在系统的环境变量中加入虚拟内存即可。

(2) 对第二个问题

Int maxRowCount = 60000;//不能够超过Excel的最大容量

for(int i=0;i<mqb.getRowCount()/maxRowCount;i++)

{

workbook.copySheet(0,"发送短信统计"+i+1,i+1);

}

。。。。。。。。。。。

if(index> maxRowCount)

{

sheet=workbook.getSheet(++currentSheetId);

index=0;

}

一个Excel页的最大行数为65536。程序中需要加入对Excel最大容量的限制,可对每个sheet设定的显示的最大数量,当达到设定的数量时,便更换Excel的sheel写入(即使对Excel进行分页)

4、经验总结:预防措施和规范建议

该问题的出现暴露出值得关注的几点:

(1)将大量数据加载到内存中,会使虚拟内存不足,导致程序无法运行,可以通过增加

虚拟内存来解决此问题,但不推荐此方式,建议将大量数据的操作划分成小量数据

进行操作

(2) 需要注意Excel的行数限制,在导入文件的时候对大数据量导入进行分页处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: