导航:首页 > 网络数据 > poi写入大数据效率

poi写入大数据效率

发布时间:2023-11-02 20:35:59

java怎么在数据超过百万后分页导出

用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,
这时候调整JVM的配置参数
也不是一个好对策(注:
jdk在32位系统中支持的内存不能超过2个G,而在64位中没有限制,但是在64位的系统中,性能并不是太好
),好在POI3.8版本新出来了一个SXSSFWorkbook对象,它就是用来解决大数据量以及超大数据量的导入导出操作的,但是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式的Excel文件
这里普及一下,在POI中使用HSSF对象时,excel 2003最多只允许存6553数据,一般用来处理较少的数据量,这时对于百万级别数据,Excel肯定
容纳不了,而且在计算机性能稍低的机器上测试,就很容易导致堆溢出。当我升级到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、按次数将数据写入文件

② 关于Poi 大数据量Excel 导出时 文件过大的问题 怎么解决

建议不要导出excel,当前excel中已经有支持cvs文件。
解释:cvs文件的显示方式和版xls的显示方式一样,并权且此显示方式的执行效率要高于xls文件的额,因为cvs文件存储的是数据直接直接用英文逗号分隔,xls是存储的cell。所以在大量数据的情况下,都是导出为cvs文件。
备注:如果数据过多的话,建议可以分多次查询导出,不要一次性导出,否则效率会很低。
-

③ java excel poi 大数据量50W 内存溢出

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

④ poi导出excel数据多导出慢

你是不是每写一条数据都是要新建一个OutputStream 如果是这样的话你就先把数据读入到内存里 然后再在一个OutputStream里写入到文件中 当前这样做的前提是你的内存要够用
如果你的内存不够放6000条数据的话 可以先读一部分数据到内存 然后在一个OutputStream中把数据写入到文件中 然后再读 再写 这样就会快了

⑤ 求教怎么用读取流操作Excel文件,不借助jxl,poi等外部库,数据量比较大,在20万以上,保证内存不溢出。。

POI为apache公司的一个子项目,主要是提供一组操作windows文档的Java API.
Java Excel俗称是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。

就这两者的区别,主要谈下JVM虚拟机内存消耗的情况.
数据量3000条数据,每条60列.JVM虚拟机内存大小64M.
使用POI:运行到2800条左右就报内存溢出.
使用JXL:3000条全部出来,并且内存还有21M的空间.
可想而知,在对内存的消耗方面差距还是挺大的.
也许是由于JXL在对资源回收利用方面做的还挺不错的.
关于两者效率方面,没有研究过,我想这个也是基于大数据量而言的,数据量小的话基本上差别不大,也不难被发觉.但是大的数据量,POI消耗的JVM内存远比JXL消耗的多.但相比提供的功能的话,JXL又相对弱了点.所以如果要实现的功能比较复杂的情况下可以考虑使用POI,但如果只想生成一些大数据量可以考虑使用JXL,或者CSV也是一个不错的选择,不过CSV并不是真正的excel.

⑥ 如何用java代码生成一个大数据的excel文件

POI包解析 或者 只是xls的话 用 jxl 也行 poi 全支持 xls 和xlsx
然后写入 保存 ok

HSSFSheet sheet= null;
(int sherrt= 0; sherrt <wr.getNumberOfSheets();sherrt++){
sheet = wr.getSheetAt(sherrt); // 获得sheet工作簿HSSFSheet
for(int i = 0 ; i<=sheet.getLastRowNum(); i++){
HSSFRow row = sheet.getRow(i);//获得行数
Iterator o = row.iterator(); //得到每行的值
int j= 0 ;
while(o.hasNext()){
if(!key){
kk = o.next().toString();
if(StrC.getSimilarityRatio(kk, Vle[j])>0.7){j++;}
}else{
GetVAR[j] = o.next().toString();
j++;
}
}
这个是得到 也可以写入

⑦ java利用poi读大数据量xlsx除了用xml方式读取外,还有其他方法吗

poi是把excel当做【文来档】来处理源的,自然只有XSSFWorkbook类来操作它,也就是你说的xml方式。在poi的眼里,excel文档里的并不是【数据】而是【表格】。
你如果想要把excel当做【数据源】来处理,应该用odbc的方式,将你需要的excel文件变成一个odbc数据源,然后用ResultSet set = smt.executeQuery("select * from [sheet1$]");来读取数据,效率跟access表现相当(毕竟excel有数据量上限,实际表现大多数时候都比access还要快)

⑧ java poi Excel大数据量导入怎么提高速度

记得有个属性,

POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表内格且堆空间有容限时使用。SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入会引起老一行的数据刷新到硬盘。
比如内存中限制行数为100,当行号到达101时,行号为0的记录刷新到硬盘并从内存中删除,当行号到达102时,行号为1的记录刷新到硬盘,并从内存中删除,以此类推。
rowAccessWindowSize代表指定的内存中缓存记录数,默认为100,此值可以通过
new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(int windowSize)来设置。

⑨ 如何提高poi读写excel文件(同一文件)的效率

我的代码
//导入普通客户信息

publicStringimportExcle(){

TEmployeeemployee=(TEmployee)request.getSession().getAttribute(

"employee");

TCustomerInfoc=newTCustomerInfo();

//声明数据流

InputStreamis=null;

if(employee!=null){

inthang=0;

intlie=0;

if(excel!=null){

try{

//解析excel2007版本文件

is=newFileInputStream(excel);

XSSFWorkbookwork=newXSSFWorkbook(is);

XSSFSheetsheet=work.getSheetAt(0);

introws=sheet.getPhysicalNumberOfRows();

//循环表的行,从第二行开始


for(inti=1;i<rows;i++){

hang=i+1;

c=newTCustomerInfo();

XSSFRowrow=sheet.getRow(i);

if(row==null){//判断是否为空

continue;

}

//读取该行的每一列

for(intj=0;j<row.getPhysicalNumberOfCells();j++){

XSSFCellcell=row.getCell(j);

if(cell==null){

continue;

}

if(cell.toString()==null

||"".equals(cell.toString())){

continue;

}

Stringv=Util.getXssfCellValue(cell);

switch(j){//通过列数来判断对应插如的字段

case0:

c.setCompanyName(v);

break;

case1:

c.setLinkName(v);

break;

case2:

c.setTell(v);

break;

case3:

c.setTelephone(v);

break;

case4:

c.setPosition(v);

break;

case5:

c.setEmail(v);

break;

case6:

c.setCompanyType(v);

break;

case7:

c.setCustomerType(v);

break;

case8:

c.setCompanyDetail(v);

break;

}

c.setCreateMan(employee.getName());

c.setCreateDate(newDate());


}

customerInfoBiz.addCustomer(c);

}

request.setAttribute("message","导入成功(=^_^=)");


}catch(Exceptione){

System.out.println("进入---解析excel2003版本文件--错误抛出");

try{

//解析excel2003版本文件


is=newFileInputStream(excel);

HSSFWorkbookwork=newHSSFWorkbook(is);

HSSFSheetsheet=work.getSheetAt(0);

if(sheet!=null){

introws=sheet.getPhysicalNumberOfRows();

//循环表的行,从第二行开始

for(inti=1;i<rows;i++){

hang=i+1;

c=newTCustomerInfo();

HSSFRowrow=sheet.getRow(i);

if(row==null){//判断是否为空

continue;

}

//循环表格的列

for(shortj=0;j<row

.getPhysicalNumberOfCells();j++){

HSSFCellcell=row.getCell(j);

if(cell==null){

continue;

}

if(cell.toString()==null||"".equals(cell.toString())){

continue;

}

Stringv=Util.getHssfCellValue(cell);

switch(j){//通过列数来判断对应插如的字段

case0:


c.setCompanyName(v);

break;

case1:


c.setLinkName(v);

break;

case2:


c.setTell(v);

break;

case3:


c.setTelephone(v);

break;

case4:


c.setPosition(v);

break;

case5:


c.setEmail(v);

break;

case6:


c.setCompanyType(v);

break;

case7:


c.setCustomerType(v);

break;

case8:


c.setCompanyDetail(v);

break;

}

c.setCreateMan(v);

c.setCreateDate(newDate());

}

customerInfoBiz.addCustomer(c);

}

request.setAttribute("message","导入成功(=^_^=)");

}

}catch(Exceptione1){

request.setAttribute("message","第"+hang+"行,第"

+lie+"列开始导入失败,请注意导入格式!!");

e1.printStackTrace();

}

}

}

}else{

request.setAttribute("message","登录超时,请重新登录!!");

}

//查询时对象中含有值对查询有误

if(customer!=null){

customer=null;

}


returncustomerList();

}

⑩ EXCEL大数据量导出的解决方案

EXCEL大数据量导出的解决方案
将web页面上显示的报表导出到excel文件里是一种很常见的需求。润乾报表的类excel模型,支持excel文件数据无失真的导入导出,使用起来非常的方便。然而,当数据量较大的情况下,excel本身的支持最多65535行数据的问题便凸显出来。下面就给出大数据量导出到excel的解决方案。
首先,对于数据超过了65535行的问题,很自然的就会想到将整个数据分块,利用excel的多sheet页的功能,将超出65535行后的数据写入到下一个sheet页中,即通过多sheet页的方式,突破了最高65535行数据的限定。
具体做法就是:
单独做一个链接,使用JSP导出,在JSP上通过程序判断报表行数,超过65535行后分SHEET写入。这样这个问题就得以解决了。
更进一步地说,在这种大数据量的报表生成和导出中,要占用大量的内存,尤其是在使用TOMCAT的情况下,JVM最高只能支持到2G内存,则会发生内存溢出的情况。此时的内存开销主要是两部分,一部分是该报表生成时的开销,另一部分是该报表生成后写入一个EXCEL时的开销。由于JVM的GC机制是不能强制回收的,因此,对于此种情形,我们给出一个变通的解决方案。
首先,将该报表设置起始行和结束行参数,在API生成报表的过程中,分步计算报表,比如一张20万行数据的报表,在生成过程中,可通过起始行和结束行分4-5次进行。这样,就降低了报表生成时的内存占用,在后面报表生成的过程中,如果发现内存不够,即可自动启动JVM的GC机制,回收前面报表的缓存。
导出EXCEL的过程,放在每段生成报表之后立即进行,改多个SHEET页为多个EXCEL,即在分步生成报表的同时分步生成EXCEL,则通过POI包生成EXCEL的内存消耗也得以降低。通过多次生成,同样可以在后面EXCEL生成所需要的内存不足时,有效回收前面生成EXCEL时占用的内存。
再使用文件操作,对每个客户端的导出请求在服务器端根据SESSIONID和登陆时间生成唯一的临时目录,用来放置所生成的多个EXCEL,然后调用系统控制台,打包多个EXCEL为RAR或者JAR方式,最终反馈给用户一个RAR包或者JAR包,响应客户请求后,再次调用控制台删除该临时目录。
使用这种方法,首先是通过分段运算和生成,有效降低了报表从生成结果到生成EXCEL的内存开销。其次是通过使用压缩包,响应给用户的生成文件体积大大缩小,降低了多用户并发访问时服务器下载文件的负担,有效减少多个用户导出下载时服务器端的流量,从而达到进一步减轻服务器负载的效果。

阅读全文

与poi写入大数据效率相关的资料

热点内容
word文件水印怎么取消 浏览:443
rhel6的镜像文件在哪里下载 浏览:571
成功正能量微信头像 浏览:848
wps表格如何恢复数据 浏览:264
linuxc静态库创建 浏览:838
u盘有微信文件但微信恢复不了 浏览:585
苹果的网站数据是什么 浏览:22
ps滚字教程 浏览:237
win7网络邻居如何保存ftp 浏览:186
安卓客户端代理服务器 浏览:572
编程用苹果 浏览:659
51虚拟机的文件管理在哪里 浏览:13
win10系统有没有便签 浏览:722
java引用传递和值传递 浏览:109
oracle下载安装教程 浏览:854
php筛选数据库 浏览:830
怎么用手机看wlan密码 浏览:745
奥维地图导入的文件在哪里 浏览:364
sdltrados2014教程 浏览:43
培训制度文件在哪里找 浏览:601

友情链接