這兩天項目需求要檢索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; }