Контролируйте 2 отдельных экземпляра Excel с помощью COM независимо ... это можно сделать? - PullRequest
6 голосов
/ 05 февраля 2009

У меня есть устаревшее приложение, которое реализовано во многих книгах Excel. Это не то, что я имею право на повторную реализацию, однако другое приложение, которое я поддерживаю, должно иметь возможность вызывать функции в книге Excel.

Он получил интерфейс Python с использованием библиотеки Win32Com. Другие процессы могут вызывать функции в моем пакете python, который, в свою очередь, вызывает нужные мне функции через Win32Com.

К сожалению, COM не позволяет мне указывать конкретный COM-процесс, поэтому на данный момент, независимо от того, насколько мощен мой сервер, я могу одновременно управлять только одним экземпляром Excel на компьютере. Если бы я попытался запустить более одного экземпляра Excel, не было бы никакого способа гарантировать, что слой python привязан к конкретному экземпляру Excel.

Я бы хотел иметь возможность одновременно запускать более 1 приложения Excel на моем сервере Windows. Есть ли способ сделать это? Например, могу ли я разделить свою среду так, чтобы я мог запустить столько комбинаций Excel _ Python, сколько будет поддерживать мое приложение?

Ответы [ 3 ]

6 голосов
/ 15 февраля 2010

См. "Запуск нового экземпляра COM-приложения" Тимом Голденом , также ссылается здесь , что дает подсказку для использования

xl_app = DispatchEx("Excel.Application")

вместо

xl_app = Dispatch("Excel.Application")

чтобы начать отдельный процесс. Таким образом, вы должны быть в состоянии сделать:

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

Обратите внимание , что когда вы закончите, чтобы закрыть приложение, я обнаружил, что необходимо сделать:

xl_app.Quit()
xl_app = None

Я обнаружил, что процесс не будет остановлен до xl_app = None, то есть счетчик ссылок объекта Python COM обнуляется.

Примечание У меня осталась одна проблема: во время работы моей программы на Python, если я дважды щелкаю файл Excel в Explorer (по крайней мере, на Win2k), он заканчивается открытием файла в существующий процесс Excel, запущенный Python (который выполняется скрытым), который нарушает работу программы Python. Я еще не нашел решение для этого.

2 голосов
/ 06 февраля 2009

К сожалению, я ничего не знаю о Python, но если он работает через COM, Excel не является приложением для одного экземпляра, поэтому вы должны иметь возможность создавать столько экземпляров Excel, сколько позволяет память.

Используя C #, вы можете создать несколько экземпляров приложения Excel с помощью:

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

Используя позднюю привязку в C #, вы можете использовать:

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

Если вы используете VB.NET, VB6 или VBA, вы можете использовать CreateObject следующим образом:

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

К сожалению, в Python я понятия не имею. Но если нет каких-то ограничений для Python (что я не могу представить?), То я думаю, что это очень выполнимо.

Тем не менее, идея иметь несколько экземпляров Excel, выступающих в качестве какого-либо сервера для других операций, звучит довольно странно ... Я бы осторожно проверил, что вы делаете, особенно в отношении того, сколько экземпляров вы можете открыть сразу, не исчерпав памяти, и что произойдет с вызывающей программой, если Excel по какой-либо причине зависнет.

0 голосов
/ 05 февраля 2009

Если ваше приложение использует один файл Excel, который содержит макросы, которые вы вызываете, я боюсь, что ответ, вероятно, нет, так как кроме COM Excel не позволяет открывать один и тот же файл с тем же именем (даже если в разных каталогах) , Вы можете обойти это, динамически копируя файл под другим именем перед открытием.

Мои знания Python невелики, но в большинстве языков есть способ указать, когда вы создаете COM-объект, хотите ли вы, чтобы он был новым объектом или подключался к уже существующему экземпляру по умолчанию. Посмотрите документы на Python для чего-то подобного.

Можете ли вы перечислить конкретные проблемы, с которыми вы сталкиваетесь, и что именно вы надеетесь сделать?

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