SXSSFSheet对象调用getLastRowNum的问题

首先SXSSFSheet来自于org.apache.poi.xssf.streaming.SXSSFSheet,其官方文档请看:https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFSheet.html

使用时需要导入如下jar包:

先看代码片段

SXSSFSheet sheet = (SXSSFSheet) workBook.getSheetAt(sheetIndex);
System.out.println(sheet.getLastRowNum());

输出结果永远是0,虽然表并不为空

例如debug的过程中,当读到如下的sheet时

在监视窗口看到

其中_rows的size=0

我们再来看getLastRowNum()的源代码

public int getLastRowNum() {
        return this._rows.size() == 0?0:((Integer)this._rows.lastKey()).intValue();
    }

显而易见问题在于这个_rows是空的,我们再看SXSSFSheet这个类的源代码

TreeMap<Integer, SXSSFRow> _rows = new TreeMap();

这是_rows的定义,而只有两处代码会往_rows里面加东西:

public void changeRowNum(SXSSFRow row, int newRowNum) {
        this.removeRow(row);
        this._rows.put(new Integer(newRowNum), row);
    }
public Row createRow(int rownum) {
        int maxrow = SpreadsheetVersion.EXCEL2007.getLastRowIndex();
        if(rownum >= 0 && rownum <= maxrow) {
                //……省略
                SXSSFRow newRow = new SXSSFRow(this, initialAllocationSize);
                this._rows.put(new Integer(rownum), newRow);
                //……省略

                return newRow;
            }
        } else {
            //……省略
        }

第一段代码是改变行号,第二段代码是创建新行。除此之外,没有任何地方对这个数据结构进行插入操作,因此_rows一直是空的。

我们注意到sheet中有个属性_sh我们来看看它的值:

这里面竟然也有个_rows,而且其size=95,正好是1.家庭成员这个sheet中的行数。那么getLastRowNum里面为何不使用这个值呢,是弄错了?还是别的原因?以后有时间再慢慢探索吧,也可试着自己重写一下。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-11 22:21:37

SXSSFSheet对象调用getLastRowNum的问题的相关文章

SPServices介绍之三:使用SPSerivces对象调用Web Service

SPServices介绍之三:使用SPSerivces对象调用Web Service 分类: SPSerivces2014-09-21 04:23 304人阅读 评论(0) 收藏 举报 在上一篇文章SPServices介绍之二中,介绍了一些SPServices的基本方法,除了这些方法,SPServices的主要用处是使用Ajax方法调用SharePoint提供的Web Service. 先看一下语法: [javascript] view plaincopy $().SPServices({ op

子类继承父类时,子类与父类有同名变量,当使用子类对象调用父类方法使用同名变量,这个变量是子类的,还是父类的? (改)

1 public class Test4 { 2 public static void main(String[] args){ 3 Son son = new Son(); 4 son.minusOne(); 5 System.out.println(son.testValue); 6 System.out.println(son.getSuperTestValue()); 7 son.plusOne(); 8 System.out.println(son.testValue); 9 Syst

C++成员不通过对象调用的直接调用写法

C++成员不通过对象调用(.或->方式)的另类(C式)调用写法 #include <iostream> using namespace std; /* 我们知道,成员函数和普通函数最大的区别就是成员函数包含一个隐藏的参数this指针,用来表明成员函 数当前作用在那一个对象实例上. 根据调用约定(Calling Convention)的不同,成员函数实现this指针的方式也不同. 1. 如果使用__thiscall调用约定,那么this指针保存在寄存器ECX中,VC编译器缺省情况下就是这样

使用WebRequest对象调用新浪天气预报&lt;转&gt;

// 待请求的地址 string url = "http://www.cnblogs.com"; // 创建 WebRequest 对象,WebRequest 是抽象类,定义了请求的规定, // 可以用于各种请求,例如:Http, Ftp 等等. // HttpWebRequest 是 WebRequest 的派生类,专门用于 Http System.Net.HttpWebRequest request = System.Net.HttpWebRequest.Create(url) a

JavaSE7基础 匿名对象调用方法

版本参数:jdk-7u72-windows-i586注意事项:博文内容仅供参考,不可用于其他用途. 代码 class Test{ public void printHello(){ System.out.println("hello"); } } class Demo{ public static void main(String[] args){ //匿名对象调用方法 new Test().printHello(); //匿名对象调用完毕后,就被垃圾回收器回收. //匿名对象可以作为

通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值

package com.Summer_0426.cn; /** * @author Summer * 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值 * */ public class Test01 { public static void main(String[] args) { JavaTeacher guoxiang = new JavaTeacher("郭襄");//子类实例化,并传入参数 guoxiang.giveLesson();//输出结果,

Python 之面向对象:类和对象调用类中的变量和方法

面向对象的核心是对象,用对象来操控类里面的方法和变量,加上类还具有继承.封装.多态三大特性,提高了代码的复用性和规范性. 一.对象 调用类中的变量和方法 二 .类  调用类中的变量和方法 原文地址:https://www.cnblogs.com/tianpin/p/11283032.html

42th 逻辑的连续性 取决于 细节的理解-------------我是个厨子:类的调用vs 对象调用方法

类的调用vs 对象调用方法 class Cook5:    '''这是一个厨师的类'''        # 类是一系列对象相同的特征与技能的结合体        # 用变量表示特征(属性)    name = '张三'    age  = '27'        # 用函数表示技能(方法)            def qie():        print('技能:切菜')        def chao():        print('技能:炒菜') 小结:  ----类中定义的函数  必

Java父类对象调用子类实体:方法重写与动态调用

众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例子 class Father{ public void announce(){ System.out.println("Father"); } } class Child extends Father{ @Override public void announce(){ System.ou