我最近遇到了针对Excel文件的Apache POI的.getCell()方法。如果我尝试实现Cell newCell = sheet.getRow(rowNumber).getCell(columnNumber)或类似的东西,我总是得到错误
Exception in thread "main" java.lang.NullPointerException
at ExcelWriter.getWorkbook(ExcelWriter.java:80)
at Gui2.<init>(Gui2.java:93)
at Main.main(Main.java:24)
指向我正在实现.getCell()方法的行,如果单元格为null。我有代码,应该确定单元格是否为空,然后打印一些东西,如果这是真的,但似乎单元格为空白导致程序错误。这只发生在某些情况下,我发现如果我创建一个工作表并使for循环在每一行中创建一个新单元格,我可以读取一个空白单元格并确定它是空白的。但是,如果我然后在该表中的任何单元格中键入一个值,然后尝试读取另一个空单元格,我会再次收到错误消息。我不明白为什么只有当我尝试读取空单元格时才会出现此错误,但我需要在程序中循环它们。以下是我的代码片段以及导致错误的原因。
public void getWorkbook(String fileName)
{
try
{
existingFile = new FileInputStream(new File(fileName));
workbook = new XSSFWorkbook(existingFile);
Sheet newSheet = workbook.getSheet("Test3");
//createSheet("Test3", workbook);
Cell newCell = newSheet.getRow(1).getCell(1);
if(newCell == null)
{
System.out.println("Null");
}
else if(newCell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC)
{
System.out.println("Number");
}
//System.out.println(newCell.getStringCellValue());
}
catch (FileNotFoundException e) //Couldn't find file
{
e.printStackTrace();
}
catch (IOException e) //Couldn't create workbook
{
e.printStackTrace();
}
}
为了清楚起见,代码中引用的单元格B2是空白的。但是,A1不是,但是当我读A1时,系统按照预期打印“数字”。
答案 0 :(得分:3)
如Apache POI Javadocs中所述,Sheet.getRow(num)
可以返回null,如果该行从未使用过,因此没有写入文件
如Apache POI docs on iterating over rows and cells所述,如果要遍历所有行,然后获取一个特定列,则需要执行以下操作:
// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row r = sheet.getRow(rowNum);
if (r == null) {
// No entries in this row
// Handle empty
continue;
}
int cn = 1;
Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
if (c == null) {
// The spreadsheet is empty in this cell
} else {
// Do something useful with the cell's contents
}
}
答案 1 :(得分:0)
我尝试了下面的代码..为我工作。如果它抛出NullPointerException,则我在工作表的同一位置与该行一起创建了一个新单元格。
try {
row = sheet.getRow(rowNum);
if(row == null) {
row = sheet.createRow(rowNum);
}
Cell cell = row.getCell(colNum);
if(cell == null) {
cell=row.createCell(colNum);
}
cell.setCellValue(String);
} catch (Exception e) {
System.out.println(e);
}