如何在迭代器跳过null的行时获取具有实际索引的行

时间:2016-01-06 02:13:50

标签: java excel apache-poi

我正在使用apache poi来解析一组excel文件。他们都看起来像这样。

enter image description here

我的代码应该找到ID行,然后找到它前面的两行,以便提取该行的第一个单元格的内容。

代码如下:

            Iterator<Row> rowIterator = sheet.iterator();
            int rowIndex = 0;
            while (rowIterator.hasNext())
            {
                row = rowIterator.next();
                rowIndex ++;
                cell = row.getCell(0);
                if (cell != null) {
                    if (rowIndex > 2) {
                      Row protocolRow = sheet.getRow(rowIndex - 3);
                      String cellStr = protocolRow.getCell(0).getStringValue();
                    }
                }
            }

虽然两行的相对位置是固定的,但方法getRow(index)中的索引是电子表格的绝对行索引。电子表格中有很多空行。其中一些可能是空的,其他可能不是。由于行迭代器会跳过null,因此rowIndex不是绝对索引的计数器。 Iterator也无法回去获取前一行。获取ID行之前两行的行的绝对行索引的最佳行是什么?

2 个答案:

答案 0 :(得分:1)

对于行和列,Excel电子表格可以是稀疏的。

在基础数据中,按顺序列出行,每行的行号隐式递增1,但是行可以指定其行号,从而跳过多个(空白)行。

示例:

row
row
row num=5
row

此数据定义了行1,2,5和6。

同样的概念适用于一行的单元格。

因此,如果对某行进行了任何操作,即使您清除了所有值和格式,该行仍然存在。如果没有为行执行任何操作,则可以在基础数据中跳过

那么,实际存在空白行还是跳过了?要看。您应该编写逻辑来处理这两种方式。这样你就不在乎了。

答案 1 :(得分:1)

正如cunningly titled "Iterating over Rows and Cells" section of the Apache POI documentation(谁可能已经猜到了?)中所解释的那样,您应该使用以下代码显式迭代行:

// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());

for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
   Row r = sheet.getRow(rowNum);
   if (r == null) {
      // This whole row is empty
      // Handle it as needed
      continue;
   }

   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
      }
   }
}

否则,请问Row what row number it is!迭代如:

for (Sheet sheet : wb ) {
    for (Row row : sheet) {
       int rowIndex = row.getRowNum();
       // Handle cells here
    }
}