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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:23:10