在POI中,我们可以通过Workbook, Sheet, Row, Cell 对象分别对应Excel文件、工作表、行、单元格。

在POI的使用中,我遇到了几个非常诡异、捉摸不透的问题,现在记录下来。

1、关于Sheet、Row、Cell的下标

一般情况下,我们读取一个Excel表格是这样的:

Workbook workbook = WorkbookFactory.create(file);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);

在POI的API中,Sheet(工作表)、Row(行)、Cell(单元格)都是从0开始的。

2、关于getPhysical*()、getLast*Num()方法

sheet.getPhysicalNumberOfRows();     //获取此工作表中有效定义的行

row.getPhysicalNumberOfCells();  //获取此行中有效的单元格数

sheet.getLastRowNum();  //获取最后一行非NULL行的行下标

row.getLastCellNum();  //获取最后一个非NULL单元格的列下标,并加上1(所以虽然列是从0开始的,但是这里得到的值是下标+1,需要注意

getPhysical*()方法是指获取有效定义的行数或列数,算的是一个数目。这里的有效定义是指只要你曾经对此行或此单元格进行过操作,无论是格式上的操作还是数据上的操作,那么这以行或列就是有效的。

我修改A2单元格的单元格格式为文本,那么A2单元格对于POI来说就是已定义的单元格,无论之后对A2做什么操作都不会改变这个事实。又如我对A2单元格赋值,此时A2单元格就是已定义的单元格,即使我之后清除A2单元格的值,但A2还是已定义的单元格。

所以getPhysical*()方法可能会得到的行或单元格可能没有数据。

而getLast*Num()方法是获取最后一个非NULL的行(单元格)下标,算的是下标。它前面有可能行或单元格有可能是NULL的,也就是不存在的。如:

NULL 1 NULL 2 3 NULL NULL    那么getLastCellNum 获取到的值就是5(列从1算起)

例如:下图表是一个4*4的Excel表格数据

1  ""  3  4

null null null 3

null  null null null

3 null 3 null

那么sheet.getPhysicalNumberOfRows() = 3,因为虽然有4行,但是第3行全部是NULL,因此这一行是未定义的,所以只有3行。

sheet.getLastRowNum() = 3,最后以列非NULL行的行下标是第4行,即下标为3的行。

row.getPhysicalNumberOfCells()    第1行,有效单元格数是4。第2行中,只有第4个单元格是有效的,因此有效单元格数是1。第3行有效单元格是0,第4行有效单元格数是2。

row.getLastCellNum()    第1行中,值为4(下标为3,加1后值为4)。第2行,值为4。第3行,值为-1。第4行,值为3。(第3行没有任何有效的单元格,所以返回-1)

POI 操作Excel疑难点笔记的更多相关文章

  1. POI操作Excel

    POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...

  2. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  3. 自己的包poi操作Excel工具

    在前面的文章<使用poi读写Excel>中分享了一下poi操作Excel的简单演示样例.这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完毕的功能是:读取Excel.汇总E ...

  4. Java POI操作Excel注意点

    excel的行索引和列索引都是从0开始,而行号和列号都是从1开始 POI·操作excel基本上都是使用索引 XSSFRow对象的 row.getLastCellNum() 方法返回的是当前行最后有效列 ...

  5. POI操作Excel(xls、xlsx)

    阿帕奇官网:http://poi.apache.org/ POI3.17下载:http://poi.apache.org/download.html#POI-3.17 POI操作Excel教程(易百教 ...

  6. 使用POI操作Excel时对事先写入模板的公式强制执行

    场景:POI读取Excel模板. 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式则不自动被调用,必须手动双击该Cell才能生 ...

  7. POI操作Excel异常Cannot get a text value from a numeric cell

    控制台抛出异常:java.lang.IllegalStateException: Cannot get a text value from a numeric cell 在java中用POI解析exc ...

  8. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  9. 利用Apache POI操作Excel

    最近在做接口,有个功能是利用Excel导入汽车发动机所需零件信息到线上系统中.简单回顾一下之前学过的用java操作Excel. 1.maven配置Apache POI pom.xml中配置POIjar ...

随机推荐

  1. esri-leaflet入门教程(5)- 动态要素加载

    esri-leaflet入门教程(5)- 动态要素加载 by 李远祥 在上一章节中已经说明了esr-leaflet是如何加载ArcGIS Server提供的各种服务,这些都是服务本身来决定的,API脚 ...

  2. Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试

    承接上文,该篇即为项目整合的介绍了. 废话不多说,先把源码和项目地址放上来,重点要写在前面. github地址为ssm-demo 你也可以先体验一下实际效果,点击这里就行啦 账号:admin 密码:1 ...

  3. PrefixHeader.pch' file not found 以及 Xcode 中如何添加pch文件

    在开发的过程中,有时候接触到旧项目,会报: 'PrefixHeader.pch' file not found 的错误! 在Xcode6之前,新建一个工程的时候,系统会帮我们自动新建一个以工程名为名字 ...

  4. Linux系统(五)负载均衡LVS集群之DR模式

    序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图.LVS/NAT模式如下图: LVS/I ...

  5. 记一个Java错误 1 -- Unsupported major.minor version 52.0

    今天打开ADT eclipse 准备调试上周的安卓项目, 发现总是报错 如图: 百度了一下说是 jdk版本过低的问题  (低版本的jre运行高版本project) 于是就修改了一下 window - ...

  6. 基于fiddler的APP抓包及服务端模拟

    在HTTP接口的测试过程中,一般我们会按照如下的步骤进行: 1)测试环境的准备 2)HTTP消息体的构造 3)HTTP消息的发送及断言 如果我们可以拿到项目组的接口文档,并且HTTP后台服务是可以工作 ...

  7. Linux i2c子系统(三) _解决probe无法执行

    如果你也遇到了填充了id_match_table,compitible怎么看都一样,但probe就是不执行(让我哭一会),你可以回头看一下上一篇的模板,我们这里虽然使用的是设备树匹配,但和platfo ...

  8. 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

    本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...

  9. USACO全部月赛及GateWay数据

    月赛: 以07年open为例,网站如下 http://contest.usaco.org/OPEN07 其他的格式是http://contest.usaco.org/月份(月份的英文前三位,比如1月是 ...

  10. hibernate从数据库中自动生成

    计应134(实验班) 李佳鸿 DB Brower配置 1.依次选择window-Open Perspective-MyEclipse Explorer