關於oledb對Excel的讀取


這兩天項目需求要檢索excel的內容,於是就研究了一下,話不多說,我就直接貼代碼1.首先是連接excel。

public DataTable SearchSheetToDT(string strSearch, string sheetName)
        {
            //文件路徑
            string path = Server.MapPath("~/Content/custom/Excel1.xlsx");
            //連接表字符串
            string ExcelConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + @path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;ImportMixedTypes=Text'";
            using (OleDbConnection ole_conn = new OleDbConnection(ExcelConnection))
            {
                ole_conn.Open();
                using (OleDbCommand ole_cmd = ole_conn.CreateCommand())
                {
                    ole_cmd.CommandText = strSearch;
                    OleDbDataAdapter adapter = new OleDbDataAdapter(ole_cmd);
                    DataSet ds = new DataSet();
                    adapter.Fill(ds, sheetName);//sheetName就是excel里的sheet表名
                    DataTable dt = new DataTable();
                    dt = ds.Tables[0];
                    return dt;
                }
            }
        }

簡單解釋一下連接字符
HDR=Yes,這代表第一行是標題,不做為數據使用 ,如果用HDR=NO,則表示第一行不是標題,做為數據來使用。系統默認的是YES
IMEX 參數因為不同的模式代表著不同的讀寫行為:
  當 IMEX=0 時為“匯出模式”,這個模式開啟的 Excel 檔案只能用來做“寫入”用途。
  當 IMEX=1 時為“匯入模式”,這個模式開啟的 Excel 檔案只能用來做“讀取”用途。
  當 IMEX=2 時為“連結模式”,這個模式開啟的 Excel 檔案可同時支援“讀取”與“寫入”用途。
Provider=Microsoft.ACE.OLEDB.12.0;這說明是excel2007以上的版本,xls文件一般都是03版本,Provider=Microsoft.Jet.OLEDB.4.0; 

詳情連接字符根據版本怎么寫可以參照網站http://www.connectionstrings.com/excel/
在寫的時候可能出現“找不到可安裝的ISAM ”
這個時候出現這種情況多可能是你的連接語句缺斤少兩了,你仔細檢查Extended Properties='Excel 12.0;HDR=Yes;IMEX=2'"這個是不是少了分號什么的,我當時出錯是因為Data Source這個,少了一個空格,寫成了DataSource,找了好久。如果你確定真真沒錯,那就看看電腦有沒有excel,重新安裝ISAM唄。具體得操作步驟:在“運行”對話框中輸入以下內容Regsvr32 c:\WINDOWS\system32\msexcl40.dll  然后回車
之后就沒問題,連接上了。就看操作語句

 

public bool SearchIndexSheet(string k)
        {
            string strIndex = "select * from [sheet1$]";//這里sheet1就是你的表名是什么就寫什么,例如學生表就是 學生表$
            string sheetName = "[sheet1$]";
            DataTable indexdt = new DataTable();
            //讀取excel
            indexdt = SearchSheetToDT(strIndex, sheetName);
            //indexdt.DefaultView.RowFilter = "列名1='上證A股指數'";
            //查詢條件
            var reslut = indexdt.Select("列名1='" + k + "' or 列名2='" + k  + "'").ToList();
           if (reslut.Count != 0)
            {
                return true;
            }
            else return false;
        }

 

  可能有些人會直接寫string strIndex = "select * from [sheet1$] where [列名1]='"+k"'";這個也是可以的,只是有時候會報錯
例如這種錯誤 標准表達式中數據類型不匹配  ,不是因為你語句寫錯了,而是因為excel中有表達式,所以我就把數據取出來放在datatable里了。
基本上對於excel的讀取就這樣了。
這算是導入吧,導出還沒寫過。

 

     /// <summary>
        /// 查詢文檔-字段返回查詢
        /// </summary>
        /// <param name="k"></param>
        /// <returns></returns>
        public List<DataRow> SearchMatchSheet(string k)
        {
            string strMatch = "select * from [<span style="line-height: 19.2000007629395px;">表名1</span>$]";
            string sheetName = "[表名1$]";
            DataTable matchdt = new DataTable();
            matchdt = SearchSheetToDT(strMatch, sheetName);
            var reslut = matchdt.Select("列名1='" + k  + "'").ToList();
            return reslut;
        }

 


免責聲明!

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



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