2009-01-18 32 views
1

我通過COM自動化(在C#中)使用Excel,但似乎問題無法控制在該框上啓動的Excel版本 - 我們同時使用Excel 9和Excel 11,並且一組特定的電子表格需要使用excel 9否則他們不會工作。如何在com自動化中啓動特定的excel版本?

我包含了excel 9 com引用,但在另一個人機器上啓動了excel 11。我怎樣才能解決這個問題 ?

+0

大多數用戶在同一個框上不會有兩個不同版本的Excel。作爲一名開發人員,你可能會這樣做,但用戶通常不會。如果用戶在他們的機器上安裝了Excel 11.0或更高版本,並且您需要Excel 9.0,那麼您遇到了問題... – 2009-01-18 21:11:29

+0

也許您可能想解釋爲什麼工作表無法在更高版本的Excel上正常運行?通常,較高版本的Excel應該能夠毫無困難地運行Excel 9.0電子表格。 – 2009-01-18 21:12:31

回答

0

我不能確定的問題ProgId的(在CLSID Guids上的友好名稱)用於Excel,但是快速查看會將我引導至「Excel.Application」,作爲您可能激活的類型。

看一下HKEY_CLASSES_ROOT,在我的機器上我看到「Excel.Application」和「Excel.Application.12」,我懷疑你正在激活「Excel.Application」,如果你看下「CurVer」鍵在「Excel.Application」下,它指向「Excel.Application.12」,在你的repro機器上檢查這個值。

我的猜測是你正在啓動Excel.Application,你可能想強制它啓動Excel.Application.9,如果你的目標機器上存在編號。

這裏是一個小的代碼示例:

 Type excel9Type = Type.GetTypeFromProgID("Excel.Application.9"); 
     Type excelType = Type.GetTypeFromProgID("Excel.Application"); 

     if (excelType == excel9Type) 
     { 
      Console.WriteLine("Default Excel.Application is pointing to 'Verion 9' yay"); 
     } 
     else 
     { 
      Console.WriteLine("Excel is installed, but it's not 'Version 9'"); 
     } 

     if (excel9Type == null) 
     { 
      throw new InvalidOperationException("Excel.Application.9 is not a registered progid"); 
     } 

     object excelApplication = Activator.CreateInstance(excel9Type); 

     // Cast excelApplication to whatever you are using as your application type. 
0

行,所以我檢查了兩臺機器這給不同的行爲,switiching到菲爾斯後提示激活解決方案。這兩臺機器都在CurVer regkey中有Excel.Application.9;但是一開始11,一開始9.到目前爲止,我仍然有點虧損。

我從Excel.Application.9返回的類型對象有XL11的一些證據內部調試指出。

還有什麼建議嗎?

0

什麼做的類ID的GUID的進程id對Excel.Application.9和0.11說在兩臺不同的機器?

0

爲了得到一個特定的Excel版本,你可以啓動二進制可執行文件,直接使用

System.Diagnostics.Process process = System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office11\Excel.exe"); 
int processId = process.Id; 

這會給你的Excel進程的ID。您現在可以連接到此Excel實例,並通過調用AccessibleObjectFromWindow來獲得對象模型。

此方法需要您使用P/Invoke,並且您還必須首先獲取Excel窗口的句柄。由於這是一個多一點的工作,我會簡單地引用這裏的一切詳細地說明以下問題:

How to use use late binding to get excel instance?

5

這無關CURVER。這是COM。與所有COM應用程序一樣,Windows通過引用註冊表中相關CLSID項中的LocalServer或InprocServer設置,找出如何啓動它們。

爲Excel的CLSID是:

{00024500-0000-0000-C000-000000000046} 

如果你看一下下HKCR \ CLSID這個鍵(HKCR \ Wow6432Node \ CLSID爲您運行的是Windows的64位版本),你會看到這些鍵。如果Excel 2003和Excel 2007的安裝,這三個按鍵:

HKCR\Excel.Appplication 
HKCR\Excel.Appplication.11 
HKCR\Excel.Appplication.12 

將指向相同的同一CLSID這就是爲什麼僅適用於Windows知道如何啓動Excel的一個版本。

如果您發現Excel 2003正在啓動它,因爲CLSID的子鍵指向OFFICE11安裝。

要更改此行爲,請將路徑更改爲指向OFFICE12(或OFFICE14)路徑。 Windows將首先使用該命令的Unicode變體(這是不可理解的)。所以除非你知道如何更新Unicode,否則只需刪除'command'值。