POI 操作Excel疑难点笔记

在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)

时间: 2024-10-04 01:29:18

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

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

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

(5) 如何用Apache POI操作Excel文件-----发现Apache的POI的Bug后,如何给Apache的POI报Bug?

在我上篇文章中,(4) 如何用Apache POI操作Excel文件-----发现了POI-3.12一个回归,通过测试POI-3.12的版本,我发现了一个bug,那么发现bug后,该如何处理.我们有2种处理方式,首先我们到Apache POI的bug库里面搜索,看别人有没有创建类似的bug,如果有创建的,这个是最好的结果,我们只需要关注这个bug什么时候被修复.如果没有搜索不到,这个时候我们就需要给Apache POI报bug了.那么,如何给Apache报Bug? 第一步: 打开https://

poi操作Excel工具类

在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.写入Excel.合并Excel的功能.

JAVA使用POI操作excel

这里提一下,java操作excel的组件除了apache的poi,还有jexcelapi(jxl),其中poi组件的获取地址为poi.apache.org. poi组件中常用的类有HSSFworkbook表示一个完整的excel表格,HSSFsheet表示excel中的一个工作薄,HSSFRow表示工作薄中的一行,HSSFCell表示一个单元格 下面是一个简单的写入的demo public static void main(String [] args){ try { HSSFWorkbook

POI操作Excel详解,HSSF和XSSF两种方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.

POI 操作Excel 异常org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a c

POI 操作Excel 出现如下异常 org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a content type part 代码如下 public boolean parseToExcel(String oldFileName,String newFileName){ Map<Object,Object> map = new HashMap<Object,Object&

POI操作EXCEL之导出Excel(设置有效性,下拉列表引用)

本人使用的是poi-bin-3.10-FINAL-20140208.zip 版本的poi以下是程序关键代码: //需要引用的类 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import ja

第七周作业 POI操作Excel,world文档

先来说说jxl与poi的区别. 相同点都是操作EXcel的工具,但jxl不常用原因有:jxl没有人维护,操作excel效力低下,只支持03及其以前的版本的excel,对图片的支持不完整. 同poi比较而言,poi效率高功能强大,支持xlsx,xls即支持所有的版本.而且操作大数据效率比较高,因为他对大数据的操作做了相应的优化. 下面来个简单地实现:poi操作Excel的功能 简单的单元测试类:实现的功能是向excel文件中写入数据 1 @Test 2 public void test1() th

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解析excel文件时出现以上报错,表示无法从一个数值类型的单元格获得文本类型的值. POI操作Excel时数据Cell有不同的类型,当我们试图从一个数字类型的Cell读取出一个字符串并写入数据库时,就会出现Cannot get a text value from a numeric cell的异常错误. 解决