xssfworkbook读取内存溢出?默认使用poi提供方法XssfWorkBook进行写入Excel。分页查询数据,每次查询完之后,写入到Excel。在写入数据10W+的时候,用时2分钟左右;但10W+之后,速度开始慢了下,导出20W数据大约需要30分钟左右;多次导出之后,那么,xssfworkbook读取内存溢出?一起来了解一下吧。
导致内存溢出是因为太多了内存不够用,你可以先腔念读一部分然后做个标记,先把读到的这部分数据写入到数据库里。然后再从标记处开始读一部分再写入,再读再写直到完。伍祥困不宴碰要一次性全部读完。
Workbook workbook = new SXSSFWorkbook(1000);
poi有个机制 每滚肆次往内存枣虚中写1000条数据,大岩轿这个1000你可以改的尽量别大于10000条数据,写完1000条数据后再重新写,这样就不会内存溢出了。
The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)
发现这个文件的念坦格式不是标准的excel文件(.xls或者.xlsx),
调用后报上面消宏异常
XSSFWorkbook 读取文件转化成HXSSFWorkbook就可以读取文件
上面的依赖解析表格自己定义解析 比较灵活,但仔桥桐是自己写的内容太多
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();
}
三万行的excel文件 算比橡宽较大的呢。
注意代码优化,尽量避免减少对象重复创建这些,看你的描述是生成梁漏亮成功后内存没有下降
可能是虚拟机在进行垃圾回收处理...
poi有提供大数据Excel生成,,目前还在研究中,可以一起讨搜塌论
以上就是xssfworkbook读取内存溢出的全部内容,关于内存溢出,注意以下几点:1,分页分批从数据库里查询数据。2,注意变量的释放,特别是LIST和MAP之类的引用,如果定义成全局变量或静态变量就会很难释放。3,调大虚拟机内存大小。