使用NPOI读取xls/xlsx时,GetRow()遇空行不返回null的问题咨询
解决NPOI读取Excel时空行
GetRow()不返回null的问题 我之前也踩过NPOI这个坑!确实,当Excel里的行被初始化过(比如曾经输入过内容又删掉,或者手动调整过行高、设置过单元格格式),哪怕所有单元格都是空的,GetRow()也不会返回null,这会导致你的循环无法正常终止,甚至在访问空单元格时报错。
问题原因
Excel的行分为两种状态:
- 从未被操作过的行:
GetRow()会返回null - 被初始化过的空行:NPOI会保留这个行的元数据(比如行高、格式信息),所以
GetRow()会返回一个IRow对象,但单元格都是空的
解决方案:判断行是否为真正的空行
我们可以写一个辅助方法,检查行内所有单元格是否都为空,以此来判断是否是需要跳过的空行:
private bool IsRowEmpty(IRow row) { if (row == null) return true; // 遍历行内的所有单元格 for (int i = row.FirstCellNum; i < row.LastCellNum; i++) { ICell cell = row.GetCell(i); // 只要有一个单元格非空(且不是空白类型、不是纯空格),就不算空行 if (cell != null && cell.CellType != CellType.Blank && !string.IsNullOrWhiteSpace(cell.ToString())) { return false; } } return true; }
然后修改你的循环逻辑,加入空行判断,同时给单元格访问加上空保护,避免空引用异常:
int idx_row = 1; IRow currentRow = sheet.GetRow(idx_row); while (currentRow != null) { // 先判断当前行是否为真正的空行,是的话直接跳过 if (IsRowEmpty(currentRow)) { idx_row++; currentRow = sheet.GetRow(idx_row); continue; } JObject jsonData = new JObject(); // 使用空传播运算符避免单元格为空时报错,空的话默认赋值为空字符串 jsonData["a"] = currentRow.GetCell(0)?.StringCellValue?.Replace(" ", "") ?? ""; // other similar code jsonPlateData.Add(jsonData); idx_row++; currentRow = sheet.GetRow(idx_row); }
额外提示
- 如果你不确定单元格的类型(比如可能是数字、日期),可以先统一转换为字符串再判断,避免类型转换错误
- 如果Excel里有大量空行,这个方法的效率也足够应对日常场景,不需要担心性能问题
内容的提问来源于stack exchange,提问作者Ribas
相关产品推荐
相关产品推荐

