日期:2014-05-20  浏览次数:20916 次

java poi 导出Excel并追加数据
我的思路是这样子的,假如10000条数据,我要导到Excel表格中,而每次我只导1000条,需要导10次
每导一次我都把写入流关了,得到新的流导第二次。第三次。。。。。直到导完,我只看到第一次导的数据,其它几次的数据都看不到,这是为什么?
代码如下
Java code

         //工作薄的代码已创建,以下是核心代码
         for(int i=1; i<=10; i++){
             output = new FileOutputStream("d:/1.xls");
             //如果是第一次,我创建sheet对像
             if(i == 1){
                 sheet = workBook.createSheet();
                 //这段的作用是创建Excel的表头,详细代码就不贴出来了
                 this.printTableContext(sheet);
                 workBook.setSheetName(0,"sheet1");
             }
             //这是查询结果,每次1000条,假如 
             list = new Query().queryList(sql);
             //写内容   
             this.printContext(1000*(i-1),sheet,list);
 
             workBook.write(output);
             output.flush();
             output.close();
         }



这段是核心代码,我只是第一次创建了我的sheet对像,这个对像一直存在,第二次的时候就直接用这个对像,可是第二次写的时候,数据显示不出来,求高手指导啊。

------解决方案--------------------
output = new FileOutputStream("d:/1.xls");
 for(int i=1; i<=10; i++){
//如果是第一次,我创建sheet对像
if(i == 1){
sheet = workBook.createSheet();
//这段的作用是创建Excel的表头,详细代码就不贴出来了
this.printTableContext(sheet);
workBook.setSheetName(0,"sheet1");
}
//这是查询结果,每次1000条,假如 
list = new Query().queryList(sql);
//写内容
this.printContext(1000*(i-1),sheet,list);
 
workBook.write(output);
output.flush();
}
output.close();




------解决方案--------------------
或者
for(int i=1; i<=10; i++){
output = new FileOutputStream("d:/1.xls",true);
//如果是第一次,我创建sheet对像
if(i == 1){
sheet = workBook.createSheet();
//这段的作用是创建Excel的表头,详细代码就不贴出来了
this.printTableContext(sheet);
workBook.setSheetName(0,"sheet1");
}
//这是查询结果,每次1000条,假如 
list = new Query().queryList(sql);
//写内容
this.printContext(1000*(i-1),sheet,list);
 
workBook.write(output);
output.flush();
output.close();
}




------解决方案--------------------
百度后2种方法试试

1.是用最新版的poi ,这个问题已经解决了,利用缓存的cell,不创建更多的对象实例,导致heap 回收不了。SXSSFWorkbook关键是这个类的使用 

Java代码
FileOutputStream out = new FileOutputStream(new File("D://result.xlsx"));
  
Workbook writeWB = new SXSSFWorkbook(500);
Sheet writeSheet = writeWB.createSheet();
  
for (int rr = 0; rr < 400000; rr++) {
Row writeRow = writeSheet.createRow(rr);
for (int cc = 0; cc < 10; cc++) {
writeRow.createCell(cc).setCellValue("测试" + rr + "," + cc);
}
}
writeWB.write(out);

2.http://cats-tiger.iteye.com/blog/240053
------解决方案--------------------
一种可能是代码的问题
另外可能workBook.write(output),只让写入一次。需要分析源码
------解决方案--------------------
探讨
以我实际的经验,POI导入EXCEL,3万条左右一次性没出现过问题。