Открытие Xlwings Excel от Xl.App без событий, с видимым True - PullRequest
0 голосов
/ 02 апреля 2020

Я создал ниже контекстный менеджер для работы с файлами Excel от xlwings. Причиной, по которой я не использую xw.Book (), являются события и видимая переменная, с которыми я работаю до открытия файла. Моя проблема возникает, когда я хочу открыть некоторые wb с visible = True. Он показывает приложение и 2 wb, первый пустой, который был создан с помощью app, а второй (правильный) пустой. Мне нужно просмотреть эту вторую рабочую книгу, чтобы дать возможность изменить ее во время выполнения (после нескольких автоматических действий c пользователю необходимо предоставить некоторые дополнительные данные, и после этого я хочу, чтобы скрипт продолжал работать).

Ниже моего менеджера контекста:

class ExcelApplicationSetup:

def __init__(self, app=None, visible=False):
    self.app = app
    self.visible = visible
    if app is None:
        self.new_application = True
    else:
        self.new_application = False

def __enter__(self):
    if self.new_application:
        self.app = xw.App(visible=self.visible)
    else:
        self.app.visible = self.visible
    self.app.api.DisplayAlerts = False
    self.app.api.AskToUpdateLinks = False
    self.app.api.ScreenUpdating = False
    self.app.api.EnableEvents = False
    return self.app

def __exit__(self, exception_type, exception_value, traceback):
    self.app.api.DisplayAlerts = True
    self.app.api.AskToUpdateLinks = True
    self.app.api.ScreenUpdating = True
    self.app.api.EnableEvents = True
    if self.new_application:
        self.app.kill()

Ниже моего кода, как я пытаюсь открыть файл Excel с ним:

with ExcelApplicationSetup(None, True) as xw_app:
    workbook = xw_app.api.Workbooks.Open(path, False, False)
    wb = xw_app.books(workbook.Name)

Есть идеи, как мне решить мою проблему? Я также пытался создать приложение Excel с помощью win32com.client и открыть им файл, но я не знаю, как отключить события перед открытием файла и как позже взять открытый wb с xlwings.

import win32.com.client as client
xl_app = client.DispatchEx("Excel.Application")
wb = xl_app.Workbooks.Open(path, 0, 0)  # events shows up :/

После этого я попытался найти приложения Excel от xlwings и поработать над ним, ниже код + ошибка:

import xlwings as xw
my_app = xw.apps[0]

Traceback (most recent call last):
File "C:\Program Files\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in 
run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-37-0ca6b75919cd>", line 1, in <module>
xw.apps[0]
File "C:\Program Files\Python37\lib\site-packages\xlwings\main.py", line 150, in __getitem__
return App(impl=self.impl[item])
File "C:\Program Files\Python37\lib\site-packages\xlwings\_xlwindows.py", line 286, in __getitem__
raise KeyError('Could not find an Excel instance with this PID.')
KeyError: 'Could not find an Excel instance with this PID.'

PS: я использую xw__version__ = 0.15.2, без возможности обновления

1 Ответ

0 голосов
/ 08 апреля 2020

Если кому-то в будущем будет интересно:

Аргумент Screen_updating вызывает эту проблему. Если вы хотите, чтобы он был видимым, вам нужно также изменить xl.app.api.ScreenUpdating как True.

...