2016-01-29 9 views
5

Mam aplikację C# i musi utworzyć aplikację Excel &, a następnie otworzyć skoroszyt. Problem polega na tym, że potrzebuję wtyczki Bloomberg do załadowania, gdy otworzy się program Excel. Jedyny sposób, jaki znalazłem, to ten wpis: working example.startowa aplikacja z dodatkami z aplikacji C#

To naprawdę zaczyna się doskonale i może korzystać z funkcji Bloomberg. Jednak zastanawiałem się, czy istnieje sposób na przesyłanie myXl do xlApp, gdzie xlApp jest typu Microsoft.Office.Interop.Excel.Application?

var myXl = Process.Start("excel.exe"); 

Powodem jest to, że posiada bibliotekę, która ma kilka przydatnych funkcji pragnę wykorzystać, ale to wymaga parametr typu Microsoft.Office.Interop.Excel.Application. Jak mam to zrobic?

+2

Dodaj odwołanie do biblioteki Excela i zamiast var myXL można instancję obiektu skoroszytu Excel.Application myXl = New Excel.Application(); – Sorceri

+0

Problem w tym, że dodatek bloomberg nie ładuje się przy użyciu tej metody. – mHelpMe

+0

Widziałeś ten post: http: // stackoverflow.com/questions/213375/loading-addins-when-excel-is-instancja-programowo –

Odpowiedz

0

Dodaj odwołanie do biblioteki Excela i zamiast var myXL można instancję obiektu skoroszytu

Excel.Application myXl = New Excel.Application(); 

Wtedy po prostu trzeba ręcznie załadować dodatek.

 foreach (Excel.AddIn item in myXl.AddIns) 
     { 
      if (item.Name.Equals("BLOOMBERG ADDIN NAME")) 
      { 
       item.Installed = true; 
      } 
     } 
3

Możesz zautomatyzować program Excel z zewnętrznej aplikacji. Aby uzyskać więcej informacji, zobacz How to automate Microsoft Excel from Microsoft Visual C#.NET i C# app automates Excel (CSAutomateExcel).

Klasa Application zapewnia następujące właściwości dostępu dodatki:

  • AddIns - zwraca AddIns kolekcję, która reprezentuje wszystkie dodatki wymienione w oknie dialogowym Add-Ins (Add-Ins polecenie karta Deweloper); Dodatki XLL.
  • - zwraca kolekcję COMAddIns dla programu Microsoft Excel, która reprezentuje aktualnie zainstalowane dodatki COM.

Tak więc, jeśli chcesz mieć pewność, że dodatek COM jest włączony, musisz użyć właściwości ComAddins klasy Application.

1

można użyć następującego kodu:

Ten rozpocznie Excel, a następnie przejść przez wszystkich skoroszytach zarejestrowane w biegu tabeli obiektów, aby znaleźć taki, który działa w proces właśnie się rozpoczął. Aby to zrobić, pobiera identyfikator procesu uchwytu okna skoroszytu i porównuje go z identyfikatorem właśnie rozpoczętego procesu.

Ten wygląd w tabeli obiektów do biegania powtarza się kilka razy z okresami oczekiwania, ponieważ program Excel może potrzebować czasu na zarejestrowanie się w ROT po jego uruchomieniu. Może być konieczne zwiększenie liczby maxAttempts i waitTimeMS na wolniejszych komputerach.

Po znalezieniu prawidłowego skoroszytu zostanie on zwrócony. W próbce napiszę "Witaj świecie" w pierwszej komórce instancji aplikacji Excel.

private void button1_Click(object sender, EventArgs e) 
{ 
    Microsoft.Office.Interop.Excel.Application excelApplication = StartExcel(); 

    if (excelApplication != null) 
    { 
     excelApplication.ActiveCell.Value = "Hello World"; 
    } 
} 

[DllImport("user32.dll", SetLastError = true)] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); 

[DllImport("ole32.dll")] 
private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); 

private Microsoft.Office.Interop.Excel.Application StartExcel() 
{ 
    // Maximum number of attempts to look for started Excel Application 
    const int maxAttempts = 3; 
    // Number of milliseconds to wait between attempts to look for started Excel Application 
    const int waitTimeMS = 200; 

    Microsoft.Office.Interop.Excel.Application result = null; 

    // Start Excel 
    var process = Process.Start("Excel.exe"); 
    process.WaitForInputIdle(); 

    // Try to find started Excel Application 

    int currentAttempt = 1; 

    while ((result == null) && (currentAttempt <= maxAttempts)) 
    { 
     // Wait between attempts 
     if(currentAttempt != 1) 
     { 
      Thread.Sleep(waitTimeMS); 
     } 

     // List all running Excel automation objects and find the one with the same process id 
     IRunningObjectTable lRunningObjectTable = null; 
     IEnumMoniker lMonikerList = null; 

     try 
     { 
      // Query Running Object Table 
      if (GetRunningObjectTable(0, out lRunningObjectTable) == 0 && lRunningObjectTable != null) 
      { 

       // List Monikers 
       lRunningObjectTable.EnumRunning(out lMonikerList); 

       // Start Enumeration 
       lMonikerList.Reset(); 

       // Array used for enumerating Monikers 
       IMoniker[] lMonikerContainer = new IMoniker[1]; 

       IntPtr lPointerFetchedMonikers = IntPtr.Zero; 

       // foreach Moniker 
       while (lMonikerList.Next(1, lMonikerContainer, lPointerFetchedMonikers) == 0) 
       { 
        object lComObject; 
        lRunningObjectTable.GetObject(lMonikerContainer[0], out lComObject); 

        // Check the object is an Excel workbook 
        if (lComObject is Microsoft.Office.Interop.Excel.Workbook) 
        { 
         Microsoft.Office.Interop.Excel.Workbook lExcelWorkbook = (Microsoft.Office.Interop.Excel.Workbook)lComObject; 

         // Get the Process ID for the Window Handle 
         uint processId; 
         GetWindowThreadProcessId(new IntPtr(lExcelWorkbook.Application.Hwnd), out processId); 

         if (processId == process.Id) 
         { 
          // Correct automation object found, return Application 
          result = lExcelWorkbook.Application; 
          break; 
         } 
        } 
       } 
      } 
     } 
     finally 
     { 
      // Release ressources 
      if (lRunningObjectTable != null) Marshal.ReleaseComObject(lRunningObjectTable); 
      if (lMonikerList != null) Marshal.ReleaseComObject(lMonikerList); 
     } 

     currentAttempt++; 
    } 


    return result; 
} 
Powiązane problemy