• 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

     就大功告成啦!

  • 相关阅读:
    Java EE
    C++基础学习(二)之判断
    C++基础学习(一)之循环
    AutoCAD完全卸载
    point-cloud-annotation-tool编译发烧记_UBUNTU
    Ubuntu18.04安装QT5
    Ubuntu安装VTK-8.1
    常用Latex公式代码表[持续更新]
    shp矢量文件批处理裁剪栅格影像_IDL/ENVI
    摄影测量基本原理
  • 原文地址:https://www.cnblogs.com/stephenzengx/p/13597413.html
Copyright © 2020-2023  润新知