0

我有一个场景,我正在使用 SXSSF 工作簿(大约 1-2 百万)创建一个非常大的 xlsx 文件。

  • 在写入工作表时,我必须动态填充一些值,比如仅在工作表的第 1 行中的标题

问题:由于它的流 api,如果我在第 100000 行,并且想在第 1 行中填充一些值,此时我的第 1 行被刷新并尝试将其写入不可用。

问题: 1. 我可以阻止任何行刷新吗?2. 你能想到什么解决办法?

我正在考虑保留 Row1 值,刷新整个工作簿,再次阅读工作簿,创建 Row1 并再次刷新。

更好的解决方案请......

4

2 回答 2

2

很简单,你不能。SXSSF 是文件格式的流式写入器。一旦一组行从缓冲区中传递出来,它们就会被写入磁盘,写入需要排序的文件格式。在那一点上,它们已经消失了,无法改变,因为其他事情已经发生在它们之后。

如果您需要对整个工作簿的完全读/写访问权限,那么您需要切换到功能齐全的XSSFWorkbook. 这会缓冲内存中的所有内容,因此您可以随意更改您喜欢的任何部分,因为它仅在写入文件时才会被排序。

XSSFWorkbook确实需要比 更多的内存SXSSFWorkbook,因为它将整个文件保存在内存中。您可能需要增加堆大小。不过,对于大多数事情来说,内存比程序员便宜得多,所以只要多加点内存就行了!

于 2013-05-17T14:50:17.863 回答
0

解决方案以防万一需要它: - 为了保持低内存占用,不增加内存,不使用 XSSF - 我们最初写入 .csv 文件而不是写入 XLSX,而在实际创建 .xlsx 时,我们正在写入标题行并将记录从 .csv 复制到 .xlsx 文件。

于 2013-05-21T15:13:23.277 回答