java poi 导出Excel并追加数据

xiaojun0124 2012-06-07 11:26:53
我的思路是这样子的,假如10000条数据,我要导到Excel表格中,而每次我只导1000条,需要导10次
每导一次我都把写入流关了,得到新的流导第二次。第三次。。。。。直到导完,我只看到第一次导的数据,其它几次的数据都看不到,这是为什么?
代码如下

//工作薄的代码已创建,以下是核心代码
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对像,这个对像一直存在,第二次的时候就直接用这个对像,可是第二次写的时候,数据显示不出来,求高手指导啊。
...全文
1207 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojun0124 2013-08-22
  • 打赏
  • 举报
回复
引用 12 楼 xiaojun0124 的回复:
改另一种方式解决了,谢谢各位
只需要修改一个地方,就可以追加了。 output = new FileOutputStream("d:/1.xls",true); 修改为 output = new FileOutputStream("d:/1.xls");
mmm_444 2012-11-28
  • 打赏
  • 举报
回复
我也遇到这个问题 学习一下
yujie1985 2012-11-28
  • 打赏
  • 举报
回复
你好,我也遇到了同样的问题,请问是怎么解决的呢?谢谢
xml300 2012-11-19
  • 打赏
  • 举报
回复
引用 12 楼 xiaojun0124 的回复:
改另一种方式解决了,谢谢各位
请问 怎么解决的呀,能否告之?
xiaojun0124 2012-09-13
  • 打赏
  • 举报
回复
改另一种方式解决了,谢谢各位
xiangjie123 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
以我实际的经验,POI导入EXCEL,3万条左右一次性没出现过问题。
[/Quote]
这个不能看条数的,看你导出的数据要求,100列和20列,支持的条数大不相同的。。。
  • 打赏
  • 举报
回复
以我实际的经验,POI导入EXCEL,3万条左右一次性没出现过问题。
古布 2012-06-12
  • 打赏
  • 举报
回复
一种可能是代码的问题
另外可能workBook.write(output),只让写入一次。需要分析源码
xiaojun0124 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

或者
for(int i=1; i<=10; i++){
output = new FileOutputStream("d:/1.xls",true);
//如果是第一次,我创建sheet对像
if(i == 1){
sheet = workBook.createSheet(……
[/Quote]

output = new FileOutputStream("d:/1.xls",true);
用这个测试过,追加的形式读写excel,第一次能成功写入,但是第二次第三次就无法显示出数据出来了,这是为什么呢?
xiaojun0124 2012-06-11
  • 打赏
  • 举报
回复
http://cats-tiger.iteye.com/blog/240053 这种方法已经测试过,他的道理也是一样的,也会存在内存溢出。
用最新版本poi-3.8的导出2007格式的可以导出,但是客户要求只导出2003的,这是比较纠结的问题。。
古布 2012-06-08
  • 打赏
  • 举报
回复
百度后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
古布 2012-06-07
  • 打赏
  • 举报
回复
或者
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();
}



古布 2012-06-07
  • 打赏
  • 举报
回复
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();



安特矮油 2012-06-07
  • 打赏
  • 举报
回复
你的workBook是如何创建的呢?
xiaojun0124 2012-06-07
  • 打赏
  • 举报
回复
谢谢您的回复
以上这两种方法我都试过,结果都是一样,只能看到第一次循环的结果。接下来的几次都看不到,有更好的办法吗?

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧