Xlwings 打开 excel by xl.App 没有事件,可见 True
Xlwings opening excel by xl.App without events, with visible True
我创建了下面的上下文管理器来操作 xlwings 的 excel 文件。我不使用 xw.Book() 的原因是事件和可见变量,因为我在打开文件之前正在处理。
当我想用 visible=True 打开一些 wb 时,我的问题就出现了。它显示了 application 和 2 wb,第一个是空的,它是用 app 创建的,第二个(正确的)是空的。我需要查看第二个工作簿,以便有机会在 运行 时间内修改它(经过几次自动操作后,用户需要提供一些额外的数据,之后我希望脚本继续 运行ning ).
在我的上下文管理器下面:
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)
有什么办法可以解决我的问题吗?
我还尝试通过 win32com.client 创建 Excel 应用程序并通过它打开文件,但我不知道如何在打开文件之前关闭事件,以及稍后如何使用 xlwings 打开 wb。
import win32.com.client as client
xl_app = client.DispatchEx("Excel.Application")
wb = xl_app.Workbooks.Open(path, 0, 0) # events shows up :/
之后我尝试通过 xlwings 找到 excel 应用程序并在其中一个上工作,代码如下 + 错误:
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,无法更新
如果以后有人感兴趣:
Screen_updating 参数导致此问题。
如果你想让它可见,你还需要将 xl.app.api.ScreenUpdating 更改为 True。
我创建了下面的上下文管理器来操作 xlwings 的 excel 文件。我不使用 xw.Book() 的原因是事件和可见变量,因为我在打开文件之前正在处理。 当我想用 visible=True 打开一些 wb 时,我的问题就出现了。它显示了 application 和 2 wb,第一个是空的,它是用 app 创建的,第二个(正确的)是空的。我需要查看第二个工作簿,以便有机会在 运行 时间内修改它(经过几次自动操作后,用户需要提供一些额外的数据,之后我希望脚本继续 运行ning ).
在我的上下文管理器下面:
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)
有什么办法可以解决我的问题吗? 我还尝试通过 win32com.client 创建 Excel 应用程序并通过它打开文件,但我不知道如何在打开文件之前关闭事件,以及稍后如何使用 xlwings 打开 wb。
import win32.com.client as client
xl_app = client.DispatchEx("Excel.Application")
wb = xl_app.Workbooks.Open(path, 0, 0) # events shows up :/
之后我尝试通过 xlwings 找到 excel 应用程序并在其中一个上工作,代码如下 + 错误:
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,无法更新
如果以后有人感兴趣:
Screen_updating 参数导致此问题。 如果你想让它可见,你还需要将 xl.app.api.ScreenUpdating 更改为 True。