• Excel批量导入数据之数据校验


    最近,工作上接到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             }
  • 相关阅读:
    C# .Net WinForm控件GDI+重绘位置错乱
    查询视图对应的基表名以及视图字段和对应的基表字段名
    解决在高分屏下开发winform界面变形
    ping命令工具:同时ping多个IP
    SmartAssembly批处理用法
    C#二维数组的初始化和存取
    win7 X64 进程名称不一致,导致杀进程失效!
    在存储过程中声明局部游标以循环调用自身
    强制设置双缓冲DoubleBuffered 解决tableLayoutPanel 闪烁
    Using SmartAssembly with MSBuild
  • 原文地址:https://www.cnblogs.com/maiaimei/p/7196589.html
Copyright © 2020-2023  润新知