我正在尝试编写现有的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();
答案 0 :(得分:2)
来自public HSSFRow getRow(int rowIndex)
的javadoc返回基于0的逻辑行(非物理行)。 如果你要求排 没有定义你得到一个空。这就是说第4行代表 一张纸上的第五行。
答案 1 :(得分:1)
我找到了同样的问题并解决了它。我想分享我的解决方案,它可以在将来帮助开发人员。
当单元格中没有文本或空时,POI api行对象将把它作为" NULL"。这就是为什么你在处理那个细胞时得到NPE的原因。
现在它是NULL所以首先我们必须初始化它并在那里创建一个新的单元格,而不是我们可以进一步处理。
所以,这是一些锻炼,而不是可以帮助。
在那里创建新单元格。在你的情况下,它将像
# 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 :(得分: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");
}