最近,工作上接到Excel批量導入數據的需求。在這里,小編想分享的是數據校驗那些事,至於如何讀取Excel數據,大家可以百度下。
一般而言,Excel批量導入數據,我們都會給客戶提供一個固定的模板以輸入我們期望的數據。然而,客戶的操作,我們是無法預料的,他們有可能增加一列或者刪除一列,有可能去掉Excel某個字段的輸入限制等等。
Excel模板,有可能只有一個,有可能若干個。各個模板的數據列,或交叉相同,或存在個性化列。
同一個模板,也許因某列數據的不同,而需要填充不同數據列。
......
面對一系列不確定因素,小編在此提出小小的解決方案。
我們可以定義這么一個類:
1 public class ExcelTemplate 2 { 3 /// <summary> 4 /// 列名 5 /// </summary> 6 public string ColumnName { get; set; } 7 8 /// <summary> 9 /// 是否必填 10 /// </summary> 11 public bool IsRequire { get; set; } 12 13 /// <summary> 14 /// 列類型 15 /// </summary> 16 public string ColumnType { get; set; } 17 }
有這么一個模板:
創建表頭類
1 var myExcelTemplate = new List<ExcelTemplate>(); 2 myExcelTemplate.Add(new ExcelTemplate() { ColumnName = "序號", IsRequire = true, ColumnType = "string" }); 3 myExcelTemplate.Add(new ExcelTemplate() { ColumnName = "姓名", IsRequire = true, ColumnType = "string" }); 4 myExcelTemplate.Add(new ExcelTemplate() { ColumnName = "入職日期", IsRequire = true, ColumnType = "DateTime" });
假如已經成功讀取Excel數據
1 System.Data.DataTable excelData = GetDataFromExcel(excelPath);
這時候,校驗Excel可以這樣子~~
1 //判斷是否存在數據行 2 if (excelData == null || excelData.Rows.Count <= 0) 3 { 4 //不存在數據行 5 return; 6 } 7 8 //遍歷所有行 9 foreach (System.Data.DataRow row in excelData.Rows) 10 { 11 //遍歷列 12 foreach (var item in myExcelTemplate) 13 { 14 //判斷列合法性 15 if (!excelData.Columns.Contains(item.ColumnName)) 16 { 17 //列非法 18 return; 19 } 20 21 //判斷列是否必填 22 if (item.IsRequire && (row[item.ColumnName] == null || string.IsNullOrWhiteSpace(row[item.ColumnName].ToString()))) 23 { 24 //空列 25 return; 26 } 27 28 //根據列類型嘗試類型轉換 29 switch (item.ColumnType) 30 { 31 case "DateTime": 32 { 33 if (!row[item.ColumnName].IsDateTime()) 34 { 35 //類型轉換失敗 36 return; 37 } 38 break; 39 } 40 } 41 42 //... 43 44 } 45 }