尝试使用POI写入空单元格时为空指针

时间:2012-10-08 16:41:18

标签: java apache-poi

我正在尝试编写现有的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 个答案:

答案 0 :(得分:2)

来自public HSSFRow getRow(int rowIndex)

的javadoc
  

返回基于0的逻辑行(非物理行)。 如果你要求排   没有定义你得到一个空。这就是说第4行代表   一张纸上的第五行。

答案 1 :(得分:1)

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

当单元格中没有文本或空时,POI api行对象将把它作为" NULL"。这就是为什么你在处理那个细胞时得到NPE的原因。

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

所以,这是一些锻炼,而不是可以帮助。

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

    # fake some data xs = range(1, 17) vals = np.asarray([0.73, 0.74, 0.73, 0.71, 0.75, 0.76, 0.75, 0.73, 0.77, 0.78, 0.77, 0.75, 0.79, 0.80, 0.79, 0.77]) data = np.random.rand(20, len(vals)) * 0.03 + vals avgs = np.mean(data, axis=0) # plot linear regr. lines and fill xs2 = [0,20] coef = np.polyfit(xs[0::4], avgs[0::4], 1) # values for 0.01 ys2a = np.polyval(coef, xs2) coef = np.polyfit(xs[3::4], avgs[3::4], 1) # values for 0.5 ys2b = np.polyval(coef, xs2) plt.fill_between(xs2, ys2a, ys2b, color='OliveDrab', alpha=0.5) plt.plot(xs2, ys2a, color='OliveDrab', lw=3) plt.plot(xs2, ys2b, color='OliveDrab', lw=3) # plot data and manipulate axis and grid plt.boxplot(data, showfliers=False) plt.xticks(xs, [0.01, 0.1, 0.2, 0.5] * 4) plt.xlim(0.5, 16.5) plt.grid(False) for i in range(3): plt.axvline(i * 4 + 4.5, c='white') plt.xlabel('$\sigma^{2}$') plt.ylabel('$F_{w}(t)$') plt.show()

  2. 希望它会有用!!

答案 2 :(得分: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.

答案 3 :(得分:0)

//它可能对你有帮助。

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