JAVA:如何以低内存占用率写入.xlsx

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);

我有一个input.xlsx文件f1,在一些数据修改之后,我正试图使用f1创建另一个文件f2

目前,我正在尝试使用ApachePOI流式api来完成这项任务。问题是,我无法在内存占用较低的情况下完成此任务。这是我的代码片段

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没有商业赞助,只有志愿者。内存越低越好,但开发需要有人付费,没有人愿意:(