我已经阅读了很多关于Apache POI大文件问题的文章和主题。但我对任何解决方案仍有一些问题。 所以我的任务是从许多Excel文件中删除空行。它们被安排在目录的树结构中,我想要立即执行所有程序。 为此,我有下一个方法:
public static void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
System.out.println("\n" + "Folder: " + fileEntry.getName());
listFilesForFolder(fileEntry);
} else {
System.out.println("File:" + fileEntry.getName() + " = " + humanReadableByteCount(fileEntry.length()) + " -> ");
System.out.println("New size: " + humanReadableByteCount(workWithWorkbook2(fileEntry)));
}
}
}
方法humanReadableByteCount在这里并不重要。所有与Excel一起工作的方法workWithWorkbook2。很多次我重写了这个方法,我尝试使用XSSF(usermodel)SXSSF和XSSFReader(eventusermodel),结果如下:
XSSF - 通过Apache POI的这种实现,我的程序以OutOfMemoryException结束。我试图设置更多可用内存(-Xmx2g和-Xmx3g),但这还不够。程序在大约1.5 GB RAM的开头使用,在第一个Excel之后大约是1.7 GB的RAM,但随后打开了一个更大的Excel(大约40兆字节)和内存超过2.8千兆字节的RAM。
SXSSF - 我只找到了创建新文件的示例。但那不是我需要的。我需要读取文件,分析它并删除空行。
XSSFReader - 这里我遇到了一些XMLParser问题(目前仍然存在)。不过,这只是一个读者,我需要能够编辑一个文件。
我想向您展示我的方法workWithWorkbook2,但它只包含XSSFReader的实现,因为我对Apache POI的不同实现进行了实验。 因此,有一个方法workWithWorkbook2,其中包含许多注释行,以便您查看我的尝试:
public static long workWithWorkbook2(File fileEntry) {
if (fileEntry.getName().endsWith(".xltx")) {
System.out.println("== Jump over .xltx file ==");
}
else {
//FileInputStream file = new FileInputStream(new File(fileEntry.getPath()));
//Workbook wb = WorkbookFactory.create(new File(fileEntry.getPath()));
//SXSSFWorkbook workbook = new SXSSFWorkbook(wb, 1000);
//workbook.setCompressTempFiles(true);
OPCPackage pkg = OPCPackage.open(fileEntry.getPath());
XSSFReader r = new XSSFReader(pkg);
SharedStringsTable sst = r.getSharedStringsTable();
XMLReader parser = fetchSheetParser(sst);
Iterator<InputStream> sheets = r.getSheetsData();
while(sheets.hasNext()) {
InputStream sheet = sheets.next();
InputSource sheetSource = new InputSource(sheet);
parser.parse(sheetSource);
sheet.close();
}
// FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
//
// for (int i = 0; i<wb.getNumberOfSheets(); i++) {
//
// Sheet sheet = wb.getSheetAt(i);
//
// Iterator<Row> rowIterator = sheet.iterator();
// while (rowIterator.hasNext()) {
//
// Row row = rowIterator.next();
// Iterator<Cell> cellIterator = row.cellIterator();
//
// while (cellIterator.hasNext()) {
//
// Cell cell = cellIterator.next();
//
// if (cell == null) {
// System.out.println(row.getRowNum() + " NULL, " + cell.getCellType() + ", " + cell.getColumnIndex());
// }
// else {
//
// switch (evaluator.evaluateInCell(cell).getCellType())
// {
// case Cell.CELL_TYPE_STRING:
// //System.out.println(row.getRowNum() + " String, " + cell.getCellType() + ", " + cell.getColumnIndex() + ", " + cell.getStringCellValue());
// break;
// case Cell.CELL_TYPE_NUMERIC:
// //System.out.println(row.getRowNum() + " Numeric, " + cell.getCellType() + ", " + cell.getColumnIndex() + ", " + cell.getNumericCellValue());
// break;
// case Cell.CELL_TYPE_FORMULA:
// //System.out.println(row.getRowNum() + " Formula, " + cell.getCellType() + ", " + cell.getColumnIndex() + ", " + cell.getCellFormula());
// break;
// case Cell.CELL_TYPE_BOOLEAN:
// //System.out.println(row.getRowNum() + " Boolean, " + cell.getCellType() + ", " + cell.getColumnIndex() + ", " + cell.getBooleanCellValue());
// break;
// case Cell.CELL_TYPE_BLANK:
// //System.out.println(row.getRowNum() + " Empty, " + cell.getCellType() + ", " + cell.getColumnIndex());
// break;
// case Cell.CELL_TYPE_ERROR:
// //System.out.println(row.getRowNum() + " Error, " + cell.getCellType() + ", " + cell.getColumnIndex());
// break;
// default:
// //System.out.println(row.getRowNum() + " WTF type?, " + cell.getCellType() + ", " + cell.getColumnIndex());
// break;
// }
//
// }
// }
//
// }
//
// }
//
// evaluator.clearAllCachedResultValues();
//file.close();
}
return 0;
}
在这里你可以看到:
请帮忙完成这项任务?子目录中的报告大约是150,我绝对不想手动完成。有数百千字节的Excel,但也有几十兆字节。
THX!