You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:41:57