POI导出数据内存溢出问题

摘要:
以前版本的POI不支持大数据量处理。如果数据太多,通常会报告OOM错误。有时调整JVM大小的效果不是很好。但通常我们需要将数据导出到Excel模板,以便我们可以提前更好地定义格式和vba代码。

POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。

3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。
HSSFWorkbook的使用方法和之前的版本的使用方法一致,这里就不在陈述使用方法了
SXSSFWorkbook的使用例子如下:
import junit.framework.Assert;
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.ss.usermodel.Sheet;  
import org.apache.poi.ss.usermodel.Workbook;  
import org.apache.poi.ss.util.CellReference;  
import org.apache.poi.xssf.streaming.SXSSFWorkbook;  
public static void main(String[] args) throws Throwable {  
 Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk  
 Sheet sh = wb.createSheet();  
 for(int rownum = 0; rownum < 100000; rownum++){ 
 Row row = sh.createRow(rownum);  
 for(int cellnum = 0; cellnum < 10; cellnum++){  
 Cell cell = row.createCell(cellnum);  
 String address = new CellReference(cell).formatAsString();  
 cell.setCellValue(address); }  
 } 
FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");  
 wb.write(out);  
 out.close(); 
}
 
以上是转载的
 
值得注意的是SXSSFWorkbook只能写不能读。但是往往我们需要向一个Excel模版里导出数据,这样才更好提前定义里面的格式和vba代码。
这里就需要使用SXSSFWorkbook的另外一个构造函数:
SXSSFWorkbook(XSSFWorkbook workbook)
Construct a workbook from a template.
 
通过XSSFWorkbook来读取模版,然后用SXSSFWorkbook来设置样式和写数据,详细使用就参考API吧。
 
http://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html

免责声明:文章转载自《POI导出数据内存溢出问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql有多大内存?能存多少数据?oracle 错误 TNS-01190与oracle 登入没反应操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Apache Tomcat 版本说明

一、Tomcat介绍 参考官方文档:https://tomcat.apache.org/whichversion.html 注意:因为版本信息有失效性,本文记录时间为2021年1月20号,本文只是对官方说明的翻译以及添加自己的理解,请以官方文档为准。 Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,其为开源的、免...

使用POI创建word表格合并单元格兼容wps

poi创建word表格合并单元格代码如下: /** * @Description: 跨列合并 */ public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) { for (int cellIndex = fromCell; cell...

Linux下查看Tomcat的版本信息

一、为什么要查看Tomcat 的版本信息 根据客户或者开发者的需求 网站迁移或者环境复制 漏洞查看或者渗透测试 二、如何查看Tomcat版本信息 1、使用 curl 命令手机网页信息,过滤出“Apache Tomcat”即可 [root@web ~]# curl 192.168.1.100:9000|grep "Apache Tomcat" %...

java调用ip138实现ip地址查询

HttpClient不是一个浏览器,而是一个客户端HTTP传输类库。HttpClient作用是传输和接收HTTP消息。在HttpClient模块中用到了两个重要的类:HttpGet和HttpPost。这两个类分别用来提交HTTPGET和HTTPPOST请求。 接下来我们将使用以上的理论作为基础,然后进行一次连接http://www.ip138.com/ip...

maven和gradle的全局阿里云镜像代理

Maven:~/.m2/settings.xml <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-...

LeftoverDataException,依赖包,apache license 2.0

1. poi3.9 LeftoverDataException org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException: Initialisation of record 0x1D left 1 bytes remaining still to be read. at o...