读取excel的空白单元格并返回List <list <string>&gt; </list <string>

时间:2014-01-10 12:29:57

标签: java apache-poi

我的excel文件有4行2列 连续值具有3row 1st column作为空白值,如下所示

phone       plan
------------------
85366667777 PLATINUM
85367890000 GOLD
85362524232 SILVER
null        SILVER
85362522436 DIAMOND

public List<List<String>> readExcelFile(String fileName) {

        try {
            FileInputStream fileInputStream = new FileInputStream(fileName);
            POIFSFileSystem fsFileSystem = new POIFSFileSystem(fileInputStream);
            HSSFWorkbook workBook = new HSSFWorkbook(fsFileSystem);
            HSSFSheet hssfSheet = workBook.getSheetAt(0);
            Iterator<Row> rowIterator = hssfSheet.rowIterator();
            boolean headerRow = true;
            while (rowIterator.hasNext()) {
                if (headerRow == false) {
                String Rows = util.loadfile("config/ConfigValue.properties","NoOfRowsToSkip");
                int i = Integer.parseInt(Rows);
                    HSSFRow hssfRow = (HSSFRow) rowIterator.next();
                    if(hssfRow.getRowNum()==0||hssfRow.getRowNum()<=i){
                           continue; //just skip the rows if row number is 0 TO i
                          }
                    Iterator<Cell> iterator = hssfRow.cellIterator();
                    List cellTempList = new ArrayList();
                    while (iterator.hasNext()) {
                        HSSFCell hssfCell = (HSSFCell) iterator.next();

                    if(hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC)
                        {DecimalFormat df = new DecimalFormat("#");
                        String cellValue=df.format(hssfCell.getNumericCellValue());
                        cellTempList.add(cellValue.toString());

                        }
                         else if(hssfCell.getCellType() == hssfCell.CELL_TYPE_STRING)
                         {
                         cellTempList.add(hssfCell.toString());
                     }

                    }

                    cellDataList.add(cellTempList);
                } else {
                    headerRow = false;
                }
            }
        } catch (Exception e) {

            e.printStackTrace();
            logger.error("Other Exception : " + e.getStackTrace());
        }
        System.out.println(cellDataList); 
        return cellDataList;
    }
    }

输出:[[85366667777, PLATINUM], [85367890000, GOLD], [85362524232, SILVER], [SILVER], [85362522436, DIAMOND]]

为什么当相应的单元格中没有值时,它不会打印[null,Silver][0,SILVER]

3 个答案:

答案 0 :(得分:1)

if(hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC){
    DecimalFormat df = new DecimalFormat("#");
    String cellValue=df.format(hssfCell.getNumericCellValue());
    cellTempList.add(cellValue.toString());
} else if(hssfCell.getCellType() == hssfCell.CELL_TYPE_STRING){
    cellTempList.add(hssfCell.toString());
} else {
    cellTempList.add(null);  // or cellTempList.add("0");
}

您的空单元格既不是字符串也不是数字,因此不会向您的数组添加任何内容。尝试检查CELL_TYPE_BLANK。

答案 1 :(得分:1)

您正在使用Iterator来迭代单元格。但如果一个单元格从未有过值,则可能不存在。在这种情况下,只有一个单元可以迭代。

如果要维护迭代器,则需要测试要迭代的单元格的列索引。如果没有0列单元格,那么您可以先处理自己的null0来处理这种情况。

但是删除迭代器并使用getCell method that takes a MissingCellPolicy直接访问列0和1的单元格听起来更容易。

Cell zero = hssfRow.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
Cell one  = hssfRow.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);

如果不存在,则会创建一个空白Cell。然后,您可以测试单元格是否具有CELL_TYPE_BLANK单元格类型并相应地执行操作。

答案 2 :(得分:1)

您应该使用缺少单元格策略。在某些情况下,在迭代时,您需要完全控制缺失或空白单元格的处理方式,并且您需要确保访问每个单元格而不仅仅是文件中定义的单元格。在你提到的情况下,你应该获取一行的第一个和最后一个列信息,然后调用getCell(int,MissingCellPolicy)来获取单元格。使用MissingCellPolicy来控制处理空白或空单元格的方式。

举例说明行

enter image description here

这里的A2是空的,在你的情况下是空白的。在这里,您需要将单元格值指定为Cell cell = row.getCell(int arg0, MissingCellPolicy arg1): Cell-Row

有三种类型的MissingCellPolicy为

CREATE_NULL_AS_BLANKCREATE_BLANK_AS_NULLRETURN_NULL_AND_BLANK

按以下方式使用

for (int i = 0; i<3 ;i++){
    for(int j=0 ; j<2; j++){
        Row row = sheet1.getRow(i);
        Cell cell = row.getCell(j, Row.CREATE_NULL_AS_BLANK);
//              Cell cell = row.getCell(j, Row.RETURN_NULL_AND_BLANK);
//              if(row.getCell(j)==null){
//                  System.out.print("Null ");
//              }else
            System.out.print(cell.toString()+" - ");
    }
    System.out.println();
}

此处每当遇到任何具有空值的单元格时,Row.CREATE_NULL_AS_BLANK都会返回带有BLANK的单元格值。而不是抛出NullPointerException。在这种情况下,输出将是

A1 - B1 - 
 - B2 - 
A3 - B3 - 

如果使用Row.RETURN_NULL_AND_BLANK,则在未定义任何单元格的情况下,它将返回Null。所以你需要创建一个空检查(如代码中所述)。在这种情况下,输出将是

 A1 - B1 - 
 Null B2 - 
 A3 - B3 -