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

use*_*429 37 java apache apache-poi

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

Column1 Column2 Column3 Column4 Column5
abc             def             ghi
        mno             pqr
......
Run Code Online (Sandbox Code Playgroud)

这是我编写的用于打印这些值的代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

此代码生成的输出是: -

ROW:-->
CELL:-->Column1
CELL:-->Column2
CELL:-->Column3
CELL:-->Column4
CELL:-->Column5
ROW:-->
CELL:-->abc
CELL:-->def
CELL:-->ghi
ROW:-->
CELL:-->mno
CELL:-->pqr
Run Code Online (Sandbox Code Playgroud)

所以,如果我们查看上面的输出,我们可以注意到POI库没有拾取我留下空白值的单元格,有没有办法可以将这些值作为null.或者一种方法来识别所呈现的值跳过空白单元格?

谢谢.

Gag*_*arr 58

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

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());
   }
}
Run Code Online (Sandbox Code Playgroud)

迭代单元格的Apache POI文档中有关于所有这些的更多细节

  • 更新:`Row.CREATE_NULL_AS_BLANK`应该是`MissingCellPolicy.CREATE_NULL_AS_BLANK` (3认同)
  • 这是不推荐使用的`row.getCell(short)`.抱歉. (2认同)

Sea*_*ers 11

我对同样的问题感到沮丧.这是我在poi-3.7-20101029和poi-3.8中找到的.

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

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

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


小智 1

        for(org.apache.poi.ss.usermodel.Row tmp : hssfSheet){
            for(int i = 0; i<8;i++){
                System.out.println(tmp.getCell(i));
            }               
        }
Run Code Online (Sandbox Code Playgroud)