/// <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

就大功告成啦!