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

如何用EPPlus在ASP.NET MVC(C#)中通过EF导入Excel到Oracle数据库

使用EPPlus + EF将Excel数据导入Oracle数据库(ASP.NET MVC/C#)

问题核心

你当前的代码只是把Excel读取到的实体对象添加到了List<TB_PR_MST_PROJECT>中,但没有将这些实体注册到EF上下文的DbSet集合里,所以调用SaveChanges()不会对数据库产生任何操作。另外代码还存在硬编码文件路径、未使用上传的file参数、未处理单元格空值等问题。

修正后的完整代码

[HttpPost]
public ActionResult CreateByFile(HttpPostedFileBase file)
{
    // 校验上传文件有效性
    if (file == null || file.ContentLength <= 0 || !file.FileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
    {
        ModelState.AddModelError("", "请上传有效的xlsx格式文件");
        return View();
    }

    using (var stream = new MemoryStream())
    {
        // 将上传文件写入内存流
        file.InputStream.CopyTo(stream);
        stream.Position = 0;

        using (var package = new ExcelPackage(stream))
        {
            // 读取第4个工作表(EPPlus工作表索引从1开始)
            ExcelWorksheet worksheet = package.Workbook.Worksheets[4];
            if (worksheet == null)
            {
                ModelState.AddModelError("", "目标工作表不存在");
                return View();
            }

            var rowCount = worksheet.Dimension?.Rows ?? 0;
            if (rowCount < 4) // 你的数据从第4行开始
            {
                ModelState.AddModelError("", "Excel中无有效数据行");
                return View();
            }

            using (Entities dc = new Entities())
            {
                for (int row = 4; row <= rowCount; row++)
                {
                    // 处理单元格空值,避免空引用异常
                    var prjName = worksheet.Cells[row, 3].Value?.ToString().Trim();
                    var prjTeamDetail = worksheet.Cells[row, 9].Value?.ToString().Trim();

                    // 跳过空数据行(根据业务需求调整)
                    if (string.IsNullOrEmpty(prjName))
                        continue;

                    var project = new TB_PR_MST_PROJECT
                    {
                        PRJ_NAME = prjName,
                        PRJ_TEAM_DETAIL = prjTeamDetail
                    };

                    // 关键步骤:将实体添加到EF上下文的DbSet中
                    dc.TB_PR_MST_PROJECT.Add(project);
                }

                // 批量提交到数据库
                dc.SaveChanges();
            }
        }
    }

    ViewBag.Message = "数据导入成功";
    return View();
}

关键步骤说明

  • 处理上传文件:不再依赖硬编码本地路径,直接使用前端上传的HttpPostedFileBase对象,通过内存流传递给EPPlus,避免本地文件IO依赖
  • EPPlus读取规则:工作表索引从1开始,worksheet.Dimension用于获取表格有效行列范围,需做空值校验
  • 实体注册到EF上下文:必须调用dc.TB_PR_MST_PROJECT.Add(project)将实体加入EF的跟踪集合,EF才会生成对应的插入SQL语句
  • 空值处理:使用?.空合并运算符处理单元格值为空的情况,避免NullReferenceException
  • 批量保存:循环添加所有实体后一次性调用SaveChanges(),减少数据库交互次数,提升导入性能
  • 异常处理(可选但建议):可以在外层添加try-catch块,捕获Excel读取、数据库操作的异常,返回友好提示

额外注意事项

  • 确保已通过NuGet安装EPPlus包:Install-Package EPPlus(注意EPPlus 5+版本需要商用授权,若需开源免费可使用4.x版本)
  • 确认EF上下文Entities中已正确配置TB_PR_MST_PROJECT对应的Oracle表映射
  • 根据实际业务需求调整数据起始行、列索引,以及必填字段的校验逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:40:41