Java 使用poi包 讀excel文件時(shí)登渣,獲取指定sheet頁(yè)中數(shù)據(jù)行數(shù)可以通過(guò)調(diào)用 sheet.getLastRowNum() ;但這種方法僅限于當(dāng)前sheet頁(yè)中沒(méi)有帶格式的空白行時(shí)。如果其中一行的數(shù)據(jù)都為空,但是其原本的格式還在,此時(shí)使用getLastRowNum()方法計(jì)算出來(lái)的行數(shù)就不正確(比真實(shí)行數(shù)大)。
那么如何跳過(guò)當(dāng)前sheet頁(yè)中沒(méi)有意義的行正確獲取excel的真實(shí)行數(shù)呢?
可以對(duì)當(dāng)前sheet頁(yè)中的各行進(jìn)行過(guò)濾,將沒(méi)有意義的行刪掉疏遏,然后再調(diào)用sheet.getLastRowNum() 即可得到真實(shí)行。
代碼實(shí)現(xiàn)
1救军、方法getVaildRows()獲取指定excel的真實(shí)行數(shù)
public static int getVaildRows(String path) throws IOException, InvalidFormatException {
FileInputStream excelFileInputStream = new FileInputStream(path);
Workbook wb = WorkbookFactory.create(excelFileInputStream);
Sheet sheet = wb.getSheetAt(0);
CellReference cellReference = new CellReference("A4");
boolean flag = false;
for (int i = cellReference.getRow(); i <= sheet.getLastRowNum(); ) {
Row r = sheet.getRow(i);
if (r == null) {
// 如果是空行(即沒(méi)有任何數(shù)據(jù)财异、格式),直接把它以下的數(shù)據(jù)往上移動(dòng)
sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
continue;
}
flag = false;
for (Cell c : r) {
if (c.getCellType() != Cell.CELL_TYPE_BLANK) {
flag = true;
break;
}
}
if (flag) {
i++;
continue;
} else {//如果是空白行(即可能沒(méi)有數(shù)據(jù)唱遭,但是有一定格式)
if (i == sheet.getLastRowNum())//如果到了最后一行戳寸,直接將那一行remove掉
sheet.removeRow(r);
else//如果還沒(méi)到最后一行,則數(shù)據(jù)往上移一行
sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
}
}
return sheet.getLastRowNum() + 1;
}
2拷泽、測(cè)試
public static void main(String[] args) throws IOException, InvalidFormatException {
String path ="E:\\file\\2.0\\sc\\0101010330202\\0101010330202.xlsx";
int rows = getVaildRows(path);
System.out.println("總行數(shù):"+rows);
}
輸出結(jié)果:
總行數(shù):21