如何解决如何检查文件是否已打开例如Excel Workbook或用户是否使用pywin32 COM库已将其关闭?
有许多VBA和C#代码示例,它们使用Win COM对象的API来检查是否打开了工作簿,但使用pywin32的python却没有。我尝试使用GetObject
和GetItem
之类的函数,但它们并非没有挑战。请参阅下面的代码段以及我的方法,以尝试检查用户是否已关闭工作簿。它打开一个工作簿,然后将其保持打开状态十秒钟。如果用户关闭,则会出现精神错乱。有谁知道编写此代码的正确方法?谢谢!
# Open an excel,check if its open,wait until user closes or close it after ten seconds
def wait_until_time_or_user_close(excel,gencache=False):
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
excel.DisplayAlerts = False
wb_open = True
try:
wb = excel.Workbooks.Add() # create new workbook
name = ''.join(wb.Name) # create a new string copy
# - needed because if user closes
# wb,then wb doesn't exist and
# wb.Name throws an error.
seconds = 0
xl = None
while(wb_open and seconds < 10):
xl = win32.GetObject(name)
# excel.Workbooks.getItem(name); # produces AttributeError:
# '<win32com.gen_py.Microsoft Excel 16.0 Object Library.Workbooks instance at 0x1548081920544>'
# object has no attribute 'getItem' (or GetItem)
# Source: https://stackoverflow.com/questions/3156676/checking-if-an-excel-workbook-is-open
wb_open = xl is not None
# give user some time to interact
import time
time.sleep(1)
seconds += 1
finally:
if wb_open:
print("wb closed")
wb.Close(False) # True=save the workbook,False=don't save workbook
excel.Application.Quit()
excel = None
wait_until_time_or_user_close(excel)
此外,对于如何找出可用于COM对象的不同功能和属性的人,是否有任何建议? pywin32文档说明了以下内容:
How do I know which methods and properties are available?
Good question. This is hard! You need to use the documentation with the products,or possibly a COM browser. Note however that COM browsers typically rely on these objects registering themselves in certain ways,and many objects to not do this. You are just expected to know.
它说您只是应该知道...好吧,如果是这种情况,我该去哪里了解这些东西??
可以在此处查看文档: http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartClientCom.html
解决方法
这是解决问题的一种方法。添加第二个try / catch语句。如果有更好的方法可以这样做-请推荐它们。另外,第二个问题仍然是找出有关Win32 API的最佳方法。
# Open an excel,check if its open,wait until user closes or close it after ten seconds
def wait_until_time_or_user_close(excel,gencache=False):
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
excel.DisplayAlerts = False
wb_open = True
try:
wb = excel.Workbooks.Add() # create new workbook
seconds = 0
xl = None
while(wb_open and seconds < 10):
try:
xl = win32.GetObject(wb.Name)
except:
wb_open = xl is not None
# give user some time to interact
import time
time.sleep(1)
seconds += 1
finally:
if wb_open:
print("wb closed")
wb.Close(False) # True=save the workbook,False=don't save workbook
excel.Application.Quit()
excel = None
wait_until_time_or_user_close(excel)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。