大数据量导出到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的行数限制,在导入文件的时候对大数据量导入进行分页处理。
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的行数限制,在导入文件的时候对大数据量导入进行分页处理。
相关文章推荐
- 大数据量导出到Excel时需要注意的问题
- php导出excel 大数据 时候需要注意的问题
- gridview 导出Excel时注意的问题
- 把数据导出Excel 出现异常:HRESULT:0x800A03EC 需要注意数据中的"="号
- 解决excel大数据量导出问题
- DataTable数据导入到Excel 引用Microsoft Office 12.0 Object Library和 Microsoft Excel 14.0 Object Library 并且需要注意的问题
- Table导出到Excel时注意问题
- Java利用poi读写Excel需要注意的问题
- 把Excel中的数据导出成txt文件的注意问题
- Java利用poi读写Excel需要注意的问题
- 导出excel功能(解决大数据量问题)
- NPOI导出Excel2007-xlsx格式文件,用于web时需要注意的问题-XSSFWorkbook处理问题
- NPOI导出Excel2007-xlsx格式文件,用于web时需要注意的问题-XSSFWorkbook处理问题
- GridView导出Excel需要注意的地方
- Java大数据量导出Excel的问题
- 关于定义类成员导出函数需要注意的一些问题
- 使用aspose.cell导出excel需要注意什么?
- 关于poi导出大数据量EXCEL导出缓慢的解决方案--生成xml格式的表格文件(注意xls格式为03 07下格式会不一样)
- 按照一定的规格形式导出需要的数据(导出功能实现和一些需要注意的问题)
- NPOI导出Excel2007-xlsx格式文件,用于web时需要注意的问题-XSSFWorkbook处理问题