使用 Apache POI 进行低内存写入/读取

Nic*_* A. 5 java out-of-memory apache-poi

我正在尝试编写一个相当大的 XLSX 文件(4M+ 单元),但遇到一些内存问题。

我无法使用 SXSSF,因为我还需要读取模板中的现有单元格。

我可以做些什么来减少内存占用吗?
也许将流读和流写结合起来?

Par*_*ech 5

为了用低内存处理大数据,最好的也是我认为唯一的选择是 SXSSF api-s。如果你需要读取现有单元格的一些数据,我假设你不需要同时读取整个4M+。在这种情况下,根据您的应用程序要求,您可以自行处理窗口大小,并仅在内存中保留特定时间所需的数据量。您可以首先查看以下示例: http: //poi.apache.org/spreadsheet/how-to.html#sxssf

诸如此类的东西

SXSSFWorkbook wb = new SXSSFWorkbook(-1); // turn off auto-flushing and accumulate all rows in memory
// manually control how rows are flushed to disk 
if(rownum % NOR == 0) {
((SXSSFSheet)sh).flushRows(NOR); // retain NOR last rows and flush all others
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。