【发布时间】:2018-08-30 17:54:11
【问题描述】:
我需要读取几个 xlsx 文件以查找特定于员工的数据,并同时创建另一个 xlsx 文件(如果我在任何文件中找到数据),文件名作为员工 ID 附加到我在其中找到数据的名称。例如。有一个emp id为1的员工,并且有几个xlsx文件,例如A,B,C ...等等;我需要在每个文件中查找与 emp id 1 相关的数据,对于我受到打击的文件,我需要创建一个名为 1_A.xlsx 的文件。
现在虽然我已经构建了逻辑并且正在使用 Apache POI API 进行读写,但我的代码在创建包含数据的第一个文件后抛出 Out Of Memory 错误。并且无法读取其余文件。 我曾尝试使用 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 方法。
【问题讨论】:
-
您好,欢迎来到 StackOverflow。如果您发布一些相关代码(包括堆栈跟踪)并解释您尝试过的内容,您将获得更好的响应。有关提示,请参阅 stackoverflow.com/help/how-to-ask。
-
这个话题可能会有所帮助:stackoverflow.com/questions/17627508/…
-
好吧 - 文件有多大,有多少内存可用于堆空间?
-
文件不是很大。平均 5mb。
-
我发现在尝试读取多个文件时出现OOM。因为我试图遍历文件列表并一一读取它们以提取记录。请建议如何阅读多个 xlsx 文件而不会出现此错误。@Hulk
标签: java apache apache-poi xlsx