匯入excel資源到資料庫

Marzlam發表於2020-12-10

本質:  excel資源-》資料庫

場景: 使用者上傳個excel 想把這裡面資料 存資料庫 

流程:1 校驗資料  2.將可用資料進行儲存

如圖客戶要上傳的excel相關資訊

C# 程式碼

1.獲取

[HttpPost]
        public HttpResponseMessage ImportActivityCheck()
        {
            Response<object> response = new Response<object>();
            var file = HttpContext.Current.Request.Files[0]; //獲取選中檔案   
            if (file != null && file.ContentLength > 0)
            {

              //2 轉DataSet
                var ds = ExcelHelper.ExcelToDataSet(file.InputStream);

               //3驗證資料有效性
                var result = BasicLevelService.ImportActivityCheck(ds.Tables[0]);

              //4 返回有效結果進行預覽如果沒有客戶預覽  就直接儲存即可
                response.Result = result;
            }
            return JsonHelper.Instance.HttpResponse(response);
        }

2. Excel轉DataSet /datatable

        /// <summary>
        /// NPOI Excel轉DataSet
        /// </summary>
        /// <param name="excelServerPath"></param>
        /// <param name="hasTitle">是否有標題</param>
        /// <param name="isRemoveEmptyRow">是否移除空行</param>
        /// <returns></returns>
        public static DataSet ExcelToDataSet(Stream stream, bool hasTitle = true)
        {
            IWorkbook workBook = WorkbookFactory.Create(stream, ImportOption.All);

            DataSet ds = new DataSet();
            for (int i = 0; i < workBook.NumberOfSheets; i++)
            {
                ISheet sheet = workBook.GetSheetAt(i);
                DataTable dt = null;
                if (hasTitle)
                {
                    dt = SheetToDataTableHasTitle(sheet);
                }
                else
                {
                    dt = SheetToDataTable(sheet);
                }
                ds.Tables.Add(dt);
            }

            return RemoveEmptyRow(ds);
        }

 

3:進行資料檢驗    大多數情況 會預覽讓客戶知道 如圖 匹配情況

所以我們將匹配的集合返回 然後把不匹配的數量也返回

 /// <summary>
        /// 活動匯入資料驗證
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public List<ImportActivityCheckDto> ImportActivityCheck(DataTable dt)
        {
            if (dt.Rows.Count == 0) throw new Exception("無匯入資料");
            var result = new List<ImportActivityCheckDto>();
            var idCardArr = new ArrayList();
            foreach (DataRow row in dt.Rows)
            {
                
                try
                {
                    var entity = new ImportActivityCheckDto()
                    {
                        IdCard = row["身份證號"].ToString(),
                        Name = row["姓名"].ToString(),
                        Title = row["活動名稱"].ToString(),
                        TypeText = row["活動型別"].ToString(),
                        StartDate = DateTime.FromOADate(double.Parse(row["活動參與時間"].ToString()))

                    };
                    idCardArr.Add(entity.IdCard);
                    result.Add(entity);
                }
                catch (Exception e)
                {
                    var entity = new ImportActivityCheckDto()
                    {
                        IdCard = row["身份證號"].ToString(),
                        Name = row["姓名"].ToString(),
                        Title = row["活動名稱"].ToString(),
                        TypeText = row["活動型別"].ToString(),
                        StartDate = null

                    };
                    idCardArr.Add(entity.IdCard);
                    result.Add(entity);

                }          
               
               
            }
            string sql = $"select Id,IdCard,LastRestTime from MHBasicLevelCadre where IdCard in ('{string.Join("','", idCardArr.ToArray())}')";
      
            var levelCadres = this.MHBasicLevelCadreApp.Repository.SqlQuery<ActivityCheckDto>(sql).ToList();
            var activityList = Enumeration.GetAll<ActivityEnum>().ToList();
            foreach (var item in result)
            {
                var entity = levelCadres.FirstOrDefault(c => c.IdCard == item.IdCard);
                //找不到人
                if (entity == null)
                {
                    item.MateResult = ActivityMateResultEnum.找不到人.Code;
                    item.ErrorMsg = "檔案無法匹配";
                    continue;
                }
                var typeEntity = activityList.FirstOrDefault(c => c.Name == item.TypeText);
                //型別不匹配
                if (typeEntity == null)
                {
                    item.MateResult = ActivityMateResultEnum.型別無法匹配.Code;
                    item.ErrorMsg = "活動型別無法匹配";
                    continue;
                }
                item.Type = typeEntity.Code;
                var count = result.Count(c => c.Type == item.Type && c.IdCard == item.IdCard && c.StartDate == item.StartDate);
                //時間衝突
                if (count > 1||item.StartDate==null)
                {
                    item.MateResult = ActivityMateResultEnum.資料重複.Code;
                    item.ErrorMsg = "時間衝突";
                    continue;
                }
               
                item.CadreId = entity.Id;
                item.MateResult = ActivityMateResultEnum.成功.Code;
            }
            return result;
        }

 

 

4:預覽過後   客戶可能會修改資料  或者 執意要儲存   

但是這時候儲存的資料就是前端把資料給到後端來了,所以只是將資料儲存操作即可

如果沒有客戶預覽的過程 那就 直接在第3步驟  直接儲存那些有效的即可 不用傳給前端預覽  也就不會有第4步驟 在傳回來儲存的操作了

相關文章