有没有办法可以多次将工作簿写入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)。
我认为这是消耗时间的数据库查询过程。这就是为什么我想将数据写回客户端以及从数据库中获取数据。
答案 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,以便了解自己代码的错误