时 间 记 忆
<<  < 2018 - >  >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

最 新 评 论

最 新 日 志

最 新 留 言

搜 索

用 户 登 录

我 的 相 册

我 的 圈 子

我 的 好 友

友 情 连 接


 
 
 
poi导出excel大量数据内存溢出
[ 2018-5-22 14:12:00 | By: 我家超超会发光 ]
 

poi导出excel,不使用模板的

http://happyqing.iteye.com/blog/2075985

 

xls格式导出使用HSSFWorkbook,(这个暂时没有好办法)

 

xlsx格式导出以前使用***FWorkbook,可以使用新的S***FWorkbook(poi3.8+)

 

Workbook wb = new S***FWorkbook(1000); //大于1000行时会把之前的行写入硬盘

 

Row,Cell还跟之前的一样

官方样例

http://poi.apache.org/spreadsheet/how-to.html#s***f

Java代码  收藏代码
  1. import junit.work.Assert;  
  2. import org.apache.poi.ss.usermodel.Cell;  
  3. import org.apache.poi.ss.usermodel.Row;  
  4. import org.apache.poi.ss.usermodel.Sheet;  
  5. import org.apache.poi.ss.usermodel.Workbook;  
  6. import org.apache.poi.ss.util.CellReference;  
  7. import org.apache.poi.***f.streaming.S***FWorkbook;  
  8.   
  9.     public static void main(String[] args) throws Throwable {  
  10.         S***FWorkbook wb = new S***FWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk  
  11.         Sheet sh = wb.createSheet();  
  12.         for(int rownum = 0; rownum < 1000; rownum++){  
  13.             Row row = sh.createRow(rownum);  
  14.             for(int cellnum = 0; cellnum < 10; cellnum++){  
  15.                 Cell cell = row.createCell(cellnum);  
  16.                 String address = new CellReference(cell).formatAsString();  
  17.                 cell.setCellValue(address);  
  18.             }  
  19.   
  20.         }  
  21.   
  22.         // Rows with rownum < 900 are flushed and not accessible  
  23.         for(int rownum = 0; rownum < 900; rownum++){  
  24.           Assert.assertNull(sh.getRow(rownum));  
  25.         }  
  26.   
  27.         // ther last 100 rows are still in memory  
  28.         for(int rownum = 900; rownum < 1000; rownum++){  
  29.             Assert.assertNotNull(sh.getRow(rownum));  
  30.         }  
  31.           
  32.         FileOutputStream out = new FileOutputStream("/temp/s***f.xlsx");  
  33.         wb.write(out);  
  34.         out.close();  
  35.   
  36.         // dispose of temporary files backing this workbook on disk         wb.dispose(); 
  37.  }  

 

 值得注意的是S***FWorkbook只能写不能读。但是往往我们需要向一个Excel模版里导出数据,这样才更好提前定义里面的格式和vba代码。

这里就需要使用S***FWorkbook的另外一个构造函数:

S***FWorkbook(***FWorkbook workbook)
Construct a workbook from a template.

 通过***FWorkbook来读取模版,然后用S***FWorkbook来设置样式和写数据,详细使用就参API吧。 http://poi.apache.org/apidocs/org/apache/poi/***f/streaming/S***FWorkbook.html

 
 
  • 标签:poi 导出 excel 内存溢出 
  • 发表评论:
     
    浙江博客 浙江博客
    浙江博客欢迎您!