伙计们,我目前正在使用 POI 3.9 库来处理 Excel 文件。我知道
getLastRowNum()
函数,它返回 Excel 文件中的多行。
唯一的问题是
getLastRowNum()
返回一个从 0 开始计数的数字。
因此,如果 Excel 文件使用前 3 行,则
getLastRowNum()
返回 2。
如果 Excel 文件只有 1 行,则 getLastRowNum()
返回 0。
当 Excel 文件完全为空时,就会出现此问题。
getLastRowNum()
仍然返回0,所以我无法确定Excel文件是否有1行数据,或者是否为空。
那么如何检测Excel文件是否为空?
由于
Sheet.getPhysicalNumberOfRows()
不计算空行,并且 Sheet.getLastRowNum()
在有一行或无行时都返回 0,因此我使用两种方法的组合来精确计算总行数。
int rowTotal = sheet.getLastRowNum();
if ((rowTotal > 0) || (sheet.getPhysicalNumberOfRows() > 0)) {
rowTotal++;
}
注意:这会将具有一个空行的电子表格视为没有空行,但对于大多数用途来说,这可能没问题。
您可以做两件事
使用
int noOfColumns = sh.getRow(0).getPhysicalNumberOfCells();
或
int noOfColumns = sh.getRow(0).getLastCellNum();
它们之间有细微的差别
选项 1 给出实际填充内容的列数(如果 10 列中的第二列未填充,您将得到 9)
选项 2 只提供最后一列的索引。这样就完成了
'getLastCellNum()'
如果您进行检查
if
(getLastRowNum()<1){
res="Sheet Cannot be empty";
return
}
这将确保您至少有一行包含除标题之外的数据。下面是我的程序,运行良好。 Excel 文件有三列,即。 ID、姓名、姓氏
XSSFWorkbook workbook = new XSSFWorkbook(inputstream);
XSSFSheet sheet = workbook.getSheetAt(0);
Row header = sheet.getRow(0);
int n = header.getLastCellNum();
String header1 = header.getCell(0).getStringCellValue();
String header2 = header.getCell(1).getStringCellValue();
String header3 = header.getCell(2).getStringCellValue();
if (header1.equals("ID") && header2.equals("NAME")
&& header3.equals("LASTNAME")) {
if(sheet.getLastRowNum()<1){
System.out.println("Sheet empty");
return;
}
iterate over sheet to get cell values
}else{
SOP("invalid format");
return;
}
getLastRowNum() 返回最后一行的索引。
所以如果你想知道总行数 = getLastRowNum() +1。
我希望这会起作用。
int rowTotal = sheet.getLastRowNum() +1;
Sheet.getPhysicalNumberOfRows()
不涉及一些空行。
如果您想循环所有行,请不要使用它来了解循环大小。
我使用 getPhysicalNumberOfRows() 方法获取实际数据时遇到同样的问题。但我的上传表也包含空白行,然后它导致问题并丢失了最后一些行。
我使用sheet.getLastRowNum() +1作为外部循环的行数,内部循环使用getPhysicalNumberOfRows()。
整体呈红色,工作正常。
要查找最后一个数据行,如果您在 Excel 中创建了表格模板,其中部分填充或行之间为空。 逻辑:
int count = 0;
int emptyrow=0;
int irow=0;
while (rowIterator.hasNext()) {
row = (Row) rowIterator.next();
if (count != 0 && !checkIfRowIsEmpty(row)) { }
else{
if(count!=0 && emptyrow==irow){
emptyrow++;
}else{
emptyrow=0;
irow=0;
}
}
if(emptyrow>0){
irow++;
}
if(emptyrow>3){
break;
}
count++;
}