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