0

我正在尝试编写现有的 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();
4

4 回答 4

2

公共 HSSFRow getRow(int rowIndex)的 javadoc

返回基于 0 的逻辑行(非物理行)。如果您要求未定义的行,您会得到一个 null。也就是说,第 4 行代表一张纸上的第五行。

于 2012-10-08T16:55:16.390 回答
1

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

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

现在它为 NULL,所以首先我们必须初始化它并首先在那里创建一个新单元格,然后我们可以进一步处理。

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

  1. 在那里创建新单元格。在你的情况下,它会像

    myRow.createCell(0).setCellValue("Your Value !!")

希望会有用!!

于 2017-06-11T11:59:11.527 回答
0

//可能对你有帮助。

Iterator iterator = mySheet .rowIterator();
 if(iterator.hasNext()){
        Row myRow= mySheet.getRow(20);
        Cell myCell = myRow.getCell(0);
        myCell.setCellValue("praveen");
    }
于 2012-10-10T07:04:11.113 回答
0

如果在该行中抛出 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.
于 2012-10-08T17:01:42.467 回答