天天看点

java 读取编辑excel文件_使用Apache POI读取和编辑大型Excel文件

我已经阅读了许多关于使用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 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

//

// Sheet sheet = wb.getSheetAt(i);

//

// Iterator rowIterator = sheet.iterator();

// while (rowIterator.hasNext()) {

//

// Row row = rowIterator.next();

// Iterator 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;

}

在这里你可以看到:

在代码的第一部分注释掉了实现SXSSF之前我实现过XSSF的方式 .

接下来是我最后一次尝试的XSSFReader的实现 . 但我认为这不是可行的方法 .

以下大块代码注释掉了 - 我最初的XSSF实现分析Excel文件 .

你能帮忙完成这项任务吗?子目录中的报告大约是150,我绝对不想手动完成 . 有数百千字节的Excel,但也有几十兆字节 .

谢谢!