JAVA:如何以低内存占用率写入.xlsx
我有一个input.xlsx文件f1,在一些数据修改之后,我正试图使用f1创建另一个文件f2 目前,我正在尝试使用ApachePOI流式api来完成这项任务。问题是,我无法在内存占用较低的情况下完成此任务。这是我的代码片段JAVA:如何以低内存占用率写入.xlsx,java,apache-poi,xlsx,sxssf,Java,Apache Poi,Xlsx,Sxssf,我有一个input.xlsx文件f1,在一些数据修改之后,我正试图使用f1创建另一个文件f2 目前,我正在尝试使用ApachePOI流式api来完成这项任务。问题是,我无法在内存占用较低的情况下完成此任务。这是我的代码片段 import com.monitorjbl.xlsx.StreamingReader; public static void streamingWriter() { SXSSFWorkbook workbook = new SXSSFWorkbook(50);
import com.monitorjbl.xlsx.StreamingReader;
public static void streamingWriter()
{
SXSSFWorkbook workbook = new SXSSFWorkbook(50);
workbook.setCompressTempFiles(true);
try (InputStream inputStream = new FileInputStream(new File("inputFile.xlsx"));
Workbook inputWorkbook = StreamingReader.builder()
.rowCacheSize(50)
.bufferSize(512)
.open(inputStream)) {
Runtime runtime = Runtime.getRuntime();
Sheet newSheet;
Row newRow;
Cell newCell;
for (Sheet sheet : inputWorkbook) {
newSheet = workbook.createSheet();
for (Row row : sheet) {
newRow = newSheet.createRow(row.getRowNum());
for (Cell cell : row) {
newCell = newRow.createCell(cell.getColumnIndex());
copyCell(cell, newCell, workbook);
}
}
}
System.out.println("Mem2: " + (runtime.totalMemory() - runtime.freeMemory()));
String fileName = "outputFile.xlsx";
FileOutputStream outputStream = new FileOutputStream(fileName);
workbook.write(outputStream);
System.out.println("Mem3: " + (runtime.totalMemory() - runtime.freeMemory()));
outputStream.flush();
outputStream.close();
workbook.dispose();
} catch (IOException e) {
System.out.println("error releasing respurces: " + e.getClass().getSimpleName() +
e.getMessage());
}
}
以下是运行结果-
Mem1:112MB
Mem2:464MB
Mem3:697MB
原始“inputFile.xlsx”的大小为223KB
从运行结果可以看出,调用workbook.write()会占用大量内存,有没有一种方法可以在不使用额外内存的情况下写入excel文件
主要目标是减少运行结果的Mem2和Mem3。对于非常低的内存,只需使用
CSV
。要降低内存,请切换到.xls
。Office Open XML
文件格式(*.xlsx
)只是包含XML
文件的ZIP
存档。因此,使用Java
最节省内存的方法就是只打开ZIP
归档文件,并直接使用StAX
操作其中的XML
文件。参见示例:。当然,这意味着编程工作量很大。@Gagravarr,这不是我的选择,因为最终用户可以直接访问输入和输出文件,业务需要支持。xlsx@AxelRichter谢谢这可能会有帮助,如果我找不到更高级别的替代方案,我可能不得不采用这种方法。每个人都想要免费的一切,昨天。。。Apache POI没有商业赞助,只有志愿者。内存越低越好,但开发需要有人付费,没有人愿意:(