C# 读取Excel并解析

        /// <summary>  
        /// 读取excel表格 转DataTable
        /// </summary>  
        /// <param name="FileFullPath">文件路径</param>  
        /// <param name="SheetName">表名</param>  
        /// <returns></returns>          
     public static DataTable GetExcelToDataTableBySheet(string FileFullPath, string SheetName="")
        {
            //SheetName = "Sheet1$";
            //HDR=Yes, 表示第一行为列名第二行才是数据 / HDR=No, 第一行就是数据;      
            string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + FileFullPath + ";Extended Properties='Excel 12.0; HDR=YES; IMEX=1'"; 
            using (OleDbConnection conn = new OleDbConnection(strConn))
            {
                DataSet ds = new DataSet();
                //如果想要按列过滤的话 eg: "SELECT * FROM [{0}] where [列名] is not null", 和sql有点类似
                OleDbDataAdapter odda = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}] where [列名] is not null", SheetName), conn); 
                odda.Fill(ds, SheetName);

                return ds.Tables[0];
            }
        }

        /// <summary>  
        /// DataTable 转换为List 集合(扩展方法)  
        /// </summary>  
        /// <param name="dt">DataTable</param>  
        /// <returns></returns>  
        public static List<T> ToList<T>(this DataTable dt)
        {
            //创建一个属性的列表  
            List<PropertyInfo> prlist = new List<PropertyInfo>();
            //获取TResult的类型实例  反射的入口  
            Type t = typeof(T);
            //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表   
            Array.ForEach(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
            //创建返回的集合  
            List<T> obList = new List<T>();

            foreach (DataRow row in dt.Rows)
            {
                //创建TResult的实例
                T ob = Activator.CreateInstance<T>();
                //T ob = new T();
                //找到对应的数据  并赋值  
                prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
                //放入到返回的集合中.  
                obList.Add(ob);
            }

            return obList;
        }

  运行程序时,可能报 "未在本地计算机上注册“microsoft.ACE.oledb.12.0"的错误,解决方案如下.

  1、安装数据访问组件:

  1)适用于office2007的

  Microsoft Access Database Engine 2007 Office system 驱动程序:数据连接组件
  https://download.csdn.net/download/willingtolove/12584343  (亲测没问题!xls和xlsx格式都可以成功读取!)

  2)适用于office2010的

  Microsoft Access Database Engine 2010 Redistributable
  https://www.microsoft.com/zh-CN/download/details.aspx?id=13255 (亲测没问题!注意x64还是x86!)
   2、如何是在web项目中执行进行转化, 在IIS应用程序池中,设置“”启用兼容32位应用程序”;
   IIS双击应用程序池->双击相关部署的项目->点击高级设置->启动32位应用程序 选择true

 

 就大功告成啦!

 

posted @ 2020-09-01 17:43  学无止境-小蜗牛  阅读(2953)  评论(0编辑  收藏  举报