空指针异常apache poi

y.r*_*yes 8 java excel nullpointerexception apache-poi

嗨,我们一直在使用apache poi ing java程序读取xls和xlsx文件,问题是我们得到空指针异常有两个原因..第一个是我们已经解决的空白单元格,另一个是我们的时候正在选择一个没有任何记录的专栏.

我们的程序询问excel文件的路径,然后是文件的特定工作表编号和要读取的工作表的特定列编号.这里是读取xls文件的代码

public void readXLSFile()throws IOException{
    InputStream ExcelFileToRead = new FileInputStream(path);
    HSSFWorkbook wb = new HSSFWorkbook(ExcelFileToRead);


    HSSFSheet sheet=wb.getSheetAt(sheetname);
    HSSFRow row; 
    HSSFCell cell;

    Iterator rows = sheet.rowIterator();

            list1.clear();

    while (rows.hasNext())
    {
                   headers.clear();
        row=(HSSFRow) rows.next();

                // Iterator cells = row.cellIterator();

                    headers.add("contents");


            cnt = cnt+1;

            cell = row.getCell(cols);
            if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING)
            {
                //System.out.println(cell.getStringCellValue()+"(string)");
                list.add(cell.getStringCellValue());
                                    d.add(cell.getStringCellValue());
                                    list1.add(new KeyValuePair(cell.getStringCellValue(),""));
            }
            else if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
            {
                //System.out.println(cell.getNumericCellValue()+"(numeric)");
                double num = cell.getNumericCellValue();
                String num2 = String.valueOf(num);
                list.add(num2);
                                     d.add(num2);
                                     list1.add(new KeyValuePair(num2,""));

            }
            else if(cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN)
            {
                //System.out.println(cell.getBooleanCellValue()+"(boolean)");
                String bool = String.valueOf(cell.getBooleanCellValue());
                list.add(bool);
                                     d.add(bool);
                                     list1.add(new KeyValuePair(bool,""));
            }
            else
            {
                //U Can Handel Boolean, Formula, Errors
            }


        //System.out.println();
    }
        arrey = list.toArray(new String[list.size()]);
                    data.add(d);
                   // System.out.println(data);


                     model = new DefaultTableModel();
                     table_1.setModel(model);


                   table_1.setModel(model);
                      model.setColumnIdentifiers(new String[] {"row","contents"});

                     for (KeyValuePair p : list1){


                       int nor=table_1.getRowCount();

                       int n2 = nor +1;
                        n1 = Integer.toString(n2);
                     //  model.addColumn(new String [] {n1});   


                       model.addRow(new String[] {n1,p.key, p.value});


                     }
                  //   model.addColumn(new String[] {n1});

}
Run Code Online (Sandbox Code Playgroud)

变量sheetname用于excel文件的工作表编号

HSSFSheet sheet=wb.getSheetAt(sheetname);
Run Code Online (Sandbox Code Playgroud)

并且变量cols用于您要读取的特定列

cell = row.getCell(cols);
Run Code Online (Sandbox Code Playgroud)

我们可以读取每个工作表的第一列以及第二个工作表的第二列但是当我编辑我的测试文件时,程序现在只能读取每个工作表的第一列..错误是空指针异常..希望你能提前帮助谢谢

小智 5

问题是你永远不会测试单元格是否为空!

if (cell == null)
{
   System.out.println("Cell is Empty in Column:" + cols);

} else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING)
{
   //code
}
Run Code Online (Sandbox Code Playgroud)

一般来说,在处理Cell.getCellType()函数时应该小心,因为空单元格可以是null或者是一个空单元格CELL_TYPE_BLANK.

  • 如果要控制返回给您的空白或缺少单元格的方式,可以指定[MissingCellPolicy](http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Row.MissingCellPolicy.html) (2认同)