使用Apache POI访问单元时发生NullPointerException

ind*_*igo 1 java excel apache-poi

我正在尝试使用Apache POI读取Excel文件。我的目标是从每一行中获取单元格2和3,并将它们放入数组中。在某些行中,单元格3为空(我不是在谈论EMPTY,NULL或BLANK)。如果在Excel中检查它们,则为空。

这些空单元格中的一些(不是全部)导致NullPonterException:线程“ main” java.lang.NullPointerException中的异常。尝试获取单元格值或单元格类型时会发生这种情况。我的印象是该位置没有牢房。

同时,如果我row.createCell(2).setCellType(1);为该特定行执行该程序,则继续到该类型的下一个单元格。那是(我能找到的)唯一的解决方法,可以继续从下一行读取单元格。

您能否帮助我理解如何(使用代码)识别这些单元并将解决方法放到适当位置,以便我可以继续阅读直到文件末尾?

这是代码:

static ArrayList<String> getFirstFile() throws IOException
{
    FileInputStream fileIn = null;

    ArrayList <String> namesFirstFile = new ArrayList <String>();
    String folderPath = "C:\\";
    String indivList1 = "filename.xls";

    fileIn = new FileInputStream(folderPath+indivList1);
    POIFSFileSystem fs = new POIFSFileSystem(fileIn);
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
    int rowNumber = 6; //skipping the first 6 rows as irrelevant
    HSSFRow row = sheet.getRow(rowNumber);
    String firstName = "";
    String lastName = "";

    while(row.getCell(0).getCellType() == 0) {
        lastName = row.getCell(1).toString();
        firstName = row.getCell(2).toString();

        namesFirstFile.add((rowNumber-6), (lastName + " " + firstName));
        rowNumber++;
        row = sheet.getRow(rowNumber);          
    }
}
Run Code Online (Sandbox Code Playgroud)

Tej*_*sad 5

您必须检查该单元格的存在。请记住,如果存在一行并不表示所有单元格都存在。如果不存在该特定单元格,则执行get操作将引发空指针错误,但create单元格将不会引发错误,因为它会在该特定行中创建该单元格。仅当该单元格对象存在时,才能对其进行点运算符。

例如:

如果位于第三位置的单元格将起作用:

row1.getCell(2).getStringCellValue(); // if the value is of string type

否则,您需要检查是否使用if并在需要时创建该单元格。

// This checks if the cell is present or it'll return null if the cell
// is not present (it won't check the value in cell)
if (row1.getCell(2) != null)
{
   row1.createCell(2);
}
Run Code Online (Sandbox Code Playgroud)

如果该单元格不存在,而您的唯一目标是获取该值,则可以在数组中设置默认值。

这两行将不起作用,因为它将把单元格对象转换为字符串,但不能将其内容转换为字符串:

lastName = row.getCell(1).toString();
firstName = row.getCell(2).toString();
Run Code Online (Sandbox Code Playgroud)

您必须将其更改为:

lastName = row.getCell(1).getStringCellValue();
firstName = row.getCell(2).getStringCellValue();
Run Code Online (Sandbox Code Playgroud)

如果该单元格中没有任何值,则无需执行此操作:

if (row.getCell(2) != null)
{
    row.createCell(2);
}
firstName = row.getCell(2).toString();
Run Code Online (Sandbox Code Playgroud)

更改为:

if (row.getCell(2) != null)
{
    firstName = row.getCell(2); // your other operations
} else {
    firstname = "default value"; // your other operations
}
Run Code Online (Sandbox Code Playgroud)

仅在创建单元格而不设置值时,才需要获取单元格值。

row.createCell(2);仅在为单元格设置值时才需要使用。在这里,您没有任何价值。


val*_*tis 5

尝试设置Row.MissingCellPolicy

  • static Row.MissingCellPolicy CREATE_NULL_AS_BLANK

    为丢失的单元格创建一个新的空白单元格。

  • static Row.MissingCellPolicy RETURN_BLANK_AS_NULL

    缺失的单元格返回为空,空白单元格也是如此

  • static Row.MissingCellPolicy RETURN_NULL_AND_BLANK

    缺失的单元格返回为空,空白单元格正常返回

这个问题对这个话题有很好的讨论。