1、通過OLEDB方式Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Sample.xlsx;Extended Properties=Excel 8.0;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Sample.xlsx;Extended Properties=Excel 12.0兩者區別:第一個可以訪問 Office 97-2003;第二個既可以訪問既可以訪問 Office 2007,也可以訪問 Office 97-2003如果使用第二個,需要安裝AccessDatabaseEngine.exe,可以從微軟官網下載。如果是使用64位作業系統,則外掛程式AccessDatabaseEngine.exe應該為64位如果是使用32位作業系統,則外掛程式AccessDatabaseEngine.exe應該為32位如果是使用64位作業系統,並且外掛程式AccessDatabaseEngine.exe是32位,需要將應用程式集區設定為“啟用32位應用程式”,或者sln編譯時間,選擇x86而不是anyCPU和x642、通過Microsoft.Office.Interop.Excel訪問問題:如果開啟Excel後,會彈出提示框,如請啟用等,都會失去Excel的控制,這時候訪問Excel都會報錯。處理方法:啟用Excel,new完Excel對象,設定excel.Interactive = false;完成後excel.Interactive = true;3、訪問Excel會有許可權限制。需要給DcomExcel賦許可權:(1、互動式使用者2、兩個everyone 全部許可權)問題:64位作業系統通過dcomcnfg.exe看不到32位的Excel DCOM,需要使用另一個命令命令列中輸入:mmc comexp.msc /32找到DCOM中的Excel標識頁簽裡,設定為:互動式使用者安全頁簽裡,設定“啟動和啟用許可權”為自訂,添加everyone所有使用權限設定“存取權限”為自訂,添加everyone所有許可權4、Excel訪問完成後,需要殺掉對應進程。方法1:遍曆所有進程,只要是Excel進程就殺掉。這個比較暴力,如果別人也在用會出現問題方法2:1、winform,console項目有效 IntPtr t = new IntPtr(app.Hwnd); int k = 0; GetWindowThreadProcessId(t, out k); //得到本進程唯一標誌k if (k != 0) { System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //得到對進程k的引用 p.Kill(); //關閉進程k } 2、web、webservices無效,GetWindowThreadProcessId(t, out k);執行完後,取不到進程Id,Id使用為0。網上說可能是許可權不足, 需要通過下邊方式提升許可權 TokPriv1Luid tp; IntPtr hproc = GetCurrentProcess(); IntPtr htok = IntPtr.Zero; if (OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok)) { //MessageBox.Show("OpenProcessToken="+htok.ToString()); } tp.Count = 1; tp.Luid = 0; tp.Attr = SE_PRIVILEGE_ENABLED; if (LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid)) { //MessageBox.Show("LookupPrivilegeValue="+tp.Luid.ToString()); } if (AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero)) { //MessageBox.Show("AdjustTokenPrivileges成功" + tp.Luid.ToString() +" ---"+tp.Count.ToString() + "---"+tp.Attr.ToString()); } 3、目前採用的是這種方式,也是可以殺掉該進程的 excel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); excel = null;