JAVA: как писать в .xlsx с малым объемом памяти
У меня есть входной файл.xlsx f1, и я пытаюсь создать другой файл f2, используя f1 после некоторой модификации данных.
В настоящее время я пытаюсь использовать apache потоковой передачи apache-poi для выполнения этой задачи. Проблема в том, что я не могу выполнить эту задачу с малым объемом памяти. Вот мой фрагмент кода
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: 112 МБ
Mem2: 464 МБ
Mem3: 697 МБ
Размер исходного файла inputFile.xlsx составляет 223 КБ.
Как видно из результатов запуска, вызов workbook.write() занимает много памяти, есть ли способ записать в файл Excel без использования дополнительной памяти.
Основная цель - уменьшить как Mem2, так и Mem3 результатов выполнения.