JAVA: Как писать в .xlsx с небольшим объемом памяти - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть входной файл .xlsx f1, и я пытаюсь создать другой файл f2, используя f1 после некоторой модификации данных.

В настоящее время я пытаюсь использовать apache-poi streaming 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.

Как видно из результатов выполнения, при вызове книги. write () занимает много памяти, есть ли способ записи в файл Excel без использования дополнительной памяти.

Основная цель - уменьшить как Mem2, так и Mem3 результатов выполнения.

...