2013-05-30 7 views
5

Stworzyłem serwer RTD dla programu Excel w języku C#, który stale aktualizuje komórki z danymi i musi pracować z wieloma wystąpieniami programu Excel. Problem polega na tym, że jeśli mam tę samą formułę RTD w więcej niż jednym wystąpieniu programu Excel, a ja usuwam formułę w jednej z wystąpień programu Excel, wywołuje ona metodę DisconnectData na serwerze RTD, więc identyczne formuły w innych wystąpieniach programu Excel przestają się aktualizować chociaż nadal powinny być aktualizowane.C# Excel RTD Server Wiele instancji odłączyć wszystkie formuły na jednym arkuszu zatrzymuje formuły na drugim

Czy istnieje sposób w języku C#, aby zmusić każde wystąpienie programu Excel do posiadania własnego serwera RTD lub czy istnieje sposób, aby serwer RTD poprawnie rozpoznał wiele wystąpień programu Excel i sprawdzenie, czy wszystkie wystąpienia formuły zostały usunięte ze wszystkich wypróbuj skoroszyt przed wywołaniem DisconnectDatamethod na moim serwerze RTD.

Odpowiedz

2

Zakładając, że funkcje RTD są zawijane za pomocą UDF, jednym rozwiązaniem byłoby przypisanie do każdego arkusza roboczego identyfikatora (np. Guid) z poziomu wywołania UDF. Możesz zachować identyfikator jako własność niestandardowego arkusza roboczego, a następnie dodać go do każdego wychodzącego tematu RTD, co spowoduje unikalny zestaw tematów dla każdego arkusza roboczego, gdy dotrą one do twojego serwera RTD.

Uzyskanie dostępu do niestandardowej właściwości arkusza roboczego przy każdym wywołaniu RTD będzie miało wpływ na wydajność podczas przetwarzania dużej liczby funkcji, należy więc buforować identyfikator przez krótki okres, aby to ograniczyć. Jednym ze sposobów, aby to zrobić, jest utrzymanie wyszukiwania słownika kluczowanego przez obiekt arkusza roboczego. W zakresie każdego wywołania UDF pobierz arkusz roboczy, z którym powiązana jest komórka wywołująca, za pomocą właściwości Application.Caller (przenieś go do zakresu i uzyskaj od niego właściwość arkusza roboczego), a następnie wyszukaj identyfikator w słowniku.

0

Myślę, że to twój problem http://support.microsoft.com/kb/284883 Jak zarejestrować swój serwer RTD? Czy to jest obiekt DCOM?

+0

Natknąłem się na ten artykuł, gdy próbowałem znaleźć odpowiedź, ale miał tylko przykład VB i nie mogłem znaleźć sposobu, aby to zrobić z C#. Został zarejestrowany przez Visual Studio poprzez oznaczenie DLL jako COM-Visible i Register for COM interop. Serwer RTD to tylko obiekt COM, a nie DCOM. – Megaman82

+0

Czy obejrzałeś ten artykuł http://msdn.microsoft.com/en-us/library/windows/desktop/ms693716(v=vs.85).aspx? W mojej praktyce użyłem CLSCTX_INPROC_SERVER w CoCreateInstance –

Powiązane problemy