2012-10-08 64 views
0

我想写一个现有的Excel表单。但是,当我运行下面的代码时,我得到了NPE。如果目标单元格有一个值,代码工作正常。但是当它是一个空单元时,它会给NPE。尝试使用POI写空单元格时出现空指针

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(); 
+2

它应该在你的堆栈跟踪中说出哪一行可以解决问题。 – gigadot

+1

您在哪条线上收到错误 – saum22

+0

“myCell = myRow.getCell(0);” ----->这是抛出异常的地方 – user1669488

回答

2

从Javadoc中public HSSFRow getRow(int rowIndex)

,则返回0为基础的所述逻辑排(未物理的)。 如果您询问未定义的行 ,您将得到一个空值。这就是说第4行表示 表单上的第五行。

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. 
0

//它可能会帮助你。

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

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

当单元格中没有文本或为空时,POI api行对象将其视为“NULL”。这就是为什么你在处理那个单元时得到NPE的原因。

现在,它的空值首先我们必须初始化它,并首先创建一个新的单元格,然后再进一步处理。

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

  1. 在那里创建新细胞。在你的情况下,它会像

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

希望这将是有用的!

相关问题