• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#读取Excel并解析

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
        /// <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

 

 就大功告成啦!

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#事件以及EventHandler、EventArgs发布时间:2022-07-13
下一篇:
【源代码】西门子Simatic.NET与VisualC#异步通讯的代码发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap