工具: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{
           “空行”            
        } 

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

转载于:https://www.cnblogs.com/yb38156/p/9821959.html

第十八篇:java操作Excel要处理和分辨的几个概念相关推荐

  1. java监听数据库操作_第十六篇——JDBC操作数据库之监听器

    JavaWeb应用中,很多的地方都和session有关.因此session相关的事件监听器,在日常工作中非常有用. 有时候我们需要统计当前在线的人数和访问人数总数,此时就可以使用监听器技术来很简单的实 ...

  2. 二十八、Java中的Int和Integer的区别

    @Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  3. JAVA操作Excel时文字自适应单元格的宽度设置方法

    使用JAVA操作Excel通常都使用JXL,方法很简单网上也有很多的教程,然后往往一些细节性的问题却导致我们这些Programmer苦恼不已.这两天帮一个朋友做一个Excel表格自动生成的小软件,就遇 ...

  4. Java操作Excel之Excel文件的下载

    1.有的时候在Web应用会有下载Excel的需求,现分享下后台实现下载Excel文件的代码 @RequestMapping(value = "/exportExcel", meth ...

  5. Java操作Excel并导出

    Java导出Excel表格 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Java导出Excel表格 前言 一.企业excel项目导出演示 二.使用步骤 1.引入Mave ...

  6. Java操作Excel之POI:java读写excel文件以及打印设置

    Java操作Excel之POI:java读写excel文件以及打印设置 POI的jar包下载地址:http://poi.apache.org/download.html 注意:项目中导入poi 4.0 ...

  7. java excel读取操作,Java 操作 Excel (读取Excel2003 2007,Poi兑现)

    Java 操作 Excel (读取Excel2003 2007,Poi实现) 一. Apache POI 简介( http://poi.apache.org/) 使用Java程序读写Microsoft ...

  8. java excel类库,jExcelApi Java 操作 Excel 的类库

    jExcelApi Java 操作 Excel 的类库 Java Excel API(JXL)是一个成熟,开源的用来操作Excel电子表格的Java类库,支持读取,修改,写入等操作.这个项目基于GPL ...

  9. java excel api 下载文件_Java-Excel Java操作Excel POI(Jakarta POI API) - 下载 - 搜珍网

    Java操作Excel/Jakarta POI API/data/Jakarta POI API.doc Java操作Excel/Jakarta POI API/jar/poi-3.0.2-FINAL ...

最新文章

  1. python输入列表方法_Python用input输入列表的方法
  2. java的hashmap排序_Java面试题:如何对HashMap按键值排序
  3. 使用libjpeg.framework压缩UIImage
  4. 子弹射中敌人播放爆炸并销毁的动画效果
  5. 改进架构,实现动态数据源,减少java维护
  6. python分子化学模拟_python简单实现gillespie模拟
  7. ShowDoc的搭建
  8. ubuntu卸载nvidia显卡驱动
  9. 多线程小结-----线程参数和 Invoke 机制
  10. windowForm资料
  11. cmd链接php mysql数据库_php连接mysql数据库_cmd连接mysql数据库 - MySQL最新手册教程 - php中文网手册...
  12. 敏感词库 包含中英文
  13. Win10/Win7下添加Protel 99 SE库文件
  14. 时空轨迹数据挖掘综述
  15. 计算机专业认识实习目的,计算机专业实习目的及意义
  16. 去中心化云图床搭建建议:Cyberduck+4everland bucket
  17. leetcode695岛屿的最大面积
  18. 将一个数组中重复的元素去除,并且返回一个新数组
  19. ie11 Object doesn't support property or method 'attachEvent'
  20. 惹某第8周周记(习题+感悟)

热门文章

  1. LeetCode 86. 分隔链表 中等难度
  2. 47.内存连续分配管理方式有哪几种?
  3. C++编程语言之标准化
  4. Google AI 碾压集成电路设计专家,ASIC智能设计时代来了!
  5. 担心被机器人抢饭碗?亚马逊教 10 万员工这样保住工作
  6. 前谷歌工程师:如何看待程序员普遍缺乏数据结构和算法知识?
  7. 用996打败员工,用“奋斗”替代生活
  8. 软件和硬件的关系以及软件调动硬件的工作原理
  9. ppt设置外观样式_PPT怎么做?如何做出好看的PPT?
  10. Android Handler消息传递机制