Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误:如何读取Excel中的空单元格_Java_Excel_Apache Poi - Fatal编程技术网

Java 错误:如何读取Excel中的空单元格

Java 错误:如何读取Excel中的空单元格,java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试使用POI从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_BL

我正在尝试使用POI从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 = "";
}
java.util.Iterator rows=工作表.rowditerator();
HSSFRow行=(HSSFRow)行。下一步();
HSSFCell cellF1=(HSSFCell)行。getCell(5);
if(cellF1.getCellType()==HSSFCell.CELL\u TYPE\u BLANK){
字符串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");
      }
    }
  }
while(rows.hasNext()){
HSSFRow行=(HSSFRow)行。下一步();
java.util.Iterator cells=row.cellIterator();
while(cells.hasNext()){
HSSFCell单元格=(HSSFCell)单元格。下一步();
if(cell.getCellType()==HSSFCell.cell\u TYPE\u BLANK){
字符串emptytype=“”;
System.out.println(“空”);
}
}
}

如果使用
单元格迭代器
,则只会得到在某个点定义的单元格(无
单元格,但会得到
空白
单元格)。如果要获取所有单元格,请按索引获取它们

根据索引,您可以执行以下操作:

 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
             }
         }
    }
 }
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
}
Sheet Sheet=workbook.getSheetAt(0);

对于(int rowNumber=sheet.getFirstRowNum();rowNumber对于单参数版本的
Row.getCell
,这是正常的行为。如果您查看API文档,它特别声明如果未定义单元格,
getCell
将返回null。许多java函数都表现出这种行为,因此考虑到这一点,编码没有任何错误。因此,一个版本您的代码可能是这样的:

 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
             }
         }
    }
 }
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
为空白单元格返回空单元格。因此,下面是一些替代代码:

HSSFRow row = sheet.getRow(rowNumber);
if (row != null) {
    HSSFCell cell = row.getCell(cellNumber, Row.RETURN_BLANK_AS_NULL);
    if (cell != null) {
        // process cell here
    }
}
或者,如果您愿意,您可以将策略指定为
行。创建\u NULL\u作为\u BLANK
。在这种情况下,您可以将
if(cell!=NULL)
替换为
if(cell.getCellType()!=cell.cell\u TYPE\u BLANK)

公共字符串getCellData(字符串文件名、int Sheet\u Num、int Row\u Num、int Col\u 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;

    }
这个把戏使我受益匪浅。
查看它是否对您有用…

如果您得到一个空指针,这意味着cellF1未定义。您确定第6个单元格已定义吗?请记住,这些单元格是基于0的。如果(hasDataFlag)单元格=行。getCell(cellNumber);hasDataFlag=(cell!=null);如果(hasDataFlag)hasDataFlag=(cell.getCellType()!=cell.cell\u TYPE\u BLANK);如果(hasDataFlag){我不明白它在逻辑上的意思,但我只是尝试不返回任何错误,谢谢你的欢迎。只需要详细说明一下。hasDataFlag仅在单元格有数据时才设置为true。因此,它仅在a)行不为null和b)时才为true如果单元格不为空,c)如果单元格类型不是单元格类型,则为空。我这样编码的原因是因为它避免了一大堆嵌套的ifs。我可以用嵌套的ifs编码它(就像我在第二个示例中所做的那样),但我个人觉得使用hasDataFlag会使代码更干净。但这只是我个人的风格;任何对你来说更简单的都可以。这意味着你定义的开始行、结束行、开始单元格和结束单元格都很酷。在我的代码中,循环太多单元格和有数据的行。对我来说,poi API如何区分null和t仍然是个谜他还是空的,多谢了