Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用break或continue语句的情况下对所有非空行进行迭代?_Java_Apache_Apache Poi - Fatal编程技术网

Java 如何在不使用break或continue语句的情况下对所有非空行进行迭代?

Java 如何在不使用break或continue语句的情况下对所有非空行进行迭代?,java,apache,apache-poi,Java,Apache,Apache Poi,我想从Excel文件中获取数据。我使用while循环、迭代器和hasNext()方法对所有行进行遍历。 我的问题是:有时在包含数据的行之后会出现空行(可能是单元格类型字符串和值为“”或null),我不想重复这些行。 所以我添加了方法isCellEmpty(): 并在主方法中的while loop中加上星号: while (rowIterator.hasNext()) { row = rowIterator.next(); if (isCellEmpty(row.getCell(2

我想从Excel文件中获取数据。我使用
while
循环、迭代器和
hasNext()
方法对所有行进行遍历。 我的问题是:有时在包含数据的行之后会出现空行(可能是单元格类型字符串和值为“”或
null
),我不想重复这些行。 所以我添加了方法
isCellEmpty()

并在主方法中的while loop中加上星号:

while (rowIterator.hasNext()) {
    row = rowIterator.next();
    if (isCellEmpty(row.getCell(2))) {
        break;
    }
    // some code ...
}

但现在我有一个中断声明。如何在不使用break或continue的情况下对所有非空行进行迭代?现在(有了中断),我的算法正常工作了——我得到了我需要的数据。我只是想知道是否有可能在编写代码时不使用
中断
继续

不确定我的问题是否正确,你在找这样的东西吗

Row row;
while (rowIterator.hasNext() 
          && !isCellEmpty((row = rowIterator.next()).getCell(2))) {
    // do something with row
}

这将处理所有行,直到找到一个空单元格并结束循环。

不确定我的问题是否正确,您是否在寻找类似的内容

Row row;
while (rowIterator.hasNext() 
          && !isCellEmpty((row = rowIterator.next()).getCell(2))) {
    // do something with row
}

这将处理所有行,直到找到一个空单元格并结束循环。

如果您希望在循环期间保持
,并避免中断,最简单的方法可能是状态布尔值,例如

boolean inData = true;
while (rowIterator.hasNext() && inData) {
   row = rowIterator.next();
   if (row == null || isCellEmpty(row.getCell(2))) {
      inData = false;
   } else {
      // Use the row
   }
}
否则,我建议,你可以采取其他方法,可能效果更好


哦,别忘了行可以是空的,所以在你尝试获取单元格之前,你需要检查一下,如果你想在循环时保持你的
,避免中断,最简单的可能是一个状态布尔值,例如

boolean inData = true;
while (rowIterator.hasNext() && inData) {
   row = rowIterator.next();
   if (row == null || isCellEmpty(row.getCell(2))) {
      inData = false;
   } else {
      // Use the row
   }
}
否则,我建议,你可以采取其他方法,可能效果更好


哦,别忘了行可以是
null
,所以在尝试获取单元格之前,您需要检查POI是否没有要在非空行上迭代的元素或功能

POI的开发人员发布了关于这个主题的信息。签出部分迭代行和单元格迭代单元格,控制缺失/空白单元格

请注意,POI与迭代器一起工作,因此我将使用ApacheCommons集合中的循环,而不是循环,由于某些可传递的依赖关系,这些集合可能在类路径中很常见

为了使代码更清晰易读,解决方案与

import org.apache.commons.collections.Predicate;
公共类ValidRowPredicate实现谓词{
@凌驾
公共布尔求值(对象){
行=(行)对象;
Cell Cell=row.getCell(2);
if(cell==null | | cell.getCellType()==cell.cell_TYPE_BLANK){
返回false;
}else if(cell.getCellType()==cell.cell\u TYPE\u字符串&&
cell.getStringCellValue().isEmpty()){
返回false;
}
返回true;
}
}
消费者看起来像

迭代器raweiterator=roweiterator;
迭代器cleanIterator=IteratorUtils.FilterEditer(rawIterator,新的ValidRowPredicate());
while(cleanIterator.hasNext()){
Row=cleanIterator.next();
//一些代码
} 
你们可能会相信,我们正在重复这本书2次,但事实并非如此

第一个循环确实如此,但进一步的迭代将覆盖有效行的子集。此外,我们还对空单元格#2进行了验证。 我们还得到了一个可靠的迭代器,它只有有效的和可计算的条目

谓词提供了很多可能性。类似于通过继承或组合链接谓词

它的代价实际上是在主迭代器上的第一个循环。但结果是值得的


IteratorUtils作为CollectionUtils是非常好的utils,我们经常使用它,但是我们忽略了它。

看起来POI没有可在非空行上迭代的元素或特性

POI的开发人员发布了关于这个主题的信息。签出部分迭代行和单元格迭代单元格,控制缺失/空白单元格

请注意,POI与迭代器一起工作,因此我将使用ApacheCommons集合中的循环,而不是循环,由于某些可传递的依赖关系,这些集合可能在类路径中很常见

为了使代码更清晰易读,解决方案与

import org.apache.commons.collections.Predicate;
公共类ValidRowPredicate实现谓词{
@凌驾
公共布尔求值(对象){
行=(行)对象;
Cell Cell=row.getCell(2);
if(cell==null | | cell.getCellType()==cell.cell_TYPE_BLANK){
返回false;
}else if(cell.getCellType()==cell.cell\u TYPE\u字符串&&
cell.getStringCellValue().isEmpty()){
返回false;
}
返回true;
}
}
消费者看起来像

迭代器raweiterator=roweiterator;
迭代器cleanIterator=IteratorUtils.FilterEditer(rawIterator,新的ValidRowPredicate());
while(cleanIterator.hasNext()){
Row=cleanIterator.next();
//一些代码
} 
你们可能会相信,我们正在重复这本书2次,但事实并非如此

第一个循环确实如此,但进一步的迭代将覆盖有效行的子集。此外,我们还对空单元格#2进行了验证。 我们还得到了一个可靠的迭代器,它只有有效的和可计算的条目

谓词提供了很多可能性。类似于通过继承或组合链接谓词

它的代价实际上是在主迭代器上的第一个循环。但结果是值得的

IteratorUtils作为CollectionUtils是非常好的Util,我们经常在类路径中使用它,但我们忽略了它

更改函数
isCellEmpty()
使用
开关
boolean hasCellData= true;
while (rowIterator.hasNext() && hasCellData) {
   row = rowIterator.next();  //iterate through each rows.
   if (row == null || isCellEmpty(row.getCell(2))) {
      hasData = false;
   } else {
      //if row contains data then do your stuffs.
   }
}
boolean shouldContinue = true;
while (shouldContinue && rowIterator.hasNext()) {
  row = rowIterator.next();
  if (isCellEmpty(...)) {
    shouldContinue = false;
  }
}
while (rowIterator.hasNext()) {
  row = rowIterator.next();
  if (isCellEmpty(...)) {
    while (rowIterator.hasNext()) rowIterator.next();
  }
}
while (rowIterator.hasNext()) {
    row = rowIterator.next();
    if (!isCellEmpty(row.getCell(2))) {
        // some code ...
    }
}
for(boolean shouldContinue = true; shouldContinue && rowIterator.hasNext(); ) {
   if (!isCellEmpty(row.getCell(2))) {
        // some code ...
    } else {
        shouldContinue = false;
    }
}
import org.apache.commons.collections4.Predicate;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;

public class ValidRowPredicate implements Predicate<Row> {

    @Override
    public boolean evaluate(Row row) {
        Cell cell = row.getCell(2);
        if (cell == null || cell.getCellType() == CellType.BLANK) {
            return false;
        } else if (cell.getCellType() == CellType.STRING &&
                cell.getStringCellValue().isEmpty()) {
            return false;
        }
        return true;
    }
}