首页 文章

空指针异常apache poi

提问于
浏览
8

嗨,我们一直在使用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});

}

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

HSSFSheet sheet=wb.getSheetAt(sheetname);

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

cell = row.getCell(cols);

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

2 回答

  • 1

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

    if (cell == null)
    {
       System.out.println("Cell is Empty in Column:" + cols);
    
    } else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING)
    {
       //code
    }
    

    一般情况下,在处理 Cell.getCellType() 函数时应该小心,因为空单元格可以是 null ,也可以是 CELL_TYPE_BLANK .

  • 5

    这是我避免Cell NullPoiterException的方法 .
    你能试试吗?祝好运!

    /**
         * Get string value of {@link Cell} object
         * 
         * @param cell
         *          {@link Cell} object
         * @return String value of {@link Cell} object
         */
        private static String getCellValueString(Cell cell) {
            String value="";
            if(cell!=null) {
                switch(cell.getCellType()){
                    case Cell.CELL_TYPE_BOOLEAN:
                        value=String.valueOf(cell.getBooleanCellValue());
                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        value=BigDecimal.valueOf(
                            cell.getNumericCellValue()).toPlainString();
                        break;
                    case Cell.CELL_TYPE_STRING:
                        value=String.valueOf(cell.getStringCellValue());
                        break;
                    case Cell.CELL_TYPE_FORMULA:
                        value=String.valueOf(cell.getCellFormula());
                        break;
                    case Cell.CELL_TYPE_BLANK:
                        value="";
                        break;
                }
            } else {
                logger.error("Cell is null");
            }
            return value.trim();
        }
    

相关问题