为什么读取xlsx文件中的非空单元格会得到空字符串?

时间:2018-07-06 10:27:33

标签: java apache-poi

我在读取xlsx文件时遇到麻烦。基本上,如果我不是从上到下阅读,都会从错过的行中得到空字符串。例如,如果我读取第5行,然后读取1到4中的任何行,我将没有答案,而单元格不是空的,并且如果我在读取第5行之前就可以读取该单元格。

我使用org.apache.poi.ss.usermodel。* 和com.monitorjbl.xlsx.StreamingReader

有人遇到这样的麻烦吗?

修改1: 整个代码很长,但是我创建的用于读取给定单元格的方法是:

private static String getCellValue(Sheet sheet, int rowNum, int column) {
    for (Row row : sheet) {
        if (row.getRowNum() != rowNum) {
            continue;
        }
        Cell cell = row.getCell(column);
        return cell.getStringCellValue();
    }
    return "";
}

我使用了foreach循环,因为sheet.getRow(rowNum)也不起作用。为了读取不同的单元格,我多次调用了此方法,因此,我使用foreach循环这一事实不应引起麻烦。

我也尝试过使用XSSF导入,但是我可以读取一些单元格,但并非所有单元格都使我感到困惑。

修改2: 呼叫发生在这里:

try (Workbook wb = StreamingReader.builder().bufferSize(BUFFER).open(tmp)) {
    Sheet sheet = wb.getSheetAt(SHEET_NUMBER);
    for (FieldEnum field : FieldEnum.getAllMandatory()) {
        fieldMap.put(field, getCellValue(sheet, field.getRow(), field.getColumn()));
    }
}

其中tmp是xlsx文件,FieldEnum是包含有关xlsx文件的信息的枚举(单元格名称,单元格编号,...),fieldMap是FieldEnum和String之间的映射,其中String表示相应单元格的内容。

修改3: 我只是想知道,当我没有答案时,是因为从未达到foreach循环的返回值。我还不知道是否是因为循环本身未触发,或者是否触发了循环,但继续触发始终。 rowNum和column的初始化发生在FieldEnum中,在这里,如果我切换字段的顺序,则可以读取或不读取单元格值。

修改4: 所以我确实进入了foreach循环,但是由于某种原因,我从未通过过if条件

1 个答案:

答案 0 :(得分:0)

非常感谢Axel Richter,感谢您,我已经解决了我的问题!

您对StreamingReader仅流传输数据且之后不存储数据这一事实是正确的。因此,要读取不同的行,使用枚举来组织单元格数据,则必须按顺序读取它们并读取一行中的多个单元格,要么必须一次读取所有这些单元格(第一次实例化该行时),要么将该行存储在其中以后要访问的静态变量。

基本上,我必须按rowNum排序我的枚举,并确保同时声明同一行中的不同单元(一个接一个,另一个之间没有其他单元的任何其他单元)。