row : 电子表格中行的高级表现形式,只有拥有cell的row才应该被添加进sheet(not forbid);
row index 从 0 开始。即,rowNum 从 0 开始。
HSSFSheet sheetFirst = hssfWorkbook.getSheetAt(0);
(1)获取实际存在的有效的row 数量
即,row不为null,即使某行row中cell内容为空格,row同样有效!
int physicalNumberOfRows = sheetFirst.getPhysicalNumberOfRows();
(2)得到有效的最后一行rowNum
int lastRowNum = sheetFirst.getLastRowNum();
注意区分getPhysicalNumberOfRows();
和getLastRowNum();
。前者为sheet中实际意义上存在的row,后者为sheet中最后一行rowNum。
需要说明的是,如果sheet为空,即没有实际意义上的row。那么二者都会返回0。但是如果只有一行,前者返回 1 ,后者返回0。
故,使用getLastRowNum()的前提是sheet至少有两行有效数据,才能说明数据的正确性!!!
(3)得到有效的第一行的rowNum
int firstRowNum = sheetFirst.getFirstRowNum();
得到第一个有效行的rowNum。
和上面获取最后一行rowNum存在同样问题:
如果只有一行且该行在第一行,那么其返回 0 ;但是如果sheet为空,其同样返回为 0 。
使用需谨慎,判断sheet为空建议使用getPhysicalNumberOfRows()
。
(4)根据rowNum创建row
HSSFRow row = sheetFirst.createRow(rowNum);
(5)根据rowIndex 获取row
HSSFRow row = sheetFirst.getRow(ronIndex);
(6)移除指定row
即,移除该行所有cell和row自身对象。
HSSFRow row = sheetFirst.getRow(1);
sheetFirst.removeRow(row);
移除后,row将会变成null;getPhysicalNumberOfRows();将会 减 1。
(7)获取表格打开时,可见的第一行rowNum
short topRow = sheetFirst.getTopRow();
如下图所示,此时topRow = 1;实际上有效的第一行index为0,只是被隐藏了。
int firstRowNum = sheetFirst.getFirstRowNum();
//此时 firstRowNum = 0 !
int physicalNumberOfRows = sheetFirst.getPhysicalNumberOfRows();
//此时 physicalNumberOfRows = 2 !
(8)移动row,移动some row–只copy 单元格值和单元格样式,不改变行高
Parameters:
区间:完全闭区间[startRow,endRow]。
startRow,endRow均代表index(rowNum),基数为0。
sheetFirst.shiftRows(startRow, endRow, n);
//等价于
sheetFirst.shiftRows(startRow, endRow, n, false, false);
//等价于
sheetFirst.shiftRows(startRow, endRow, n, false, false,true);
示例一:
如 startRow= 1,endRow = 3,n = 2。则表示将 2-4行向下移动两行,结果是第二行覆盖第4行,第三行覆盖第5行,第四行覆盖第6行,原第二行变为空行(row!=null ,即,row有效但cell为null),。
int startRow=1;
int endRow = 3;
int n=2;
sheetFirst.shiftRows(startRow, endRow, n);
如果移动范围超出了sheet中row的有效范围,将会在移动目标行创建新行:
示例二:
int startRow=4;
int endRow = 6;
int n=8;
sheetFirst.shiftRows(startRow, endRow, n);
此时 sheet有效row数量仍为7!!
如果移动一不存在的row到sheet有效row范围外,相当于创建了一cell为null的row(row != null),此时getPhysicalNumberOfRows()
+1。
如果移动一不存在的row到sheet有效row范围内,那么目标位置row将会被覆盖(cell变为null),此时getPhysicalNumberOfRows()
不变。
向上移动时需要注意,rowNum最小值(基数)为0。也就意味着你不能移动到 rowNum = -1的位置。
示例如下:
第2-4行向上移动一行,原第4行变为空行(row !=null ,cell 为 null)。
int startRow=1;
int endRow = 3;
int n=-1;
sheetFirst.shiftRows(startRow, endRow, n);
原第四行(rowNum=3)如下图所示;
(9)移动行的时候选择是否更改行高
Parameters:
sheetFirst.shiftRows(startRow, endRow, n, copyRowHeight, resetOriginalRowHeight);
示例 :
int startRow=1;
int endRow = 3;
int n=-1;
sheetFirst.shiftRows(startRow, endRow, n, true, true);
如下图所示,移动过程中附带了行高,且将原始行(被移动的行)设置了默认行高(因为234行中只有4行没有被覆盖,故第4行设置默认行高):
(10)移动的时候在9的基础上增加是否同时移动单元格增加的注释
sheetFirst.shiftRows(startRow, endRow, n, copyRowHeight, resetOriginalRowHeight, moveComments);
示例:
int startRow=1;
int endRow = 3;
int n=8;
sheetFirst.shiftRows(startRow, endRow, n, true, true, true);