2009-02-05 12 views
6

Mam starszą aplikację, która jest zaimplementowana w wielu skoroszytach programu Excel. Nie jest to coś, co mam prawo do ponownego wdrożenia, jednak inna aplikacja, którą utrzymuję, musi mieć możliwość wywoływania funkcji w skoroszycie programu Excel.Steruj 2 oddzielnymi wystąpieniami programu Excel przez COM niezależnie ... czy można to zrobić?

Został podany interfejs Pythona przy użyciu biblioteki Win32Com. Inne procesy mogą wywoływać funkcje w moim pakiecie Pythona, który z kolei wywołuje funkcje, których potrzebuję poprzez Win32Com.

Niestety, COM nie pozwala mi określić konkretnego procesu COM, więc w tej chwili, bez względu na to, jak potężny jest mój serwer, mogę kontrolować tylko jedno wystąpienie programu Excel na raz na komputerze. Gdybym próbował uruchomić więcej niż jedno wystąpienie programu Excel, nie byłoby sposobu na zapewnienie, że warstwa Pythona jest powiązana z określoną instancją programu Excel.

Chciałbym móc uruchomić więcej niż jedną z moich aplikacji Excel na moim serwerze Windows jednocześnie. Czy jest jakiś sposób na zrobienie tego? Na przykład, czy mogę umieścić moje środowisko w taki sposób, aby móc uruchomić tyle kombinacji Excela i Pythona, ile obsługuje moja aplikacja?

Odpowiedz

2

Nic nie wiem o Pythonie, ale jeśli działa przez COM, Excel nie jest aplikacją o pojedynczej instancji, więc powinieneś być w stanie stworzyć tyle wystąpień programu Excel, ile pozwala na to pamięć.

Korzystanie z C# można utworzyć wiele instancji aplikacji Excel poprzez:

Excel.Application xlApp1 = new Excel.Application(); 
Excel.Application xlApp2 = new Excel.Application(); 
Excel.Application xlApp3 = new Excel.Application(); 

Korzystanie późnego wiązania w C# można użyć:

object objXL1 = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); 
object objXL2 = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); 
object objXL3 = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); 

przypadku korzystania VB.NET, VB6 lub VBA można użyć CreateObject w następujący sposób:

Dim objXL1 As Object = CreateObject("Excel.Application") 
Dim objXL2 As Object = CreateObject("Excel.Application") 
Dim objXL3 As Object = CreateObject("Excel.Application") 

Niestety, w Pythonie, nie mam pojęcia. Ale jeśli nie ma jakiegoś ograniczenia dla Pythona (którego nie mogę sobie wyobrazić?), Pomyślałbym, że jest to bardzo użyteczne.

To powiedziawszy, pomysł posiadania wielu wystąpień programu Excel, działającego jako serwer dla innych operacji, brzmi dość dicio ... Byłbym ostrożny, aby przetestować to, co robisz, szczególnie w odniesieniu do liczby instancji może mieć otwarte od razu bez wyczerpania pamięci i co stanie się z programem wywołującym, jeśli z jakiegoś powodu program Excel się zawiesił.

+0

Tak, to nie problem, począwszy od dwóch różnych wystąpień programu Excel; tylko, że nie możesz mieć otwartych wielu aplikacji Excel i przechwyć ich proces COM używając GetObject ... –

+1

OK, to prawda ... ale każdy, kto używa Excela na zapleczu dowolnej usługi, nigdy nie powinien przechwytywać innych procesów Excela za pośrednictwem GetObject(). Powinien tworzyć i używać tylko własnych instancji programu Excel. W przeciwnym razie aplikacja może kolidować z użytkownikiem lub innym procesem korzystającym z instancji programu Excel. :-( –

0

Jeśli twoja aplikacja używa pojedynczego pliku Excela, który zawiera makra, które wywołujesz, obawiam się, że odpowiedź prawdopodobnie nie istnieje, ponieważ poza COM Excel nie pozwala na otwarcie tego samego pliku o tej samej nazwie (nawet jeśli w różnych katalogach). Możesz być w stanie obejść to poprzez dynamiczne kopiowanie pliku do innej nazwy przed otwarciem.

Moja wiedza na temat Pythona nie jest ogromna, ale w większości języków istnieje sposób określania podczas tworzenia obiektu COM, czy chcesz, aby był on nowym obiektem, czy domyślnie łączy się z istniejącą instancją. Sprawdź dokumentację Pythona dla czegoś wzdłuż tych linii.

Czy możesz wymienić rodzaj konkretnych problemów, które masz i dokładnie to, co masz nadzieję zrobić?

5

Zobacz "Starting a new instance of a COM application" by Tim Golden, również odwołuje here, które dają wskazówkę używać

xl_app = DispatchEx("Excel.Application") 

zamiast

xl_app = Dispatch("Excel.Application") 

aby rozpocząć osobny proces. Więc powinieneś być w stanie to zrobić:

xl_app_1 = DispatchEx("Excel.Application") 
xl_app_2 = DispatchEx("Excel.Application") 
xl_app_3 = DispatchEx("Excel.Application") 

Uwaga że kiedy skończysz, aby zamknąć aplikację, Znalazłem trzeba zrobić:

xl_app.Quit() 
xl_app = None 

znalazłem proces nie zostanie zamknięty do xl_app = None, tzn. licznik odwołań obiektu COM Pythona zostanie ustawiony na zero.

Uwaga Mam jeden pozostały problem: podczas gdy mój program Python jest uruchomiony, jeśli kliknij dwukrotnie plik programu Excel w Eksploratorze (przynajmniej na Win2k), kończy się otwarciem pliku w istniejącym programie Excel przetwarzać uruchamiany Python (który jest ukryty), co zakłóca działanie programu Python. Nie znalazłem jeszcze rozwiązania w tym zakresie.

+1

Wielkie dzięki. Twoje rozwiązanie właśnie sprawiło, że mój dzień! – notnoop

+0

Zrobiłeś też mój dzień! Chciałbym móc cię usłyszeć 100 razy lub po prostu dać ci wszystkie moje punkty! To mnie napędzało MAD !!! Dzięki lot –

+0

Dzięki :) Problem z Excelem nie otwieraniem nowego Windowsa jest niestety bardzo znany i denerwujący jak diabli. Ale może https://blogs.office.com/2013/06/03/opening-workbooks-by-running-separate-instances-of-excel/ pomaga ... –

Powiązane problemy