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

  • 相关阅读:
    js-禁止微信H5页面点击右上角菜单时出现“复制链接”,且分享仅支持微信分享
    js-获取用户移动端网络类型:wifi、4g、3g、2g...
    小程序-云开发部署流程(步骤二)
    小程序-(报错)请使用 2.2.3 或以上的基础库以使用云能力(步骤一)
    解决iOS10的Safari下Meta设置user-scalable=no无效的方法
    领域驱动, 事件驱动,测试驱动
    spring web项目中整合netty, akka
    why rpc
    nginx配置https证书
    org.apache.http.NoHttpResponseException
  • 原文地址:https://www.cnblogs.com/chanshuyi/p/4156964.html
Copyright © 2020-2023  润新知