当前位置: 首页 > 知识库问答 >
问题:

Apache POI.getCell()错误,java.lang.NullPointerException如果为空则无法读取单元格

陈奇希
2023-03-14

我最近在使用Apache POI用于Excel文件的.getCell()方法时遇到了麻烦。如果我尝试实现单元格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)

它指向在单元格为NULL的情况下实现.getCell()方法的行。我的代码应该确定单元格是否为空,如果为真,然后打印一些内容,但似乎单元格为空会导致程序出错。但是,这种情况只在某些情况下发生,我发现如果创建一个sheet,并通过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时,系统会按预期打印“数字”。

共有1个答案

东门宜
2023-03-14

正如Apache POI Javadocs中所解释的,sheet.getRow(num)可以返回null,如果该行从未使用过,因此没有写入文件

正如Apache POI文档中关于迭代行和单元格的内容所述,如果希望循环遍历所有行,然后获取一个特定列,则需要执行以下操作:

// 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
   }
}
 类似资料:
  • 我有包含以下内容的属性文件: 我使用spring配置阅读了以下内容: 但在应用程序开始后,我看到: 我需要,因为我要使用重新启动程序:https://stackoverflow.com/a/3655963/2674303 如何避免这个错误?

  • 我是否遗漏了一些奇怪的设置,会使忽略空白单元格? 最后我编写了一个helper函数,该函数删除了col_n)列。

  • 我是Spring冬眠的新手,但我已经花了一天时间解决这个问题。我还是搞不清楚根本原因是什么,我该怎么办。所以,如果有人能给我一些建议,提前谢谢你。 这里有一个问题,我只是写一个简单的测试类,但是当我运行时,有一个例外: ??: 上下文初始化期间遇到异常-取消刷新 这里是类的源代码: 这是员工。哈佛商学院。xml 这是应用程序ontext.cfg.xml 还有pom。xml 下面是smiple测试类

  • 我正在使用Ionic,我需要发送令牌来获取api数据。下面的代码工作正常 但当尝试从本地存储读取数据时,却无法获取api数据。显示授权错误。我试过的代码是 当console.log((localStorage.get项目('令牌')))尝试打印相同的令牌-"d5213668d34013c9087273a5efab6d39d6d8bfb9"检查两者的类型都给出字符串

  • 我收到错误: 错误类型错误: 无法读取在评估 (webpack-internal:///./node_modules/@angular/common/esm5/http.js:163) 处未定义的属性 “长度”在 Array.forEach () 在 httpHeaders.lazyInit (webpack-internal:///./node_modules/@angular/common/e

  • 我正在尝试将一个项目转换为使用SpringWebFlux,但遇到了一个问题:如何让一些基本的业务逻辑正常工作。我有一个存储库层负责检索/持久化记录,还有一个服务层负责应用程序的业务规则。我想做的(在服务层)是检查给定用户名的用户是否已经存在。如果是这样,我想用一个错误来回应。如果没有,我希望允许插入发生。 我在存储库层调用一个方法,该方法将通过用户名查找用户,如果找不到,它将返回一个空的Mono。