2012-01-26 62 views
1

我是人口使用VSTO如下一個Excel工作表:如何確保使用VSTO 4打開哪個版本的Excel?

Application app = new Application(); 
var wBook = app.Workbooks.Add(); 
var wSheet = (wBook.Worksheets[1] as Worksheet); 
/* Population algorithm */ 
app.Visible=true; 

創建片,一切都很好,但我已經安裝在我的工作環境不受Excel的兩個版本(Excel 2003和Excel 2010 )。上週

,當我第一次創建的代碼,Excel 2010中被顯示出來。但是,本週,Excel 2003打開了。

我的項目引用Microsoft.Office.Interop.Excel與最新版本(C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll,版本14)。

這是莫名其妙地在Windows的偏好,或者是它的東西我必須指定,當我創建應用程序的實例?

+0

另外,您可以針對2003 PIO,然後它不會不管哪個Excel打開。 – Jesse

+0

@Jesse我不明白,什麼是PIO?此外,我期待2010年開幕。 – SRKX

+1

對不起,PIA。你引用的dll。它們是向前兼容的,即2003年的PIA將自動執行2010年,但您將無法引用新功能。 – Jesse

回答

0

也許開始2010的Excel並得到處理它,下面的代碼可以幫助

public static void GetReferences(ref Microsoft.Office.Interop.Excel.Application _Application, ref Microsoft.Office.Interop.Excel.Workbook _Workbook) 
{ 
    EnumChildCallback cb; 
    // start exe 
    int hwnd = Process.Start("Excel 2010 path").MainWindowHandle; 


    if (hwnd != 0) 
    { 
     int hwndChild = 0; 
     cb = new EnumChildCallback(EnumChildProc); 
     EnumChildWindows(hwnd, cb, ref hwndChild); 


     if (hwndChild != 0) 
     { 
      const uint OBJID_NATIVEOM = 0xFFFFFFF0; 
      Guid IID_IDispatch = new Guid( 
       "{00020400-0000-0000-C000-000000000046}"); 
      Microsoft.Office.Interop.Excel.Window ptr = null; 

      int hr = AccessibleObjectFromWindow( 
        hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), ref ptr); 
      if (hr >= 0) 
      {     
       _Application = ptr.Application; 
       _Workbook = _Application.ActiveWorkbook; 
      } 
     } 
    } 
} 

[DllImport("Oleacc.dll")] 
public static extern int AccessibleObjectFromWindow( 
     int hwnd, uint dwObjectID, byte[] riid, 
     ref Microsoft.Office.Interop.Excel.Window ptr); 

public delegate bool EnumChildCallback(int hwnd, ref int lParam); 

[DllImport("User32.dll")] 
public static extern bool EnumChildWindows( 
     int hWndParent, EnumChildCallback lpEnumFunc, 
     ref int lParam); 


[DllImport("User32.dll")] 
public static extern int GetClassName( 
     int hWnd, StringBuilder lpClassName, int nMaxCount); 

public static bool EnumChildProc(int hwndChild, ref int lParam) 
{ 
    StringBuilder buf = new StringBuilder(128); 
    GetClassName(hwndChild, buf, 128); 
    if (buf.ToString() == "EXCEL7") 
    { 
     lParam = hwndChild; 
     return false; 
    } 
    return true; 

}

相關問題