Ошибка кучи Java - объединение нескольких файлов Excel в одну книгу (с несколькими листами) - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь использовать программу на Java, чтобы объединить 25 отдельных файлов Excel в одну книгу Excel с 25 листами. Я могу легко скопировать / вставить листы, но я хотел решить это с помощью кода. Мой код ниже работает с 24 из 25 листов; тем не менее, мой самый большой лист содержит 760 000 строк данных (остальные только около 1000), и всякий раз, когда я запускаю программу, она отключается из-за ошибки пространства кучи Java.

Я читал, что возможное решение - просто увеличить пространство кучи, но это не очень хорошая практика. Как заставить мою программу использовать меньше памяти в куче?

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelCombiner {
    private FileList fileList = new FileList();
    private Workbook workbook = new XSSFWorkbook();

    public void createWorkbook() throws IOException, InvalidFormatException {
        FileOutputStream out = new FileOutputStream(new File("MIMIC_DATABASE.xlsx"));
        createSheets();
        workbook.write(out);
        out.close();
        workbook.close();
    }

    public void createSheets() throws InvalidFormatException, IOException {
        for (File file : fileList.getFiles()) {
            System.out.println(file.getName());
            Workbook fileBook = new XSSFWorkbook(file);

            String sheetName = file.getName().replace(".xlsx", "");
            //New Sheet in Workbook that we're copying info into
            Sheet newSheet = workbook.createSheet(sheetName);
            //Old Sheet, fileBook should just be an excel file with one sheet
            Sheet oldSheet = fileBook.getSheetAt(0);

            for (int i = 0; i < oldSheet.getLastRowNum(); i++) {
                Row row = oldSheet.getRow(i);
                Row newRow = newSheet.createRow(i);
                for (int j = 0; j < row.getLastCellNum(); j++) {
                    Cell cell = row.getCell(j);
                    Cell newCell = newRow.createCell(j);

                    //Make sure to convert all old cells into String/Text
                    //Then copy them over to newCell
                    DataFormatter dataFormatter = new DataFormatter();
                    String cellValue = dataFormatter.formatCellValue(cell);
                    newCell.setCellValue(cellValue);
                }
            }
            fileBook.close();
        }
        //workbook.close();
    }

    public static void main(String[] args) throws IOException, InvalidFormatException {
        ExcelCombiner excelCombiner = new ExcelCombiner();
        excelCombiner.createWorkbook();
    }
}
...