Контролируйте 2 отдельных экземпляра Excel с помощью COM независимо... это можно сделать?

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

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

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

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

3 ответа

Решение

К сожалению, я ничего не знаю о 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 по какой-то причине завис.

См. "Запуск нового экземпляра 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. Я еще не нашел решение для этого.

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

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

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

Другие вопросы по тегам