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里面为何不使用这个值呢,是弄错了?还是别的原因?以后有时间再慢慢探索吧,也可试着自己重写一下。

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

文章来自:http://blog.csdn.net/zc123456zzc/article/details/47301461
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3