多次调用时,SXSSFWorkbook.write()失败

时间:2015-08-13 16:28:11

标签: java apache-poi

有没有办法可以多次将工作簿写入outputStream?或者解决这个问题?

while(rs.next()) {
    Row row = sh.createRow(rowNum++);
    //set cell values.....
    if(rowNum % 500 == 0) wb.write(out);
}
来自this forum

,似乎SXSSFWorkbook不支持重新使用这样的工作簿。

我正在尝试查询数据库并使用工作簿将结果写回Excel文件。

我的Web应用程序结构是:browser - Apache - server - database。

问题是,如果数据集非常大,有时需要很长时间才能完成整个工作簿的编写。因此,Apache会在服务器写回响应之前断开与服务器的连接。

如果没有其他更好的解决方案,我想我必须在服务器上保存临时文件,并让浏览器不断检查该过程。最后下载文件。

[编辑]

我没有使用CSV的原因是我对excel文件有一些格式要求。对于我来说,工作簿对我来说是最直接的工具。(不确定CSVwriter是否也可以格式化ecel)。

我认为这是消耗时间的数据库查询过程。这就是为什么我想将数据写回客户端以及从数据库中获取数据。

1 个答案:

答案 0 :(得分:0)

将评论提升为答案:

if(rowNum % 500 == 0) wb.write(out);

这不会达到你所期望的那样,也不会有用。 Excel文件格式(.xls.xlsx)不是可附加的文件格式。您只能一次性写出所有文件。

如果将工作簿写入文件,然后将其另一个副本写入同一文件,则无效。然后,您将在文件中最终得到两个工作簿,这是不受支持的

如果您确实要在生成Excel文件时保存它,则需要使用CSV。 CSV是可流式和可附加的

如果没有,请一次生成整个文件,然后将其发送给客户端。如果需要,发送0字节(可能是chunked)“hello,still here”响应写入,直到你完成。

但是,使用Apache POI编写一个非常大的电子表格最多只需要几秒钟,不足以超时连接。如果花费的时间超过了这个问题,问题很可能不是在Apache POI中,而是在您的代码中。有关测试POI独立性能的信息,请参阅this Apache POI FAQ entry,以便了解自己代码的错误