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 返回不正确的物理行数的主要内容,如果未能解决你的问题,请参考以下文章
org.apache.poi.hssf.usermodel.HSSFWorkbookorg.apache.poi.xssf.usermodel.XSSFWorkbook excel2003 exce