导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也不再累述。导入npoi封装的方法特别好,但是导出好像没有那一个是进行封装操作的,这两天正好有这块需求,所有就写了一个操作类xx,请不要看到xml就说这不是还要写东西吗,此封装是为了减少代码的书写。功能扩展基本上来源于XML。

需求分析

  1.首先我们要做的就是要把excel中的数据导入到数据库,基于项目中的导入封装,我要吧excel转为对象数据集即:list<model>,那么就需要我们的model要和excle的数据对象进行编写。

  2.在操作过程中会有一些特殊字段,比如PK(主键),外键(客户不知道id只能根据名称找到id)

  3.验证与判断:

        验证---是有些字段必须不能为空等

        判断----对象类型

        为此我们就大致知道我们的xml到底该怎么来定义了。如下图

基于 Aspose.Cells与XML导入excel 数据----操作类封装

图片上已经大致介绍了每个节点表示的什么意思。其中OracleType如果为空excel可以为空。其他节点就不再累述。

功能实现

  接下来实现就很简单了,只要获取excel数据集,让后获得对象数据的值把它和对象属性字段对象组成键值对,然后利用反射进行对象转换即可。

根基路径读取文件

        /// <summary>
        /// 根据文件路径,读取文件
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="strPath">文件地址</param>
        /// <param name="name">对象xml对应节点</param>
        /// <returns></returns>
        public List<T> ReadData<T>(string strPath, string name)
        {
            List<T> list = new List<T>();
            Workbook wb = new Workbook(strPath);
            foreach (Worksheet ws in wb.Worksheets)
            {
                if (ws.Name == "ReadOnly")
                    continue;

                ExcelToModel r = new ExcelToModel();
                var l = r.ReadTable<T>(ws, name);
                list.AddRange(l);

            }
            return list;
        }

  上述代码中支持多页excel上传如果你们像之上传第一页也行  list.AddRange(l) 合并list,你们可以把对象定义成嵌套对象也可以进行相应处理,在这不再累述。

具体实现代码

  /// <summary>
        /// 获取excel数据集合
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="ws">excel数据流</param>
        /// <param name="xmlNodeName">xml对应节点节点</param>
        /// <returns></returns>
        public List<T> ReadTable<T>(Worksheet ws, string xmlNodeName)
        {

            Cells all = ws.Cells;
            DataSet ds = new DataSet();
            ds.ReadXml(System.Web.HttpContext.Current.Request.MapPath("~/ImportFiles/InputRules.xml"));
            DataTable dt = ds.Tables[xmlNodeName];
            // 数据区
            int idx = -1;

            List<T> list = new List<T>();
            for (int i = 1; i < all.Rows.Count; i++)
            {
                T model = Activator.CreateInstance<T>();
                Dictionary<string, object> dic = new Dictionary<string, object>();
                for (int J = 0; J < ds.Tables[xmlNodeName].Rows.Count; J++)
                {
                    #region 获取excel表格中的值
                    int ExcelColumn = int.Parse(ds.Tables[xmlNodeName].Rows[J]["ExcelColumn"].ToString());
                    string OracleType = ds.Tables[xmlNodeName].Rows[J]["OracleType"].ToString();
                    string OracleColumn = ds.Tables[xmlNodeName].Rows[J]["OracleColumn"].ToString();

                    string ParameterName = ds.Tables[xmlNodeName].Rows[J]["ParameterName"].ToString();
                    string MethodName = ds.Tables[xmlNodeName].Rows[J]["MethodName"].ToString();
                    string strValue = string.Empty;
                    strValue = ExcelColumn > -1 ? all[i, ExcelColumn].StringValue : "";
                    if (!Verification(ExcelColumn, OracleType, strValue))
                        break;
                    if (!string.IsNullOrEmpty(ParameterName.ToString()))
                    {
                        string ParameterValue = all[i, int.Parse(ParameterName)].StringValue;
                        var factory = CustomParmeter_Factory.Cresate_CustomParmeter_Factory(MethodName, ParameterValue);
                        strValue = factory.GetCustomParmeter();
                        if (string.IsNullOrEmpty(strValue))
                            break;
                        if (OracleType == "Guid")
                            dic.Add(OracleColumn, new Guid(strValue));
                    }
                    else if (OracleType == "PK")
                        dic.Add(OracleColumn, Guid.NewGuid());
                    else if (OracleType == "datetime")
                        dic.Add(OracleColumn, Convert.ToDateTime(strValue));
                    else if (OracleType == "decimal")
                        dic.Add(OracleColumn, Convert.ToDecimal(strValue));
                    else if (OracleType == "int")
                        dic.Add(OracleColumn, Convert.ToInt32(strValue));
                    else if (OracleType == "Guid")
                        dic.Add(OracleColumn, new Guid(strValue));
                    else
                        dic.Add(OracleColumn, strValue);
                    #endregion
                }

                PropertyInfo[] modelPro = model.GetType().GetProperties();
                if (modelPro.Length > 0 && dic.Count() > 0)
                {
                    for (int z = 0; z < modelPro.Length; z++)
                    {
                        if (dic.ContainsKey(modelPro[z].Name))
                        {
                            modelPro[z].SetValue(model, dic[modelPro[z].Name], null);
                        }

                    }
                    list.Add(model);
                }
            }
            return list;
        }
View Code

相关文章:

  • 2021-09-27
  • 2022-01-27
  • 2022-12-23
  • 2022-01-05
  • 2022-12-23
  • 2021-11-23
  • 2022-12-23
猜你喜欢
  • 2021-10-12
  • 2021-09-23
  • 2021-11-27
  • 2021-08-20
  • 2022-12-23
相关资源
相似解决方案