C# Excel 导入验证

实体类写法,带上描述+验证规则

public class Entity

    {

        [Requiring()]

        [Description("经销商代码")]

       public const int DEALER_CODE = 3;

 

        [Requiring(), ListRule("01,02,03", ",")]

        [Description("品牌")]

       public const int BRAND = 5;

 

        [Requiring(), DateOnlyRule()]

        [Description("申请时间")]

       public const int S01_DATE = 8;

}

 

调用Excel上传的写法

// Locate Sheet

                   var XlsxSheet = XlsxFile.Workbook.Worksheets[cboSheets.SelectedItem.ToString()];

 

                   // Checking

                    Logger.Clear();

                   "Checking Data...".AddLogTo(Logger);

                    CheckResilt = XlsxSheet.Check(Logger);

                   "Check Complete.".AddLogTo(Logger);

 

                    // Cancel if not pass.

                   if (!CheckResilt)

                    {

                       "Coversion Cancelled.".AddLogTo(Logger);

                       return;

                    }

相关判断规则和帮助方法

 

 

/// <summary>

   /// EPPlus Extension

   /// </summary>

   public static class EPPlusExtension

    {

 

       #region Check

 

       /// <summary>

       /// Check.

       /// </summary>

       /// <param name="Sheet">Sheet.</param>

       /// <param name="Logger">Logger.</param>

       /// <returns></returns>

       public static bool Check(this ExcelWorksheet Sheet, IList Logger)

        {

           int RowNo = 2; bool Result = true;

           while (Sheet.HasData(RowNo))

                Result &= Sheet.Check(RowNo++, Logger);

           return Result;

        }

 

       /// <summary>

       /// Check.

       /// </summary>

       /// <param name="Sheet">Excel Worksheet.</param>

       /// <param name="RowNo">Row No.</param>

       /// <param name="Logger">Logger.</param>

       /// <returns></returns>

       internal static bool Check(this ExcelWorksheet Sheet, int RowNo, IList Logger)

        {

           bool Result = true;

 

           foreach (var Col in GetOrderedColumns())

            {

               var Value = Sheet.Cells[RowNo, Col.GetColNo()].Text;

               var Req = Col.GetCustomAttribute<RequiringAttribute>();

               var Rule = Col.GetCustomAttribute<RuleAttribute>();

               var Desc = Col.GetCustomAttribute<DescriptionAttribute>();

 

               if (Value.IsNullOrEmpty())

                {

                   if (Req.IsRequired(ref Sheet, RowNo))

                        Result &= Req.GetErrorMessage(Col.GetCellName(RowNo), Desc.Description).AddLogTo(Logger, false);

                    continue;

                }

 

               if (Rule != null && !Rule.Check(Value))

                {

                    Result &= Rule.GetErrorMessage(Col.GetCellName(RowNo), Desc.Description).AddLogTo(Logger, false);

                   continue;

                }

            }

 

           return Result;

        }

 

       #endregion

 

       #region Export

 

       /// <summary>

       /// Export.

       /// </summary>

       /// <param name="Sheet">Sheet.</param>

       /// <param name="Stream">Stream.</param>

       /// <param name="Logger">Logger.</param>

       public static void Export(this ExcelWorksheet Sheet, ref Stream Stream, IList Logger)

        {

           int RowNo = 1; StreamWriter File = null;

           using (File = new StreamWriter(Stream, Encoding.UTF8))

               while (Sheet.HasData(RowNo))

                    Sheet.Export(RowNo++, ref File, Logger);

        }

 

       /// <summary>

       /// Export.

       /// </summary>

       /// <param name="Sheet">Sheet.</param>

       /// <param name="RowNo">Row No.</param>

       /// <param name="File">File.</param>

       /// <param name="Logger">Logger.</param>

       internal static void Export(this ExcelWorksheet Sheet, int RowNo, ref StreamWriter File, IList Logger)

        {

            List<string> Line = new List<string>();

 

            GetOrderedColumns().ForEach((Col) =>

            {

               var Value = Sheet.Cells[RowNo, Col.GetColNo()].Text;

               var Rule = Col.GetCustomAttribute<RuleAttribute>();

 

                Value = Value.NVL().ReplaceToEmpty("\r\n", "\n");

 

               if (RowNo != 1 && Rule is DigitsRuleAttribute)

                    Value = ((DigitsRuleAttribute)Rule).Format(Value).ReplaceToEmpty(",");

 

                Line.Add(Value);

            });

 

            File.WriteLine(Line.Join());

        }

 

       #endregion

 

       #region Columns

 

       /// <summary>

       /// Has Data

       /// </summary>

       /// <param name="Sheet">Excel Worksheet.</param>

       /// <param name="RowNo">Row No.</param>

       /// <returns></returns>

       public static bool HasData(this ExcelWorksheet Sheet, int RowNo)

        {

           return !Sheet.Cells[RowNo, RENDEF.REN_ID].Text.IsNullOrWhiteSpace();

        }

 

       /// <summary>

       /// Get Ordered Columns

       /// </summary>

       private static Func<List<FieldInfo>> GetOrderedColumns = () =>

           typeof(RENDEF).GetFields(BindingFlags.Static | BindingFlags.Public).ToList();

 

       /// <summary>

       /// Get Cell Name.

       /// </summary>

       /// <param name="Col"></param>

       /// <param name="RowNo"></param>

       /// <returns></returns>

       public static string GetCellName(this FieldInfo Col, int RowNo)

        {

            Func<int, string> GetColName = (n) =>

            {

               int m = 0; string s = string.Empty;

               while (n > 0) { m = n % 26; if (m == 0) m = 26; s = (char)(m + 64) + s; n = (n - m) / 26; }

               return s;

            };

 

           return GetColName((int)Col.GetRawConstantValue()) + RowNo.ToString();

        }

 

       /// <summary>

       /// Get Column Number.

       /// </summary>

       /// <param name="Col"></param>

       /// <returns></returns>

       public static int GetColNo(this FieldInfo Col)

        {

           return (int)Col.GetRawConstantValue();

        }

 

       /// <summary>

       /// Get Custom Attribute (Generic Version, For .NET Fx 4.0).

       /// </summary>

       /// <typeparam name="T">Type.</typeparam>

       /// <param name="Col"></param>

       /// <param name="inherit"></param>

       /// <returns></returns>

       public static T GetCustomAttribute<T>(this FieldInfo Col, bool inherit = false)

        {

           return (T)Col.GetCustomAttributes(typeof(T), inherit).FirstOrDefault();

        }

 

       #endregion

}

 

/// <summary>

   /// Description Attribute

   /// </summary>

   public class DescriptionAttribute : Attribute

    {

       /// <summary>

       /// Description

       /// </summary>

       public string Description;

 

       /// <summary>

       /// Description

       /// </summary>

       /// <param name="Description">Description</param>

       public DescriptionAttribute(string Description)

        {

           this.Description = Description;

        }

    }

 

 

/// <summary>

   /// Requiring Attribute

   /// </summary>

   public class RequiringAttribute : Attribute

    {

       /// <summary>

       /// Whether Required?

       /// </summary>

       /// <remarks>

       /// Set this value to null, to indicates Conditional Requirements.

       /// </remarks>

       public bool? YesOrNo = null;

 

       /// <summary>

       /// 条件性必填时的要判断的列。

       /// </summary>

       public int OnlyWhen;

 

       /// <summary>

       /// 条件性必填时的要判断的值。

       /// </summary>

       public string IsValue;

 

       /// <summary>

       /// 是否必填

       /// </summary>

       /// <param name="YesOrNo"></param>

       public RequiringAttribute(bool YesOrNo = true)

        {

           this.YesOrNo = YesOrNo;

        }

 

       /// <summary>

       /// 条件性必填

       /// </summary>

       /// <param name="OnlyWhen">条件列</param>

       /// <param name="IsValue">判断值</param>

       public RequiringAttribute(int OnlyWhen, string IsValue)

        {

           this.YesOrNo = null;

           this.OnlyWhen = OnlyWhen;

           this.IsValue = IsValue;

        }

 

       /// <summary>

       /// 是否需要

       /// </summary>

       /// <param name="Sheet"></param>

       /// <param name="rowno"></param>

       /// <returns></returns>

       public bool IsRequired(ref ExcelWorksheet Sheet, int rowno)

        {

           if (YesOrNo.HasValue) return YesOrNo.Value;

           else return Sheet.Cells[rowno, OnlyWhen].Value.Equals(IsValue);

        }

 

       /// <summary>

       /// Get Error Message

       /// </summary>

       /// <param name="Cell">Cell.</param>

       /// <param name="Desc">Description.</param>

       /// <returns></returns>

       public string GetErrorMessage(string Cell, string Desc)

        {

           return string.Format("单元格[{0}]的项目({1})为必填项。", Cell, Desc);

        }

    }

 

/// <summary>

   /// Rule Attribute (Abstract)

   /// </summary>

   public abstract class RuleAttribute : Attribute

    {

       /// <summary>

       /// Check

       /// </summary>

       /// <param name="Value">值</param>

       /// <returns></returns>

       public abstract bool Check(string Value);

 

       /// <summary>

       /// Get Error Message.

       /// </summary>

       /// <param name="Cell">Cell.</param>

       /// <param name="Desc">Description.</param>

       /// <returns></returns>

       public abstract string GetErrorMessage(string Cell, string Desc);

    }

 

 

   /// <summary>

   /// List Rule Attribute

   /// </summary>

   public class ListRuleAttribute : RuleAttribute

    {

       /// <summary>

       /// Items.

       /// </summary>

        List<string> Items = null;

 

       /// <summary>

       /// List Rule

       /// </summary>

       /// <param name="ItemList">Item List. (Default is "/", when spliting.)</param>

       public ListRuleAttribute(string ItemList) : this(ItemList, "/") { }

 

       /// <summary>

       /// List Rule

       /// </summary>

       /// <param name="ItemList">Item List.</param>

       /// <param name="Separator">Separator.</param>

       public ListRuleAttribute(string ItemList, params string[] Separator)

        {

            Items = ItemList.Split(Separator, StringSplitOptions.RemoveEmptyEntries).ToList();

        }

 

       /// <summary>

       /// Check.

       /// </summary>

       /// <param name="Value">Value.</param>

       /// <returns></returns>

       public override bool Check(string Value)

        {

           return Items.Contains(Value);

        }

 

       /// <summary>

       /// Get Error Message

       /// </summary>

       /// <param name="Cell">Cell.</param>

       /// <param name="Desc">Description.</param>

       /// <returns></returns>

       public override string GetErrorMessage(string Cell, string Desc)

        {

           return string.Format("单元格[{0}]中的项目({1})应该填入{{{2}}}中的值之一。", Cell, Desc, string.Join(",", Items));

        }

    }

 

   /// <summary>

   /// Date Only Rule Attribute

   /// </summary>

   public class DateOnlyRuleAttribute : RuleAttribute

    {

       string Format;

 

       /// <summary>

       /// Date Only Rule.

       /// </summary>

       /// <param name="Format"></param>

       public DateOnlyRuleAttribute(string Format = "yyyyMMdd")

        {

           this.Format = Format;

        }

 

       /// <summary>

       /// Check.

       /// </summary>

       /// <param name="Value">Value。</param>

       /// <returns></returns>

       public override bool Check(string Value)

        {

           var Value2 = string.Format("{0}/{1}/{2}", Strings.Left(Value, 4), Strings.Mid(Value, 5, 2), Strings.Mid(Value, 7, 2));

 

            DateTime Output;

           return DateTime.TryParse(Value2, out Output);

        }

 

       /// <summary>

       /// Get Error Message

       /// </summary>

       /// <param name="Cell">Cell.</param>

       /// <param name="Desc">Description.</param>

       /// <returns></returns>

       public override string GetErrorMessage(string Cell, string Desc)

        {

           return string.Format("单元格[{0}]中的项目({1})应该填入:YYYYMMDD格式的日期。", Cell, Desc);

        }

    }

 

   /// <summary>

   /// Digits Rule Attribute

   /// </summary>

   public class DigitsRuleAttribute : RuleAttribute

    {

       /// <summary>

       /// Digits

       /// </summary>

        public int Digits;

 

       /// <summary>

       /// Digits Rule

       /// </summary>

       /// <param name="Digits">Digits</param>

       public DigitsRuleAttribute(int Digits)

        {

           this.Digits = Digits;

        }

 

       /// <summary>

       /// Check

       /// </summary>

       /// <param name="Value">Value.</param>

       /// <returns></returns>

       public override bool Check(string Value)

        {

           if (Digits > 0)

            {

               decimal output;

               return decimal.TryParse(Value, out output);

            }

           else if (Digits == 0)

            {

               int output;

               return int.TryParse(Value, out output);

            }

           else

               throw new ArgumentException("Digits could not less than 0.", "Digits");

        }

 

       /// <summary>

       /// Get Error Message.

       /// </summary>

       /// <param name="Cell">Cell.</param>

       /// <param name="Desc">Description.</param>

       /// <returns></returns>

       public override string GetErrorMessage(string Cell, string Desc)

        {

           return string.Format("单元格[{0}]中的项目({1})应该填入:{2}位小数。", Cell, Desc, Digits);

        }

 

       /// <summary>

       /// Format.

       /// </summary>

       /// <param name="Value">Value.</param>

       /// <returns></returns>

       public string Format(string Value)

        {

           if (Value.IsNullOrWhiteSpace())

                Value = "0";

 

            if (Digits > 0)

            {

               decimal output;

               decimal.TryParse(Value, out output);

               return output.ToString("0." + new string('0', Digits));

            }

           else if (Digits == 0)

            {

                int output;

               int.TryParse(Value, out output);

               return output.ToString("0");

            }

           else

               throw new ArgumentException("Digits could not less than 0.", "Digits");

        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,将Excel数据导入到数据库可以通过以下步骤实现: 1. 首先,创建一个用于存储Excel数据的DataTable对象。可以使用第二个引用中的代码,通过选择Excel文件并将其数据加载到DataTable中。 2. 在保存到数据库之前,需要确保DataTable中有有效的数据。可以使用第一个引用中的代码,对DataTable进行验证。 3. 然后,使用一个循环遍历DataTable中的每一行数据,并将其插入到数据库表中。可以使用第三个引用中的方法,创建一个SQL语句将Excel数据逐行插入到数据库表中。 4. 最后,根据需要,在数据插入完成后显示相应的提示信息。 需要注意的是,在插入数据时,可以选择使用事务来确保数据的完整性和一致性。可以根据需求,选择在每查询一个对象就提交一次到数据库,或者每遍历一次就生成一条SQL语句,根据事务提交到数据库。 这样,通过以上步骤,可以将Excel中的数据成功导入到数据库中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C#学习笔记---通过Excel导入数据库](https://blog.csdn.net/xhtom44301/article/details/128666198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C# Excel导入数据库](https://download.csdn.net/download/water17ball/2658931)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值