Java 利用poi读取excel行数,列数

1.读取总行数和总列数

读取 行总数时,会调用getLastRowNum(),

读取列总数时,会调用getLastCellNum(),但是这两个方法的返回值有点区别。

sheet.getLastRowNum(); //返回最后一行的索引,即 比行总数小1

 

row.getLastCellNum(); //返回的是最后一列的列数,即 等于总列数
  • getLastRowNum():

如果sheet中一行数据都没有则返回-1,只有第一行有数据则返回0,最后有数据的行是第N行 则返回N-1

  • getLastCellNum():

如果row中一列数据都没有则返回-1,只有第一行有数据则返回1,最后有数据的列是第N行 则返回N

---------------------------

2.读取第一列有数据的单元格索引

读真实又数据的第几个单元格索引:

row.getFirstCellNum();//获取真实有数据的第1个单元格的索引。它是在行的基础上使用的

比如:

 

sheet.getRow(1).getFirstCellNum();//结果是3

 3.具体代码案例和说明

 

工具:org.apache.poi
Excel格式:.xls(03,存储量小些);.xlsx(07以上) 
首先明确这点:给你一个装满数据的Excel,并不能保证每行都有数据,每一行并不能保证每个单元格都有数据 
所以要理解以下几个方法:

1、一个Excel是一个workbook对象(工作薄),一个workbook可能包含好几个sheet(工作表) ,通常的做法是一个wb里面就放一个sheet,便于操作,所以通常这样来取第一个   Sheet sheet = wb.getSheetAt(0);
接下来,为了测试我新建一个test.xls,里面放些这样的数据
共12行,其中第11行是空的,共8列,其中第六列是空的,第一行第7和8个单元格都有数据,这里都是眼见的第多少行第多少列

2、sheet 

System.out.println(sheet.getFirstRowNum());                             //0,第一行的逻辑索引号
System.out.println(sheet.getLastRowNum());                             //11,最后一行的逻辑索引号
System.out.println(sheet.getPhysicalNumberOfRows());            //11实际有数据的有多少行,所以是去掉了空行
这是sheet的几个方法,看出来前两个方法得到的都是逻辑行号,和数据结构的下标索引号一样的道理
第三个方法,得出的是实际的有数据的行数,过滤掉了第11行这个空行,所以当你读取Excel时遍历的范围最好不要用这个作为上界值,举一个极端点的例子吧,假设12行有10行是空的,i< sheet.getPhysicalNumberOfRows()+1也即是i<3,最终只会读到前面3行,因此用i<sheet.getLastRowNum()+1 

3、row

我们拿第一行作为例子Row row = sheet.getRow(0);
其中第6列是空的,第7.8个单元格都有数据
System.out.println(row.getPhysicalNumberOfCells());         //7   一样的,过滤掉了空的单元格,得出的是有数据的单元格数
System.out.println(row.getFirstCellNum());//0
System.out.println(row.getLastCellNum());//8      
重点来了,对于每一行来说,遍历每一行的单元格的时候要注意
row.getFirstCellNum()是一个不确定的数字,不是代表第一个cell的逻辑号是0(通常会这样认为),他是指某一行中第一个不为空格的单元格的逻辑号(实际列号-1),同理,row.getLastCellNum()指最后一个不为空格的单元格的列号,这样比较拗口
看如下例子:
第一行的数据                          row.getFirstCellNum()        row.getLastCellNum()     
1、2、3、4、5                                  0                                                   5
1、2、3、4、5    7、8                      0                                                   8(第六个空格)
、2、3、4、5                                   1                                                   5(第一个是空格)

遍历行的时候大家喜欢这么写,假设第一个单元格就是空的,那么直接就报NullPointer错误了

for (int i = 0; i < row.getLastCellNum(); i++) {
   System.out.println(row.getCell(i).getStringCellValue());
 

所以,poi给出 row.getFirstCellNum() 这个方法考虑还是很周全的
以后遍历的时候直接这么写:

if(row.getCell(0)==null){
   System.out.println("第一个单元格为空!"); 
  }

 

这样可以去除所有你要的有数据的值:

if(row.getCell(0)==null){
   System.out.println("第一个单元格为空!"); 
  }

 


执行下这个,可以看到空指针错误是在调用getStringCellValue())发生的,因为取到的单元格对象为null
所以为了保证将Excel所有范围内的单元格全部取到,最好是这么干。
 总是从第0个索引下标开始:

for(int i=0;i<sheet.getLastRowNum()+1;i++ ){
    Row row = sheet.getRow(i);
    if ( row != null )  {
        for(int j = 0; j< row.getLastCellNum(); j++){
             Cell cell = row.getCell(j);   
              if ( cell != null ){
                    cell.getValue()…………………                                     
              }else{
                     “空单元格”
                }
        }
    } else{
           “空行”            
        } 
} 

 

也不要用迭代器,迭代器会直接忽略空格和空行,除非你真的不需要记录下空的数据  

参考:https://i.cnblogs.com/posts?cateId=2320142

posted @ 2023-08-04 23:18  苹果芒  阅读(2917)  评论(0编辑  收藏  举报