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

阅读更多

最近做性能测试时,导出报表报错“Caused by: jxl.write.biff.RowsExceededException: The maximum number of rows permitted on a worksheet been exceeded” 要注意: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 maxRowCount) { sheet=workbook.getSheet(++currentSheetId); index=0; } 一个Excel页的最大行数为65536。程序中需要加入对Excel最大容量的限制,可对每个sheet设定的显示的最大数量,当达到设定的数量时,便更换Excel的sheel写入(即使对Excel进行分页) 4、经验总结:预防措施和规范建议 该问题的出现暴露出值得关注的几点: (1)将大量数据加载到内存中,会使虚拟内存不足,导致程序无法运行,可以通过增加 虚拟内存来解决此问题,但不推荐此方式,建议将大量数据的操作划分成小量数据 进行操作 (2) 需要注意Excel的行数限制,在导入文件的时候对大数据量导入进行分页处理 参考:http://blog.csdn.net/sea_wave2011/article/details/8282195

你可能感兴趣的:(java,excel,JVM)