工具: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() 这个方法考虑还是很周全的
以后遍历的时候直接这么写
for (int i = row.getFirstCellNum() ; i < row.getLastCellNum(); i++) {
System.out.println(row.getCell(i).getStringCellValue());
}
这样可以去除所有你要的有数据的值
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{
           “空行”            
        } 

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

第十八篇:java操作Excel要处理和分辨的几个概念的更多相关文章

  1. python学习笔记(十八)python操作excel

    python操作excel需要安装通过pip安装xlwt, xlrd这两个模块: pip install xlwt pip insall xlrd 操作excel ,写入excel: import x ...

  2. 《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)

    1.简介 今天继续操作Excle,小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle,今天不介绍了,有两种就够用了,其实一种就够用了,今天主要是来介绍如何使用不同的数据类型读取Excel文件 ...

  3. 《手把手教你》系列技巧篇(二十八)-java+ selenium自动化测试-处理模态对话框弹窗(详解教程)

    1.简介 在前边的文章中窗口句柄切换宏哥介绍了switchTo方法,这篇继续介绍switchTo中关于处理alert弹窗的问题.很多时候,我们进入一个网站,就会弹窗一个alert框,有些我们直接关闭, ...

  4. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  5. 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)

    1.简介 webdriver有三种判断元素状态的方法,分别是isEnabled,isSelected 和 isDisplayed,其中isSelected在前面的内容中已经简单的介绍了,isSelec ...

  6. Python之路【第十八篇】:Web框架们

    Python之路[第十八篇]:Web框架们   Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...

  7. Egret入门学习日记 --- 第十八篇(书中 8.5~8.7 节 内容)

    第十八篇(书中 8.5~8.7 节 内容) 其实语法篇,我感觉没必要写录入到日记里. 我也犹豫了好久,到底要不要录入. 这样,我先读一遍语法篇的所有内容,我觉得值得留下的,我就录入日记里. 不然像昨天 ...

  8. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

  9. Java 操作 EXCEL

    今天帮朋友写了一段用来处理EXCEL内容的程序,在这里记录下自己的学习过程.主要是对EXCEL表格中的内容做分类和统计,使用计算机来做这种重复的机械性地工作再好不过了.首先,我们需要下载一个java操 ...

随机推荐

  1. 一个简易h5涉及的ps技巧

    事实证明,很长时间不做,是会忘掉的呀,的呀,呀,啊~ 1.合并图层 CTRL+E合并多个图层 2.切片 3.导出 文件-------导出------存储为web所用格式-------->> ...

  2. IconFont 图标的3种引用方式

    第一步:进入阿里巴巴矢量图网站:http://www.iconfont.cn/   阿里巴巴矢量图 第二步:搜索你分类的关键字---然后加入购物车,下载到本地,然后解压,会将合并后的字体文件及自动生成 ...

  3. flutter 超出俩行点点点

    Text( '${listItem["title"]}', overflow: TextOverflow.ellipsis, maxLines: 2, style: TextSty ...

  4. The packaging for this project did not assign a file to the build artifact

    当进行mvn install时,遇到以下错误 The packaging for this project did not assign a file to the build artifact 在网 ...

  5. 20130317 如何批量把文件名称写入txt文档

    1.如何批量把文件名称写入txt文档 COMMAND 窗口例:存放图片的文件夹是 D:\123\就用下面一名命令就OKdir d:\123\*.jpg /b > A.TXT 那么你所以JPG格式 ...

  6. C#面向对象通信

    面向对象通信编程: 看起来像是调用本地的函数,就得到了结果: 实际上参数是传递到了远程机器上了,而函数也是在远程机器上运行的.

  7. 面试总结【css篇】- 盒子模型

    题目:谈谈你对CSS盒模型的认识 (1) 基本概念:标准模型+IE模型   (2) 标准模型和IE模型区别 标准模型和IE模型的区别,就是宽度和高度的计算方式不同. 标准模型的宽度指的就是conten ...

  8. Java多线程中提到的原子性和可见性、有序性

    1.原子性(Atomicity)   原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并发的情况下,就不会出 ...

  9. neo4j数据库迁移---------Neo4j数据库导入导出的方法

    Neo4j数据进行备份.还原.迁移的操作时,首先要关闭neo4j; /usr/share/neo4j/bin neo4j stop 如果出现 Neo4j not running 出现这种情况, Neo ...

  10. 2018-10-29-微软-Tech-Summit-技术暨生态大会课程-·-基于-Roslyn-打造高性能预编译框架...

    title author date CreateTime categories 微软 Tech Summit 技术暨生态大会课程 · 基于 Roslyn 打造高性能预编译框架 lindexi 2018 ...