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

