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

如何使用C#读取大型Excel文件并高效处理关联ID数据?

C#处理百万行级Excel文件的方案

一、选对工具:用流式读取库避免内存溢出

直接用支持逐行流式读取的库,不要用一次性加载全量数据的方案,推荐两个主流库:

  • EPPlus 5+:适配.NET Core/.NET 5+,非商业场景免费,原生支持逐行读取,内存占用极低
  • NPOI:兼容.NET Framework和.NET Core,同样支持流式遍历行数据

二、流式读取+按ID聚合(以EPPlus为例)

利用文件中ID连续分块的特征(比如1-3000行ID=1),直接在读取时计算聚合值,不用导入数据库:

using OfficeOpenXml;
using System.IO;

// 非商用场景设置许可证
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

var filePath = @"你的拆分后Excel文件路径.xlsx";
using (var package = new ExcelPackage(new FileInfo(filePath)))
{
    var worksheet = package.Workbook.Worksheets[0];
    var totalRows = worksheet.Dimension.Rows;
    int currentRow = 2; // 跳过表头行
    
    while (currentRow <= totalRows)
    {
        // 获取当前块的ID
        var currentId = worksheet.Cells[currentRow, 1].GetValue<int>();
        // 定位当前ID块的结束行
        int blockEndRow = currentRow;
        while (blockEndRow <= totalRows && worksheet.Cells[blockEndRow, 1].GetValue<int>() == currentId)
        {
            blockEndRow++;
        }
        blockEndRow--; // 回退到当前ID的最后一行
        
        // 计算当前ID块的目标列最大值(示例取第3列)
        decimal maxValue = decimal.MinValue;
        for (int row = currentRow; row <= blockEndRow; row++)
        {
            var cellValue = worksheet.Cells[row, 3].GetValue<decimal>();
            if (cellValue > maxValue) maxValue = cellValue;
        }
        
        // 输出或存储结果
        Console.WriteLine($"ID={currentId} 的最大值:{maxValue}");
        
        // 跳转到下一个ID块
        currentRow = blockEndRow + 1;
    }
}

这种方式每次只处理一小段连续ID的行,内存占用稳定,百万级文件也能轻松处理。

三、如果必须导入数据库的优化方案

如果还是需要把数据导入SQL Server再查询,做以下优化:

  1. 批量插入控制:设置SqlBulkCopy的BatchSize为10000-50000,避免一次性提交过多数据导致超时
  2. 索引优化:导入完成后给ID列建非聚集索引,加速后续按ID查询的速度
using System.Data.SqlClient;
using OfficeOpenXml;
using System.Data;

// 先读取一个ID块的数据到DataTable
DataTable dataTable = new DataTable();
// 手动构建DataTable的列结构,和数据库表对应

// 填充DataTable(逻辑参考上面的逐行读取)

// 批量插入
using (var conn = new SqlConnection("你的SQL Server连接字符串"))
{
    conn.Open();
    using (var bulkCopy = new SqlBulkCopy(conn))
    {
        bulkCopy.DestinationTableName = "你的数据库表名";
        bulkCopy.BatchSize = 10000;
        // 映射Excel列和数据库列
        bulkCopy.ColumnMappings.Add("Excel列名1", "数据库列名1");
        bulkCopy.ColumnMappings.Add("Excel列名2", "数据库列名2");
        
        bulkCopy.WriteToServer(dataTable);
    }
}

四、核心总结

  • 只是做按ID聚合计算:直接流式读取+分块处理,跳过数据库导入环节,节省时间和资源
  • 需要长期存储数据:用批量插入+索引优化,保证导入和查询效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:50:23