Контролируйте 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 для чего-то в этом направлении.
Можете ли вы перечислить конкретные проблемы, с которыми вы столкнулись, и что именно вы надеетесь сделать?