我有一个场景,我正在使用SXSSF工作簿创建一个非常大的xlsx文件(大约1-2百万)。
问题: 由于它的流式传输api,如果我在第100000行,并且想要在Row1中填充一些值,那么此时我的第1行被刷新并尝试写入它不可用。
问题: 我可以阻止任何一排冲洗吗? 2.你能想到的任何解决方案吗?
我正在考虑保存Row1值,刷新整个工作簿,再次读入工作簿,创建Row1并再次刷新。
更好的解决方案请....
答案 0 :(得分:2)
很简单,你做不到。 SXSSF是文件格式的流编写器。一旦一组行从缓冲区中传出,它们将被写入磁盘,成为需要排序的文件格式。那时,它们已经消失了,不能改变,因为其他事情已经发生了。
如果您需要对整个工作簿具有完全读/写权限,则需要切换到功能齐全的XSSFWorkbook
。这会缓冲内存中的所有内容,因此您可以根据需要更改您喜欢的任何部分,因为它只会在写入文件时排序。
XSSFWorkbook
确实需要比SXSSFWorkbook
更多的内存,因为它将整个文件保存在内存中。您可能需要提高堆大小。但是对于大多数情况来说,内存比程序员便宜得多,所以只需要更多内存!
答案 1 :(得分:0)
解决方案可以满足任何人的需要: - 为了保持内存占用率低,不增加内存,不使用XSSF - 我们最初写入.csv文件而不是写入XLSX,而实际创建.xlsx时我们正在编写标题行并将记录从.csv复制到.xlsx文件。