【问题标题】:How to read Excel cell having null values too in Java...?如何在 Java 中读取具有空值的 Excel 单元格...?
【发布时间】:2011-03-09 03:29:01
【问题描述】:

我使用的是 Apache POI 3.6。我有一列空白。我希望能够阅读它,然后移至下一栏。即使我可以解决NullPointerException 问题,我也无法进入下一个单元格。

这是我的代码 sn-p:

HSSFCell cell = row.getCell(c);
String value = null;

switch (cell.getCellType()) {

    case HSSFCell.CELL_TYPE_FORMULA:
        value = "FORMULA value=" + cell.getCellFormula();
        break;

    case HSSFCell.CELL_TYPE_NUMERIC:
        value = "NUMERIC value=" + cell.getNumericCellValue();
        break;

    case HSSFCell.CELL_TYPE_STRING:
        value = "STRING value=" + cell.getStringCellValue();
        break;

    case HSSFCell.CELL_TYPE_BLANK:
        value="";
        break;

    case HSSFCell.CELL_TYPE_ERROR:
        value="error";
        break;

    default:
        break;
}

System.out.println("CELL col=" + cell.getColumnIndex() + " VALUE=" + value);

我该如何解决我的问题?

【问题讨论】:

    标签: java apache excel apache-poi


    【解决方案1】:

    你需要检查是否cell!=null,因为如果一个单元格不存在连续,row.getCell(c)返回null

    【讨论】:

    • 据我所知,由于“单元格”是一个对象,因此无法使用“==”或“!=”运算符来获取值。不是吗?但单元格实际上存在,但它有一个“空白”值,即没有值。
    • 您可以使用 == 或 != 来检查空值,这是您应该做的。该单元很可能不存在(在数据结构中),这就是您遇到 NullPointerException 问题的原因。
    【解决方案2】:

    好吧,您可以在 switch 语句之前检查 null,或者您可以更改对 row.getCell 的调用。检查 POI 的 Javadoc 有两种形式,第一种是您正在使用的形式,第二种是 Row.MissingCellPolicy 类型的附加参数,您可以在其中传递一个值,该值会自动将空单元格转换为空白。

    【讨论】:

      【解决方案3】:

      我终于得到了我想要的。我感谢mezmo。 我想分享要更改的确切代码 sn-p。 只需替换以下行:

      HSSFCell cell = row.getCell(c);
      

      HSSFCell cell=row.getCell(c, org.apache.poi.ss.usermodel.Row.CREATE_NULL_AS_BLANK );
      

      【讨论】:

        【解决方案4】:

        试试这个

        List cellDataList = new ArrayList();
        XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
        
                                XSSFSheet sheet = workbook.getSheetAt(0);
        
                                Iterator rows = sheet.rowIterator();
        
                                int number=sheet.getLastRowNum();
        
        
                                int lineNumber = 0;
        
                                while (rows.hasNext())
        
                                {
                                    XSSFRow row = ((XSSFRow) rows.next());
                                    lineNumber++;
                                    if(lineNumber==1){continue;}
        
        
        
        
                                    Iterator cells = row.cellIterator();
                                    List cellTempList = new ArrayList();    
                                    int current = 0, next =1;
                                    while(cells.hasNext())
        
                                    {
        
                                        XSSFCell cell = (XSSFCell) cells.next();
        
        
                                        current = cell.getColumnIndex();
        
        
                                        if(current<next){
        
                                        }
                                        else{
        
                                            int loop = current-next;
        
                                            for(int k=0;k<loop+1;k++){
        
                                                cellTempList.add(null);
                                                next = next + 1;
                                            }
                                        }
                                        switch (cell.getCellType()) {
                                                    case Cell.CELL_TYPE_STRING:
                                                        System.out.println(cell.getRichStringCellValue().getString());
                                                        cellTempList.add(cell.getRichStringCellValue().getString());
                                                        break;
                                                    case Cell.CELL_TYPE_NUMERIC:                                                    
                                                            System.out.println(cell.getNumericCellValue());
                                                            cellTempList.add(String.valueOf(cell.getNumericCellValue()));                                                   
                                                        break;
                                                    case Cell.CELL_TYPE_BOOLEAN:
                                                        System.out.println(cell.getBooleanCellValue());
                                                        break;
                                                    case Cell.CELL_TYPE_FORMULA:
                                                        System.out.println(cell.getCellFormula());
                                                        cellTempList.add(cell.getCellFormula());
                                                        break;                                              
        
                                                    default:
                                                        System.out.println("Inside default");
                                        }
                                        next = next + 1;
        
                                    }
                                    cellDataList.add(cellTempList); 
                                 }
        

        【讨论】:

          【解决方案5】:

          谢谢Venkat,它对我也有用,除了
          对于那些使用 Apache 4.0.0 及更高版本的人,他们需要这样做:

          HSSFCell cell=row.getCell(c, org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-01
            • 1970-01-01
            • 2018-12-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多