Я пытаюсь использовать программу на 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();
}
}