POI读取Excel如何判断行是不是为空

dexwu 2011-06-06 08:14:42
详细代码:

InputStream is= new FileInputStream(patch);
HSSFWorkbook hsfw=new HSSFWorkbook(is);
for(int i=0;i<hsfw.getNumberOfSheets();i++){
HSSFSheet hsfs=hsfw.getSheetAt(i);
for(int r=1;r<=hsfs.getLastRowNum();r++){
HSSFRow hsfr=hsfs.getRow(r);
if(null==hsfr){
break;
}
Customer customer=new Customer();
String[] cellvalue=new String[hsfr.getLastCellNum()];
for(int c=0;c<hsfr.getLastCellNum();c++){
HSSFCell hsfc=hsfr.getCell(c);
switch (hsfc.getCellType()) {
case Cell.CELL_TYPE_STRING:
cellvalue[c]=hsfc.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
cellvalue[c]=String.valueOf((int)hsfc.getNumericCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN:
cellvalue[c]=String.valueOf(hsfc.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
cellvalue[c]=String.valueOf(hsfc.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK:
cellvalue[c]="";
break;
default:
break;
}

}



Excel表里有16行有5行是没数据的
但是我在读Excel表的时候它连没有数据的行也读进来了

请问怎样判断行是不是为空啊?大虾们帮帮忙吧
...全文
23162 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovaxixi 2011-11-09
  • 打赏
  • 举报
回复
Excel解析的时候 如果是你原来有内容之后删除了 那row对象就不是空的 这时就需要用cell来判断是否为空了。
cell!=null && ("")!=cell.toString()
这样来判断 这里楼主可以debug看一下 反正我自己是这么判断的
用cell.equals("")判断不出来del键删除后的单元格是否为空。

反正Excel解析时挺烦的 我是试了好久才试出来的
reui 2011-11-08
  • 打赏
  • 举报
回复
我之前的处理方法是,将row里面的所有列都循环一次,看看里面有多少是空的,然后用一个计数器去记录,超过多少个就判断这行是空的行,即已到达最底的一行.虽然方法是笨了点,但是还是比较实用的
bshyzj 2011-08-19
  • 打赏
  • 举报
回复
我是这么解决的,但不是很完美的解决方法

for (int h = 1; h < rows; h++) {
rowCount = h+1;
String values = "";
HSSFRow row = sheet.getRow(h);
if (row == null) {
rows++;
continue;
}

for (int i = 0; i < cells; i++) {
sydbfhwj 2011-08-19
  • 打赏
  • 举报
回复
虽然你用Del来删除数据,但是实际上对象都还在,并不是真正意义上的空行。
如果是真正意义上的空行,那么这样看下有没有效果:
if (row == null || row.isEmpty())
return;
淡定的峰哥 2011-08-19
  • 打赏
  • 举报
回复
我想excel的中某些列的数据应该是必输的吧
如果某一行中,必输的字段没有输是不是就可以忽略这一行呢
dexwu 2011-06-07
  • 打赏
  • 举报
回复
楼上,这个我知道,但是现在是在那一行上以前是有值的,不过后来给我DEL掉了,用poi读取时,poi读到这行空值行,我想判断它是否整行为空!我也知道这个只要搞一下Excel表就可以解决的,但是我想用代码实现它!
wula0010 2011-06-07
  • 打赏
  • 举报
回复
excel行的某个单元格如果是空格,判断也是不为空的,...........
dexwu 2011-06-07
  • 打赏
  • 举报
回复
这个我试过了,但是还是不行!
我的Excel表里原本有16行的,给我用DEL掉了,然后用poi读取得时候,poi连那个是空值的行也算上!!!
uastation 2011-06-07
  • 打赏
  • 举报
回复
友情提醒下,判断为空一般像这样写就OK的了:
if(hsfr ==null){
break;
}

楼主,写代码的时候应该先写变量在前~
dexwu 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lxbccsu 的回复:]
如果row的cells中只有空格字符而没有其他的字符,poi认为此row是有数据的,要排除这种情况,可以自己写个方法:

Java code

public static boolean isBlankRow(HSSFRow row){
if(row == null) return true;
boolean result = true;
……
[/Quote]
Exce表的开头行是标明要输入什么数据的所以从1开始!而其他的提醒谢谢你!
dexwu 2011-06-07
  • 打赏
  • 举报
回复
空的CELL不是不处理,这个数据是插入数据库的,所以有些是可以未空的,而且输入Excel表数据不是我输的,是客户输入的,如果用户不是对Excel很熟,等一下出现空行看上去没数据,其实空行上的CELL都市空值,poi也会读的,所以我想解决这个BUG
bufeng711 2011-06-07
  • 打赏
  • 举报
回复
循环空行 有什么关系么,CELL 为NULL的时候不处理 不就行了么
lxbccsu 2011-06-07
  • 打赏
  • 举报
回复
如果row的cells中只有空格字符而没有其他的字符,poi认为此row是有数据的,要排除这种情况,可以自己写个方法:

public static boolean isBlankRow(HSSFRow row){
if(row == null) return true;
boolean result = true;
for(int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++){
HSSFCell cell = row.getCell(i, HSSFRow.RETURN_BLANK_AS_NULL);
String value = "";
if(cell != null){
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
value = String.valueOf((int) cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN:
value = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
value = String.valueOf(cell.getCellFormula());
break;
//case Cell.CELL_TYPE_BLANK:
// break;
default:
break;
}

if(!value.trim().equals("")){
result = false;
break;
}
}
}

return result;
}


原来的代码也是有问题的:

for (int r = 0; r <= hsfs.getLastRowNum(); r++) {//这里的基数应该是0,最好改成hsfs.getFirstRowNum()
...
if (null == hsfr || isBlankRow(hsfr)) {//这里判断为空或只有空格的row忽略
continue;
}
...
if(hsfc == null) continue;//cell也应该判断null
switch (hsfc.getCellType()) {
...

wula0010 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dexwu 的回复:]
楼上,这个我知道,但是现在是在那一行上以前是有值的,不过后来给我DEL掉了,用poi读取时,poi读到这行空值行,我想判断它是否整行为空!我也知道这个只要搞一下Excel表就可以解决的,但是我想用代码实现它!
[/Quote]
如果你是选择这个行,然后按del键del的,那么这样判断就是不为空,如果你是选择整个行,然后,鼠标右键-删除,那么这行就是空了,所以删除不是一种方式,.......

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧