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
相关产品推荐
相关产品推荐

