2012-06-22 50 views
3

我想从使用POI的Excel中读取数据。我如何检查这是否是一个空单元格?错误:如何读取Excel中的空单元格

我不知道缺什么,我认为这应该是工作:

java.util.Iterator<Row> rows = worksheet.rowIterator(); 

HSSFRow row = (HSSFRow) rows.next(); 
HSSFCell cellF1 = (HSSFCell) row.getCell(5); 
if(cellF1.getCellType() == HSSFCell.CELL_TYPE_BLANK) { 
    String val = ""; 
} 

我的if语句(空指针),但只有当我用这个,我可以检查,进行了错误:

while (rows.hasNext()) { 
    HSSFRow row = (HSSFRow) rows.next(); 
    java.util.Iterator<Cell> cells = row.cellIterator(); 
    while (cells.hasNext()) { 
     HSSFCell cell = (HSSFCell) cells.next(); 
     if(cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) { 
     String emptytype = ""; 
     System.out.println("empty"); 
     } 
    } 
    } 
+0

如果你得到一个空指针,那就意味着cellF1是未定义的。 你确定第六个单元格已定义?请记住,单元格是基于0的。 – Derk

回答

8

这对于Row.getCell 1参数版本的正常行为。如果你看看API文档,它特别指出,如果单元格未定义,getCell将返回null。许多Java函数都表现出这种行为,所以编码时没有任何错误来考虑这一点。所以,你的代码的一个版本可能是这样的:

boolean hasDataFlag = true;  
HSSFRow row = sheet.getRow(rowNumber); 
hasDataFlag = (row != null); 
HSSFCell cell = null; 
if (hasDataFlag) cell = row.getCell(cellNumber); 
hasDataFlag = (cell != null); 
if (hasDataFlag) hasDataFlag = (cell.getCellType() != Cell.CELL_TYPE_BLANK); 
if (hasDataFlag) { 
    // process the cell here 
} 

或者,您可以使用其他版本的Row.getCell,这需要指定缺少的格策第二个参数。该版本将允许您指定getCell为空白单元格返回空单元格。所以,这里是一些althernative代码:

HSSFRow row = sheet.getRow(rowNumber); 
if (row != null) { 
    HSSFCell cell = row.getCell(cellNumber, Row.RETURN_BLANK_AS_NULL); 
    if (cell != null) { 
     // process cell here 
    } 
} 

或者,如果你愿意,你可以指定政策Row.CREATE_NULL_AS_BLANK。在这种情况下,您将用if (cell.getCellType() != Cell.CELL_TYPE_BLANK)替换if (cell != null)

+0

if(hasDataFlag)cell = row.getCell(cellNumber); hasDataFlag =(cell!= null); if(hasDataFlag)hasDataFlag =(cell.getCellType()!= Cell.CELL_TYPE_BLANK); if(hasDataFlag){ 我没有得到它在逻辑上的意思,但我只是尝试并返回没有错误谢谢你 –

+0

不客气。稍微详细一点。 hasDataFlag仅在单元格有数据时设置为true。所以它只是真实的a)如果该行不为空b)如果该单元不为空c)如果该单元类型不是CELL_TYPE_BLANK。我这样编码的原因是因为它避免了一堆嵌套的ifs。我可以用嵌套ifs编码它(就像我在第二个示例中那样),但是我个人觉得在更简洁的代码中使用hasDataFlag结果。但那只是我个人的风格。对你来说更简单的事情就好了。 –

5

如果使用CellIterator,你将只能得到那些在某一时刻被定义的细胞(无null细胞,但你会得到blank细胞)。如果你想获得的所有细胞,通过指数

获取它们通过索引,你会做这样的事情:

Sheet sheet = workbook.getSheetAt(0); 
for (int rowNumber = sheet.getFirstRowNum(); rowNumber <= sheet.getLastRowNum(); rowNumber++) { 
    Row row = sheet.getRow(rowNumber); 
    if (row == null) { 
     // This row is completely empty 
    } else { 
     // The row has data 
     for (int cellNumber = row.getFirstCellNum(); cellNumber <= row.getLastCellNum(); cellNumber++) { 
      Cell cell = row.getCell(cellNumber); 
      if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) { 
       // This cell is empty 
      } else { 
       // This cell has data in it 
      } 
     } 
    } 
} 
+0

这意味着你定义了开始行,结束行,开始单元格和结束单元格,这很酷。在我的代码只是循环太细胞和有数据的行。对于我来说, 对于我来说仍然是一个谜么,poi API怎么能区分空和空单元呢,这要归功于很多 –

0
int column, rownumber = 0; // just for showing the example code 

Row row = sheet1.getRow(rownumber); // just for showing the example code 

if (row!= null) 
    mycell = row.getCell(0); 
if (mycell != null && mycell.getCellType() != Cell.CELL_TYPE_BLANK) { 
    System.out.println(mycell.getStringCellValue()); 
} 
else{ 
    System.out.println("whatever"); 
} 
0

公共字符串getCellData(字符串FILE_NAME,INT Sheet_Num,诠释ROW_NUM,诠释为col_num)抛出IOException异常{

FileInputStream fileIn = new FileInputStream(System.getProperty("user.dir")+"\\"+File_Name+".xlsx"); 
    XSSFWorkbook workbook = new XSSFWorkbook(fileIn); 
    XSSFSheet sheet=workbook.getSheetAt(Sheet_Num-1); 
    XSSFRow row = sheet.getRow(Row_Num-1); 
    XSSFCell cell= row.getCell(Col_Num-1); 
    String celldata; 
    if(cell!=null){ 
    celldata= cell.getStringCellValue(); 
    } 
    else 
     celldata =""; 
    fileIn.close(); 
    return celldata; 

    } 
0
Cell cell = row.getCell(x, Row.CREATE_NULL_AS_BLANK); 

这一招heped我很多东西。 看看它对你是否有用...

相关问题