我需要读取几个xlsx文件以查找特定于员工的数据,并同时创建另一个xlsx文件(如果我在任何文件中找到数据),其文件名作为员工ID附加到我在其中找到数据的名称。例如。有一个雇员的emp id为1,并且有多个xlsx文件,例如A,B,C ...等;我需要在每个文件中查找与emp id 1相关的数据,对于这些命中的文件,我需要创建一个名为1_A.xlsx的文件。
现在,尽管我已经建立了逻辑并正在使用Apache POI API进行读写,但是在仅使用数据创建第一个文件之后,我的代码却抛出了内存不足错误。并且无法读取其余文件。 我尝试使用SXSSF而不是XSSF,但是发生了同样的OOM。
增加堆空间不是我的选择。 请在这里帮助...谢谢。
这是一段代码:
//Reader:
Row row = null;
List<Row> listOfRecords = new ArrayList<Row>();
try {
FileInputStream fis = new FileInputStream(metaDataFile);
new InputStreamReader(fis, "ISO-8859-1");
XSSFWorkbook wb = new XSSFWorkbook(fis);
XSSFSheet sheet = wb.getSheetAt(0);
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
row = rowIterator.next();
if (!isEmptyRow(row)) {
listOfRecords.add(row);
}
}
wb.close();
fis.close();
//Writer
LOGGER.info("in createWorkbook " );
Workbook empWorkbook = new SXSSFWorkbook(200);
Sheet empSheet = empWorkbook.createSheet("Itype Sheet For Emp_"
+ personnelNumber);
int rowNum = listOfRecords.size();
System.out.println("Creating excel");
Cell c = null;
for (int i = 0; i < rowNum; i++) {
Row record = listOfRecords.get(i);
Row empRow = empSheet.createRow(i++);
if (!isEmptyRow(record)) {
int colNum = record.getLastCellNum() + 1;
for (int j = 0; j < colNum; j++) {
Cell newCell = empRow.createCell(j);
System.out.println("cellVal:"
+ String.valueOf(record.getCell(j)));
newCell.setCellValue(String.valueOf(record.getCell(j)));
}
}
}
writer方法是从阅读器内部调用的。
答案 0 :(得分:0)
读取多个xlsx文件确实是一项棘手的事情,但我终于解决了。
我不得不将代码分解几下才能意识到OOM错误是由于以下事实:读取3个文件后,没有更多的内存可用于处理其余文件。 xlsx文件是压缩的xml文件。因此,当我们尝试使用XSSF或SXSSF API读取它们时,会将整个DOM加载到内存中,然后将其阻塞。 我在这里找到了一个很好的解决方案: [https://github.com/monitorjbl/excel-streaming-reader] 希望这对来这里面临其他问题的其他人有所帮助。