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

ClosedXML读取Excel时误将已删除行识别为空数据导致计数异常的解决求助

解决ClosedXML读取Excel时包含已删除内容空行的问题

这个问题我之前也碰到过!当你用DELETE键清空Excel单元格内容但没删除整行时,Excel其实会保留这些行在「已使用区域(Used Range)」里,ClosedXML的Rows()方法默认会遍历这个区域内的所有行,所以那些空行也会被读进来,导致最后数组里出现多余的空值。

解决方案:读取时过滤空行

你可以在遍历行的时候,先判断当前行是否所有单元格都是空的,如果是就直接跳过,这样就能只保留有有效数据的行。

修改你的readExcelFile方法,加入空行判断逻辑:

public DataTable readExcelFile(System.IO.Stream inputExcelFile) {
    DataTable dt = new DataTable();
    using (XLWorkbook workbook = new XLWorkbook(inputExcelFile)) {
        IXLWorksheet sheet = workbook.Worksheet(1);
        bool firstRow = true;
        foreach (IXLRow row in sheet.Rows()) {
            // 判断当前行是否为全空行,是则跳过
            bool isEmptyRow = row.Cells().All(cell => 
                cell.Value == null || string.IsNullOrWhiteSpace(cell.Value?.ToString()));
            if (isEmptyRow) {
                continue;
            }

            if (firstRow) {
                foreach (IXLCell cell in row.Cells()) {
                    dt.Columns.Add(cell.Value.ToString());
                }
                firstRow = false;
                continue;
            } else {
                DataRow newRow = dt.NewRow();
                int i = 0;
                foreach (IXLCell cell in row.Cells()) {
                    newRow[i] = cell.Value?.ToString() ?? string.Empty;
                    i++;
                }
                dt.Rows.Add(newRow);
            }
        }
    }
    return dt;
}

额外优化:数组转换时过滤(可选)

如果你不想修改读取Excel的逻辑,也可以在excelSerialArrayToJson方法里直接过滤掉空字符串:

private void excelSerialArrayToJson(DataTable excelInputdt) {
    List<string> validSerials = new List<string>();
    for (int i = 0; i < excelInputdt.Rows.Count; i++) {
        string value = excelInputdt.Rows[i][0].ToString();
        if (!string.IsNullOrWhiteSpace(value)) {
            validSerials.Add(value);
        }
    }
    serials = validSerials.ToArray();
}

这样不管DataTable里有没有空行,最后得到的serials数组都会只包含非空的有效数据,计数也会正确显示为1。

问题根源说明

Excel的「已使用区域」会记录所有曾经被编辑过的单元格/行,哪怕你后来清空了内容,只要没删除整行,这个区域还是会包含这些行。ClosedXML默认读取这个区域的所有行,所以就会把空行也读进来。通过过滤全空行,就能排除这些无效行。

内容的提问来源于stack exchange,提问作者gorgeusDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:04:05