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

 

 就大功告成啦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM