/// <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
就大功告成啦!