如何在Apache POI中获取Excel空白单元格值?

2022-09-01 00:52:48

我有一个巨大的excel文件,其中包含大量列,看起来像这样:-

Column1 Column2 Column3 Column4 Column5
abc             def             ghi
        mno             pqr
......

这是我为打印这些值而编写的代码:

try {
    FileInputStream inputStr = new FileInputStream(fileName);
    XSSFWorkbook xssfWork = new XSSFWorkbook(inputStr) ;
    XSSFSheet sheet1 = xssfWork.getSheetAt(0);
    Iterator rowItr = sheet1.rowIterator();

    while ( rowItr.hasNext() ) {
        XSSFRow row = (XSSFRow) rowItr.next();
        System.out.println("ROW:-->");
        Iterator cellItr = row.cellIterator();

        while ( cellItr.hasNext() ) {
            XSSFCell cell = (XSSFCell) cellItr.next();
            System.out.println("CELL:-->"+cell.toString());
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

此代码生成的输出为 :-

ROW:-->
CELL:-->Column1
CELL:-->Column2
CELL:-->Column3
CELL:-->Column4
CELL:-->Column5
ROW:-->
CELL:-->abc
CELL:-->def
CELL:-->ghi
ROW:-->
CELL:-->mno
CELL:-->pqr

因此,如果我们看一下上面的输出,我们可以注意到我留空值的单元格没有被POI库拾取,有没有办法将这些值获取为null。或者一种识别所显示的值跳过空白单元格的方法?

谢谢。


答案 1

如果你想获取所有单元格,无论它们是否存在,那么迭代器都不适合你。相反,您需要手动获取相应的单元格,可能缺少单元格策略

for(Row row : sheet) {
   for(int cn=0; cn<row.getLastCellNum(); cn++) {
       // If the cell is missing from the file, generate a blank one
       // (Works by specifying a MissingCellPolicy)
       Cell cell = row.getCell(cn, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
       // Print the cell for debugging
       System.out.println("CELL: " + cn + " --> " + cell.toString());
   }
}

有关所有这些的更多详细信息,请参阅有关迭代单元格的 Apache POI 文档


答案 2

我对同样的问题感到沮丧。以下是我在poi-3.7-20101029和poi-3.8中发现的。

RowIterator 和 CellIterator 不支持迭代 NULL 单元格或行 - 仅支持物理定义的单元格(可以是 BLANK)。

返回我所期望的解决方案需要使用从0开始,就像Chavira的答案暗示的那样(假设8个单元格行)。或者,您可以在迭代时使用该值来检查跳转数字...Row.getCell([int], Row.CREATE_NULL_AS_BLANK)Cell.columnIndex

令人讨厌的是,使用方法#1创建空白单元格后,迭代器将返回现在创建的空白单元格。我认为这是一个错误,MissingCellPolicy被CellIterator忽略了。


推荐