0

我有一个从 java 程序中读取 excel 表的程序。

我正在迭代单元格,如下所示:

Iterator cells = row.cellIterator();
String temp;
StringBuilder sb;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

while (cells.hasNext()) {
Cell cell = (Cell) cells.next();
temp = null;

    switch (cell.getCellType()) {
         case Cell.CELL_TYPE_STRING:
         temp = cell.getRichStringCellValue().getString();
         break;

    case Cell.CELL_TYPE_NUMERIC:

    if (DateUtil.isCellDateFormatted(cell)) {
        temp = sdf.format(cell.getDateCellValue());
       } else {
             temp = df.format(new BigDecimal(cell.getNumericCellValue()));
       }
          break;
          default:
     }
    if (temp == null || temp.equalsIgnoreCase("null")) {
        sb.append("").append(";");
    } else {
        sb.append(temp).append(";");
    }
 }

如所见,我正在尝试创建一个字符串构建器,其中包含以分号分隔的 excel 行中的值。

问题是,如果列值为空,我希望它在字符串生成器中作为一个空值,并带有两个连续的分号。

然而,调用

单元格 = (Cell) cells.next();

只是忽略空单元格并跳转到下一个非空单元格。

所以这条线

if (temp == null || temp.equalsIgnoreCase("null"))

从来没有遇到过。

如何在迭代器中处理空列值?

4

3 回答 3

3

这实际上是这个问题的重复,所以我对这个问题的回答基本上也完全适用于你。

单元迭代器仅迭代文件中定义的单元。如果该单元格从未在 Excel 中使用过,它可能不会出现在文件中(Excel 并不总是一致的......),所以 POI 不会看到它

如果要确保点击每个单元格,则应改为按索引查找,并检查空单元格(表明该单元格从未在文件中存在),或设置 aMissingCellPolicy以控制您希望空单元格和空白单元格的方式处理过的

所以,如果你真的想得到每个单元格,请执行以下操作:

Row r = sheet.getRow(myRowNum);
int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);

for (int cn=0; cn<lastColumn; cn++) {
   Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
   if (c == null) {
      // The spreadsheet is empty in this cell
   } else {
      // Do something useful with the cell's contents
   }
}
于 2012-11-01T12:10:09.180 回答
0

你可以这样做

int previous=0;
while(cell.hasNext())
{
    Cell cell = (Cell) cells.next();
    int current=cell.getColumnIndex();
    int numberofsemicolons=previous-current;
    for(numberofsemicolons)
    {
    sb.append("").append(";");
    }
    previous=current;
}

或者你可以做

int numberofcells=row.getFirstCellNum()-row.getLastCellNum();
for(i=0;i<=numberofcells;i++)
{
     Cell cell = (Cell) cells.next();
     int current=cell.getColumnIndex();
     while(i<current)
     {
        sb.append("").append(";");
        i++
     }
}
于 2012-11-01T06:21:50.257 回答
0

@Gagravarr 发布的答案对我来说非常有效,但 MissingCellPolicy 现在是一个枚举,所以在获取单元格值而不是使用

Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL); 

我用过

Cell c =r.getCell(cn,Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);  
于 2017-08-03T18:17:30.410 回答