最近,工作上接到Excel批量导入数据的需求。在这里,小编想分享的是数据校验那些事,至于如何读取Excel数据,大家可以百度下。
一般而言,Excel批量导入数据,我们都会给客户提供一个固定的模板以输入我们期望的数据。然而,客户的操作,我们是无法预料的,他们有可能增加一列或者删除一列,有可能去掉Excel某个字段的输入限制等等。
Excel模板,有可能只有一个,有可能若干个。各个模板的数据列,或交叉相同,或存在个性化列。
同一个模板,也许因某列数据的不同,而需要填充不同数据列。
......
面对一系列不确定因素,小编在此提出小小的解决方案。
我们可以定义这么一个类:
public class ExcelTemplate
{
/// <summary>
/// 列名
/// </summary>
public string ColumnName { get; set; }
/// <summary>
/// 是否必填
/// </summary>
public bool IsRequire { get; set; }
/// <summary>
/// 列类型
/// </summary>
public string ColumnType { get; set; }
}
有这么一个模板:
创建表头类
var myExcelTemplate = new List<ExcelTemplate>();
myExcelTemplate.Add(new ExcelTemplate() { ColumnName = "序号", IsRequire = true, ColumnType = "string" });
myExcelTemplate.Add(new ExcelTemplate() { ColumnName = "姓名", IsRequire = true, ColumnType = "string" });
myExcelTemplate.Add(new ExcelTemplate() { ColumnName = "入职日期", IsRequire = true, ColumnType = "DateTime" });
假如已经成功读取Excel数据
System.Data.DataTable excelData = GetDataFromExcel(excelPath);
这时候,校验Excel可以这样子~~
//判断是否存在数据行
if (excelData == null || excelData.Rows.Count <= 0)
{
//不存在数据行
return;
}
//遍历所有行
foreach (System.Data.DataRow row in excelData.Rows)
{
//遍历列
foreach (var item in myExcelTemplate)
{
//判断列合法性
if (!excelData.Columns.Contains(item.ColumnName))
{
//列非法
return;
}
//判断列是否必填
if (item.IsRequire && (row[item.ColumnName] == null || string.IsNullOrWhiteSpace(row[item.ColumnName].ToString())))
{
//空列
return;
}
//根据列类型尝试类型转换
switch (item.ColumnType)
{
case "DateTime":
{
if (!row[item.ColumnName].IsDateTime())
{
//类型转换失败
return;
}
break;
}
}
//...
}
}
欢迎指点哈哈。