Java 如何在不使用break或continue语句的情况下对所有非空行进行迭代?
我想从Excel文件中获取数据。我使用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
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;
}
}