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

Posted

技术标签:

【中文标题】Apache poi HSSF 返回不正确的物理行数【英文标题】:Apache poi HSSF returns incorrect no of physical rows 【发布时间】:2015-09-03 14:11:56 【问题描述】:

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

第 13 行为空。 第 14 行有数据 第 15 行为空 第16行有数据

在这种情况下,worksheet.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();

【问题讨论】:

显示代码你是如何读取数据的。我会向甜甜圈打赌,不是 POI 有错误。您还说“Excel 实际包含 16 行”这是错误的。空行不是物理行。 好的,如果“空行不是物理行”,POI 应该返回 14 作为结果,忽略两个物理行。 Apache POI 只是告诉您 Excel 已写入文件的内容。您的问题听起来更像是“为什么 Microsoft Office 有时会将意外值写入 Excel 文件”...... 好吧getPhysicalNumberOfRows() 只是返回内部TreeMap<Integer, HSSFRow> 的大小。如果您声称它返回的数据少于应有的数据,则该工作表已被解析错误。检查调试器发生了什么,如果确实是错误,请将 Excel 发送给 POI 人员。 @Gee 如果您的文件是新创建的,并且您只写入了第 1、2 和 10 行,那么有 3 个物理行,但最后一行是 10,因此对于计数不同! 【参考方案1】:

这样做

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

希望对你有帮助!!!

【讨论】:

以上是关于Apache poi HSSF 返回不正确的物理行数的主要内容,如果未能解决你的问题,请参考以下文章

poi 导出excel 怎么设置合并的单元格自动换行

Apache POI-HSSF 与 POI-XSSF

java poi的使用问题

POI工具类

org.apache.poi.hssf.usermodel.HSSFWorkbookorg.apache.poi.xssf.usermodel.XSSFWorkbook excel2003 exce

使用 apache poi 将 HSSF(excel) 嵌入到 HSLF(ppt) 中