11

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

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

4

2 回答 2

7

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

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.

于 2013-08-06T07:00:52.110 回答
2

这是我避免 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();
    }
于 2015-07-16T04:10:37.507 回答