訪問Excel的幾種方式介紹
更新時間:2013年08月23日 17:05:41 作者:
本文將為大家介紹下訪問Excel的幾種方式:通過OLEDB方式、通過Microsoft.Office.Interop.Excel訪問及其他相關等等,感興趣的朋友可以參考下,希望對大家有所幫助
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
兩者區(qū)別:第一個可以訪問 Office 97-2003;第二個既可以訪問既可以訪問 Office 2007,也可以訪問 Office 97-2003
如果使用第二個,需要安裝AccessDatabaseEngine.exe,可以從微軟官網下載。
如果是使用64位操作系統(tǒng),則插件AccessDatabaseEngine.exe應該為64位
如果是使用32位操作系統(tǒng),則插件AccessDatabaseEngine.exe應該為32位
如果是使用64位操作系統(tǒng),并且插件AccessDatabaseEngine.exe是32位,需要將應用程序池設置為“啟用32位應用程序”,或者sln編譯時,選擇x86而不是anyCPU和x64
2、通過Microsoft.Office.Interop.Excel訪問
問題:如果打開Excel后,會彈出提示框,如請激活等,都會失去Excel的控制,這時候訪問Excel都會報錯。
處理方法:激活Excel,new完Excel對象,設置excel.Interactive = false;完成后excel.Interactive = true;
3、訪問Excel會有權限限制。需要給DcomExcel賦權限:(1、交互式用戶2、兩個everyone 全部權限)
問題:64位操作系統(tǒng)通過dcomcnfg.exe看不到32位的Excel DCOM,需要使用另一個命令
命令行中輸入:mmc comexp.msc /32
找到DCOM中的Excel
標識頁簽里,設置為:交互式用戶
安全頁簽里,設置“啟動和激活權限”為自定義,添加everyone所有權限
設置“訪問權限”為自定義,添加everyone所有權限
4、Excel訪問完成后,需要殺掉對應進程
方法1:遍歷所有進程,只要是Excel進程就殺掉。這個比較暴力,如果別人也在用會出現(xiàn)問題
方法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);執(zhí)行完后,取不到進程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;
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
兩者區(qū)別:第一個可以訪問 Office 97-2003;第二個既可以訪問既可以訪問 Office 2007,也可以訪問 Office 97-2003
如果使用第二個,需要安裝AccessDatabaseEngine.exe,可以從微軟官網下載。
如果是使用64位操作系統(tǒng),則插件AccessDatabaseEngine.exe應該為64位
如果是使用32位操作系統(tǒng),則插件AccessDatabaseEngine.exe應該為32位
如果是使用64位操作系統(tǒng),并且插件AccessDatabaseEngine.exe是32位,需要將應用程序池設置為“啟用32位應用程序”,或者sln編譯時,選擇x86而不是anyCPU和x64
2、通過Microsoft.Office.Interop.Excel訪問
問題:如果打開Excel后,會彈出提示框,如請激活等,都會失去Excel的控制,這時候訪問Excel都會報錯。
處理方法:激活Excel,new完Excel對象,設置excel.Interactive = false;完成后excel.Interactive = true;
3、訪問Excel會有權限限制。需要給DcomExcel賦權限:(1、交互式用戶2、兩個everyone 全部權限)
問題:64位操作系統(tǒng)通過dcomcnfg.exe看不到32位的Excel DCOM,需要使用另一個命令
命令行中輸入:mmc comexp.msc /32
找到DCOM中的Excel
標識頁簽里,設置為:交互式用戶
安全頁簽里,設置“啟動和激活權限”為自定義,添加everyone所有權限
設置“訪問權限”為自定義,添加everyone所有權限
4、Excel訪問完成后,需要殺掉對應進程
方法1:遍歷所有進程,只要是Excel進程就殺掉。這個比較暴力,如果別人也在用會出現(xiàn)問題
方法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);執(zhí)行完后,取不到進程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;
相關文章
提示Outlook/Foxmail收取163郵件失?。篍RR 您沒有權限使用pop3功能
提示Outlook/Foxmail收取163郵件失?。篍RR 您沒有權限使用pop3功能...2007-12-12徐州市婚姻登記機關地址及聯(lián)系電話信息及需要的資料
登記一般需要身份證+戶口本(最好家人的都拿過去,一般需要看第一頁)2008-03-03終于明白了tc編譯的dos程序和vc編譯的win32控制臺程序的區(qū)別
終于明白了tc編譯的dos程序和vc編譯的win32控制臺程序的區(qū)別...2007-09-09