乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > <em>JAVA</em>使用POI怎样导出百万级别数据-java excel 导出大数据,ja

<em>JAVA</em>使用POI怎样导出百万级别数据-java excel 导出大数据,ja

作者:乔山办公网日期:

返回目录:excel表格制作


Workbook workbook = new SXSSFWorkbook(1000);
poi有个机制 每次往内存中写1000条数据,这个1000你可以改的 尽量别大于10000条数据,写完1000条数据后再重新写,这样就不会内存溢出了。

一。检查SQL查询出来的值是否和导出的值一样。 二。如果一样,确定问题是sql,如果不一样,暂时认为不可能会有这种情况
用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,
这时候调整JVM的配置参数
也不是一个好对策(注:
jdk在32位系统中支持的内存不能超过2个G,而在64位中没有限制,但是在64位的系统中,性能并不是太好
),好在POI3.8版本新出来了一个SXSSFWorkbook对象,它就是用来解决大数据量以及超大数据量的导入导出操作的,但是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式的Excel文件。
这里普及一下,在POI中使用HSSF对象时,excel 2003最多只允许存6553数据,一般用来处理较少的数据量,这时对于百万级别数据,Excel肯定
容纳不了,而且在计算机性能稍低的机器上测试,就很容易导致堆溢出。当我升e799bee5baa6e997aee7ad94e78988e69d83336级到XSSF对象时,它可以直接支持excel2007以上版本,因为它采用
ooxml格式。这时excel可以支持1048576条数据,单个sheet表就支持近104
万条数据了,虽然这时导出100万数据能满足要求,但使用XSSF测试后发现偶尔还是会发生堆溢出,所以也不适合百万数据的导出。现在我们知道excel2007及以上版本可以轻松实现存储百万级别的数据,但是系统中的大量数据是如何能够快速准确的导入到excel中这好像是个难题,对于一般的web系统,我们为了解决成本,基本都是使用的入门级web服务器tomcat,既然我们不推荐调整JVM的大小,那我们就要针对我们的代码来解决我们要解决的问题。在POI3.8之后新增加了一个类,
SXSSFWorkbook
,采用当数据加工时不是类似前面版本的对象,它可以控制excel数据占用的内存,他通过控制在内存中的行数来实现资源管理,即当创建对象超过了设定的行数,它会自动刷新内存,将数据写入文件,
这样导致打印时,占用的CPU,和内存很少。但有人会说了,我用过这个类啊,他好像并不能完全解决,当数据量超过一定量后还是会内存溢出的,而且时间还很长。对你只是用了这个类,但是你并没有针对你的需求进行相应的设计,仅仅是用了,所以接下来我要说的问题就是,如何通过SXSSFWorkbook以及相应的写入设计来实现百万级别的数据快速写入。
我先举个例子,以前我们[数据库
中存在大量的数据,我们要查询,怎么办?我们在没有经过设计的时候是这样来处理的,先写一个集合,然后执行jdbc,将返回的结果赋值给list,然后再返回到页面上,但是当数据量大的时候,就会出现数据无法返回,内存溢出的情况,于是我们在有限的时间和空间下,通过分页将数据一页一页的显示出来,这样可以避免了[大数据
量数据对内存的占用,也提高了用户的体验,在我们要导出的百万数据也是一个道理,内存突发性占用,我们可以限制导出数据所占用的内存,
这里我先建立一个list容器,list中开辟10000行的存储空间,每次存储10000行,用完了将内容清空,然后重复利用
,这样就可以有效控制内存,所以我们的设计思路就基本形成了,所以分页数据导出共有以下3个步骤:
1、求数据库中待导出数据的行数
2、根据行数求数据提取次数
3、按次数将数据写入文件

我给你个办法,是要导出excel吗?别使用poi,使用xml来描述excel即可,就像流文件一样,多少都不会流出,给你个思路,你自己扩展,希望你能看明白。

/**
* @author J.W
* 2011-06-08
*/
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
public static void main(String[] args) {
e79fa5e98193e59b9ee7ad94330StringBuffer sb = new StringBuffer();
try {
DataOutputStream rafs = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(new File(
"d://test.xml"))));
sb.append("<?xml version=\"1.0\"?>");
sb.append("\n");
sb.append("<?mso-application progid=\"Excel.Sheet\"?>");
sb.append("\n");
sb.append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sb.append("\n");
sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
sb.append("\n");
sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
sb.append("\n");
sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sb.append("\n");
sb.append(" xmlns:html=\"http:///TR/REC-html40\">");
sb.append("\n");
sb.append(" <Styles>\n");
sb.append(" <Style ss:ID=\"Default\" ss:Name=\"Normal\">\n");
sb.append(" <Alignment ss:Vertical=\"Center\"/>\n");
sb.append(" <Borders/>\n");
sb.append(" <Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"12\"/>\n");
sb.append(" <Interior/>\n");
sb.append(" <NumberFormat/>\n");
sb.append(" <Protection/>\n");
sb.append(" </Style>\n");
sb.append(" </Styles>\n");
int sheetcount = 0;
int recordcount = 20;
int currentRecord = 0;
int total = 100;
int col = 20;
sb.append("<Worksheet ss:Name=\"Sheet0\">");
sb.append("\n");
sb.append("<Table ss:ExpandedColumnCount=\"" + col
+ "\" ss:ExpandedRowCount=\"" + total
+ "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
sb.append("\n");
for (int i = 0; i < total; i++) {
if ((currentRecord == recordcount
|| currentRecord > recordcount || currentRecord == 0)
&& i != 0) {// 一个sheet写满
currentRecord = 0;
rafs.write(sb.toString().getBytes());
sb.setLength(0);
sb.append("</Table>");
sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
sb.append("\n");
sb.append("<ProtectObjects>False</ProtectObjects>");
sb.append("\n");
sb.append("<ProtectScenarios>False</ProtectScenarios>");
sb.append("\n");
sb.append("</WorksheetOptions>");
sb.append("\n");
sb.append("</Worksheet>");
sb.append("<Worksheet ss:Name=\"Sheet" + i / recordcount
+ "\">");
sb.append("\n");
sb.append("<Table ss:ExpandedColumnCount=\"" + col
+ "\" ss:ExpandedRowCount=\"" + recordcount
+ "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
sb.append("\n");
}
sb.append("<Row>");
for (int j = 0; j < col; j++) {
System.out.println(i);
sb.append("<Cell><Data ss:Type=\"String\">10000000000000000123</Data></Cell>");
sb.append("\n");
}
sb.append("</Row>");
if (i % 5000 == 0) {
rafs.write(sb.toString().getBytes());
rafs.flush();
sb.setLength(0);
}
sb.append("\n");
currentRecord++;
}
rafs.write(sb.toString().getBytes());
sb.setLength(0);
sb.append("</Table>");
sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
sb.append("\n");
sb.append("<ProtectObjects>False</ProtectObjects>");
sb.append("\n");
sb.append("<ProtectScenarios>False</ProtectScenarios>");
sb.append("\n");
sb.append("</WorksheetOptions>");
sb.append("\n");
sb.append("</Worksheet>");
sb.append("</Workbook>");
sb.append("\n");
rafs.write(sb.toString().getBytes());
rafs.flush();
rafs.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

可以直接执行,只是给你个思路。

相关阅读

关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网