Java Apache poi HSSF返回的物理行数不正确

Java Apache poi HSSF返回的物理行数不正确,java,excel,apache-poi,Java,Excel,Apache Poi,我正在处理用户给定的Excel文件(.xls),并使用Apache poi HSSF读取工作表。Excel实际包含16行 第13排是空的 第14行有数据 第15排是空的 第16行有数据 在本例中,工作表.getPhysicalRows()返回13。 而,worksheet.getLastRowNum()返回16 请注意,如果我删除了第13行,getPhysicalRows()将返回14。 如果我还删除了第16行,getPhysicalRows()仍然返回14 根本不读取包含有效数据的最后一行

我正在处理用户给定的Excel文件(.xls),并使用Apache poi HSSF读取工作表。Excel实际包含16行

  • 第13排是空的
  • 第14行有数据
  • 第15排是空的
  • 第16行有数据
在本例中,
工作表.getPhysicalRows()返回13。
而,
worksheet.getLastRowNum()
返回16

请注意,如果我删除了第13行,
getPhysicalRows()
将返回14。
如果我还删除了第16行,
getPhysicalRows()
仍然返回14

根本不读取包含有效数据的最后一行

您在XLS中遇到过这种行为吗

编辑:我不确定这个代码是否能帮助解决这个问题

 excelDocumentStream = new FileInputStream(new File(xlFilePath));
 POIFSFileSystem fsPOI = new POIFSFileSystem(new BufferedInputStream(excelDocumentStream));
 workbook = new HSSFWorkbook(fsPOI);
 int numOfRows = workSheet.getPhysicalNumberOfRows();
 int lastRow = workSheet.getLastRowNum();
像这样做

int rows = 0;
if(sheet.getPhysicalNumberOfRows()>0)
   rows=sheet.getLastRowNum() - sheet.getFirstRowNum()+1;

希望这有帮助

向代码显示如何读取数据。我敢用美元赌甜甜圈,这不是POI有漏洞。您还说“Excel实际包含16行”,这是错误的。空行不是物理行。如果“空行不是物理行”,POI应该返回14作为忽略两个物理行的结果。Apache POI只是告诉您Excel已写入文件的内容。您的问题听起来更像是“为什么Microsoft Office有时会将意外值写入Excel文件”…那么
getPhysicalNumberOfRows()
只返回内部
树映射的大小。如果您声称它返回的数据少于它应该返回的数据,那么该工作表已被解析错误。检查调试器发生了什么,如果它确实是一个bug,请将Excel发送给POI人员。@Gee如果您的文件是新创建的,并且您只写入了第1、2和10行,那么有3个物理行,但最后一行是10,因此计数不同是完全正常的!