使用EPPlus读取Excel时出现额外空行问题求助
解决Java生成Excel在.NET Core中读取时的空行问题
场景:Java生成的Excel包含4个工作表,使用.NET Core 3.1读取第一个工作表时出现异常:有时仅读取4条空行,有时读取全部数据但多4条空行。实际含表头共435行数据,但
worksheet.Rows.Count()返回439,worksheet.Dimensions.Rows返回442;手动删除末尾空行后读取恢复正常,但无法持续手动处理,其他工作表读取正常。
核心原因
Java生成Excel时,可能在工作表末尾残留了空行的格式、样式或空单元格元数据,导致NPOI将这些空行识别为有效行,而非实际包含数据的行。
解决方案代码
修改读取逻辑,跳过无有效数据的空行,同时优化表头和行的读取范围:
public List<Dictionary<string, string>> ReadSheet(ExcelWorksheet worksheet) { try { // 获取实际使用的单元格范围,避免读取无效区域 var dimensions = worksheet.Dimensions; if (dimensions == null) return new List<Dictionary<string, string>>(); int startRow = dimensions.Start.Row; int endRow = dimensions.End.Row; int startCol = dimensions.Start.Column; int endCol = dimensions.End.Column; _logger.LogInformation($"实际单元格范围: 行 {startRow}-{endRow}, 列 {startCol}-{endCol}"); // 读取表头:仅读取实际使用的列范围 var headers = worksheet.Cells[startRow, startCol, startRow, endCol] .Select(c => c.Text.Trim()) .ToList(); _logger.LogInformation($"表头数量: {headers.Count}"); List<Dictionary<string, string>> sheetData = new List<Dictionary<string, string>>(); // 遍历数据行,跳过空行 for (int row = startRow + 1; row <= endRow; row++) { // 判断当前行是否有有效数据:任意单元格有非空内容 bool hasData = worksheet.Cells[row, startCol, row, endCol] .Any(c => !string.IsNullOrWhiteSpace(c.Text)); if (!hasData) continue; Dictionary<string, string> rowData = new Dictionary<string, string>(); for (int col = startCol; col <= endCol; col++) { int headerIndex = col - startCol; if (headerIndex < headers.Count) { rowData[headers[headerIndex]] = worksheet.Cells[row, col].Text.Trim(); } } sheetData.Add(rowData); } _logger.LogInformation($"存储的数据行数: {sheetData.Count}"); return sheetData; } catch (Exception ex) { _logger.LogError($"读取异常: {ex.Message}", ex); throw; } }
关键优化点
- 使用实际单元格范围:通过
worksheet.Dimensions获取真正被使用的单元格区域,避免读取超出实际数据的列和行。 - 空行判断逻辑:遍历每行的所有单元格,只有存在非空内容时才视为有效行,跳过纯空行。
- 表头读取优化:仅读取表头行的实际使用列,避免读取大量空列导致表头数量异常。
- 内容去空格:对单元格文本做
Trim()处理,避免因空格导致的“非空”误判。
内容的提问来源于stack exchange,提问作者ashtrix-001
相关产品推荐
相关产品推荐

