`
jbgtwang
  • 浏览: 21505 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

POI 内存溢出解决方案

阅读更多

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


转自:http://blog.csdn.net/sd2131512/article/details/7757178
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics