.Net 基于MiniExcel的导入功能接口示例

csharp 复制代码
 /// <summary>
 /// 导入
 /// </summary>
 /// <param name="formFile"></param>
 /// <returns></returns>
 [HttpPost("Import")]
 public async Task<ExecResult> Import(IFormFile formFile)
 {
     try
     {
         if (formFile == null) throw new Exception("请选择文件导入!");
         var fileExt = Path.GetExtension(formFile.FileName);
         if (fileExt != ".xlsx") throw new Exception("请导入后缀名为.xlsx的Excel文件!");

         using var stream = new MemoryStream();
         formFile.CopyTo(stream);
         var maintainItems = new List<TpmMaintainItem>();
         var allItems = await _dbcontext.TpmMaintainItems.ToListAsync();
         var equipments = await _dbcontext.Equipment.ToListAsync();
         int num = 1;
         StringBuilder sb = new StringBuilder();
         foreach (IDictionary<string, object> row in stream.Query(true))
         {
             var equipmentCode = row["设备编码"];
             var name = row["维保项名称"];
             var cycle = row["维保项周期(天)"];
             var content = row["维保项内容"];
             var isMustCheck = row["是否必检"];
             var advanceDays = row["提前天数"];
             if (equipmentCode == null) sb.AppendLine($"第{num}行设备编码不存在!");
             if (name == null) sb.AppendLine($"第{num}行维保项名称不能为空!");
             if (cycle == null) sb.AppendLine($"第{num}行维保项周期(天)不能为空!");
             if (content == null) sb.AppendLine($"第{num}行维保项内容不能为空!");
             if (isMustCheck == null)
             {
                 sb.AppendLine($"第{num}行是否必检不能为空!");
             }
             else if(!(isMustCheck.ToString() == "是" || isMustCheck.ToString() == "否"))
             {
                 sb.AppendLine($"第{num}行是否必检为非法字符,只能填写是或否!");
             }
             if (advanceDays == null) sb.AppendLine($"第{num}行提前天数不能为空!");

             var equipment = equipments.FirstOrDefault(s=>s.EquipmentCode == equipmentCode.ToString());
             if(equipment == null) sb.AppendLine($"第{num}行设备编码:{equipmentCode}不存在!");
             var maintainItem = new TpmMaintainItem()
             {
                 EquipmentId = Convert.ToInt32(equipment?.EquipmentID),
                 Name = name.ToString(),
                 Cycle = Convert.ToInt32(cycle),
                 Content = content.ToString(),
                 IsMustCheck = string.Equals(isMustCheck.ToString(), "是") ? true : false,
                 AdvanceDays = Convert.ToInt32(advanceDays),
                 CreateTime = DateTime.Now
             };
             if (allItems.Any(s => s.Name == maintainItem.Name))
                 sb.AppendLine($"第{num}行数据已存在!");
             if(maintainItems.Any(s => s.Name == maintainItem.Name))
                 sb.AppendLine($"第{num}行数据重复!");
             maintainItems.Add(maintainItem);
             num++;
         }
         if(sb.Length > 0)
         {
             throw new Exception(sb.ToString());
         }
         else
         {
             await _dbcontext.TpmMaintainItems.AddRangeAsync(maintainItems);
             await _dbcontext.SaveChangesAsync();
         }

         return new ExecResult(true, "");
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, "");
         return new ExecResult(false, "", ex.Message);
     }
 }
相关推荐
时光追逐者18 小时前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
前端·microsoft·开源·c#·.net·layui·.netcore
friklogff20 小时前
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
开发语言·c#·.net
@Unity打怪升级1 天前
【C#】CacheManager:高效的 .NET 缓存管理库
开发语言·后端·机器学习·缓存·c#·.net·.netcore
yufei-coder2 天前
.Net 9与AI开发
人工智能·.net
孟章豪2 天前
深入理解.NET中的委托与事件:实现灵活的事件驱动编程
.net
小彰4 天前
.Net 6.0 Windows平台如何判断当前电脑是否联网
windows·.net
小码编匠4 天前
.NET 中的表达式树(Expression Trees)
后端·c#·.net
编程乐趣4 天前
tesseract:一个.Net版本的开源OCR项目
ocr·.net
MicrosoftReactor5 天前
技术速递|适用于 .NET 和 .NET MAUI Android 应用程序的 Android 资产包
android·.net
AitTech5 天前
解析.NET框架与平台:构建高效应用程序的基石
.net