Как убедиться, какая версия Excel открыта с помощью VSTO 4? - PullRequest
1 голос
/ 26 января 2012

Я заполняю лист Excel, используя VSTO следующим образом:

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, или это то, что я должен указать при создании экземпляра приложения?

1 Ответ

0 голосов
/ 30 января 2012

возможно, запустите Excel 2010 и получите справку, приведенный ниже код может помочь

 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; 

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...