Java 尝试使用POI写入空单元格时的Null指针

Java 尝试使用POI写入空单元格时的Null指针,java,apache-poi,Java,Apache Poi,我正在尝试编写现有的excel工作表。然而,当我运行下面的代码时,我得到了NPE。如果目标单元格具有值,则代码可以正常工作。但当它是一个空的细胞时,它会产生NPE FileInputStream myInput = new FileInputStream(fileName); POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput); Workbook myWorkBook = new

我正在尝试编写现有的excel工作表。然而,当我运行下面的代码时,我得到了NPE。如果目标单元格具有值,则代码可以正常工作。但当它是一个空的细胞时,它会产生NPE

FileInputStream myInput = new FileInputStream(fileName);
            POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput);
            Workbook myWorkBook = new HSSFWorkbook(myFileSystem);
            Sheet mySheet = myWorkBook.getSheetAt(0);
            myRow = mySheet.getRow(20);
            myCell = myRow.getCell(0);
            //myCell = myRow.createCell(0);
            myCell.setCellValue("praveen");
            FileOutputStream myOutput = new FileOutputStream(fileName);
            myWorkBook.write(myOutput);
            myOutput.close();
来自javadoc for

返回基于0的逻辑行(非物理行)如果你要求吵架 如果未定义,则会得到空值。也就是说,第4行代表 单子上的第五行

来自javadoc for

返回基于0的逻辑行(非物理行)如果你要求吵架 如果未定义,则会得到空值。也就是说,第4行代表 单子上的第五行


如果在该行中抛出NPE,则表示您正在搜索的特定行未定义。除了检查整体结构之外,您还应该进行一些防御性编程,通过验证您搜索的索引是否在最小索引和最大索引之间,在获取行之前添加一些检查

//assuming a cellIndex int parameter, the code should look like
myRow = mySheet.getRow(20);
if(myRow.getFirstRowNum() < cellIndex && cellIndex < myRow.getLastRowNum())
    myCell = myRow.getCell(0);
else
    //Throw an exception, log something, skip the operation or create a new row.
//假设一个cellIndex int参数,代码应该如下所示
myRow=mySheet.getRow(20);
if(myRow.getFirstRowNum()
如果在该行中抛出NPE,则表示您正在搜索的特定行未定义。除了检查整体结构之外,您还应该进行一些防御性编程,通过验证您搜索的索引是否在最小索引和最大索引之间,在获取行之前添加一些检查

//assuming a cellIndex int parameter, the code should look like
myRow = mySheet.getRow(20);
if(myRow.getFirstRowNum() < cellIndex && cellIndex < myRow.getLastRowNum())
    myCell = myRow.getCell(0);
else
    //Throw an exception, log something, skip the operation or create a new row.
//假设一个cellIndex int参数,代码应该如下所示
myRow=mySheet.getRow(20);
if(myRow.getFirstRowNum()
//这可能会对你有所帮助

Iterator iterator = mySheet .rowIterator();
 if(iterator.hasNext()){
        Row myRow= mySheet.getRow(20);
        Cell myCell = myRow.getCell(0);
        myCell.setCellValue("praveen");
    }
//这可能对你有帮助

Iterator iterator = mySheet .rowIterator();
 if(iterator.hasNext()){
        Row myRow= mySheet.getRow(20);
        Cell myCell = myRow.getCell(0);
        myCell.setCellValue("praveen");
    }

我发现了同样的问题并解决了它。我想分享我的解决方案,它可以帮助开发者在未来

当单元格中没有文本或为空时,POI api row对象会将其视为“NULL”。这就是为什么您在处理该单元格时获得NPE

现在它是空的,所以首先我们必须初始化它并在那里创建一个新的单元格,然后我们才能进一步处理它

所以,这里有一些锻炼可以帮助你

  • 在那里创建新的单元格。你的情况是

    myRow.createCell(0.setCellValue(“您的值!!”)


  • 希望它会有用

    我发现了同样的问题并解决了它。我想分享我的解决方案,它可以帮助开发者在未来

    当单元格中没有文本或为空时,POI api row对象会将其视为“NULL”。这就是为什么您在处理该单元格时获得NPE

    现在它是空的,所以首先我们必须初始化它并在那里创建一个新的单元格,然后我们才能进一步处理它

    所以,这里有一些锻炼可以帮助你

  • 在那里创建新的单元格。你的情况是

    myRow.createCell(0.setCellValue(“您的值!!”)


  • 希望它会有用

    它应该在堆栈跟踪中指出哪一行给了您这个问题。在哪一行上您得到了错误“myCell=myRow.getCell(0)”------>这就是它抛出exceptionmyRow初始化为null的地方。您的mySheet.getRow(20)正在返回null。它应该在堆栈跟踪中指出哪一行给您带来了问题。在哪一行上您得到了错误“myCell=myRow.getCell(0);”----->这是它抛出exceptionmyRow的地方,然后初始化为null。您的mySheet.getRow(20)返回空值