SXSSFSheet对象调用getLastRowNum的问题

版权声明:本文转载自 张晨的博客(http://blog.csdn.net/zc123456zzc), 转载请保留本声明! https://blog.csdn.net/zc123456zzc/article/details/47301461

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

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭