tim*_*tim 6 python excel winapi com-interface
我正在使用以下代码在Excel中打开并显示工作簿:
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open('my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
Run Code Online (Sandbox Code Playgroud)
当文件'my_sheet.xlsm'已经打开时,Excel会询问我是否要在不保存的情况下重新打开它.
我如何提前检查工作簿是否已经打开,如果是,请将其带到前面?
编辑:现在发现:
if excel.Workbooks.Count > 0:
for i in range(1, excel.Workbooks.Count+1):
if excel.Workbooks.Item(i).Name is 'my_sheet.xlsm':
wb = excel.Workbooks.Item(i)
break
Run Code Online (Sandbox Code Playgroud)
还有一个问题:我的工作表包含一些标题,我启用了一些过滤.因此,当设置过滤器时,以及当我从Python打开工作簿时,它有时会要求我输入一个唯一的名称来保存过滤器.这是为什么?这是对话:
编辑好了这里它说(用德语)后一个问题是2007年和2010年文件中的已知错误:https://social.msdn.microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff- 5c0d83166e73/excel-api-interne-namen,如果以编程方式打开Excel-Files,它似乎存在.不知道是否有解决方法.
Par*_*ait 11
在找到解决方案时,请考虑使用try/except/finally块.目前,您的代码将使Excel.exe进程在后台运行(如果使用Windows,请检查任务管理器),即使您关闭可见工作表也是如此.顺便说一句,在Python或任何其他语言(如VBA)中,应始终在应用程序代码期间干净地释放任何外部API(如此COM接口).
下面的解决方案使用一个已定义的函数,openWorkbook()进入两个可能的路径:1)首先尝试重新启动指定的工作簿,假设它已打开,2)如果当前未打开,则启动该位置的新工作簿对象.最后一个嵌套try/except用于Workbooks.Open()方法失败的情况,例如文件名不正确.
import win32com.client as win32
def openWorkbook(xlapp, xlfile):
try:
xlwb = xlapp.Workbooks(xlfile)
except Exception as e:
try:
xlwb = xlapp.Workbooks.Open(xlfile)
except Exception as e:
print(e)
xlwb = None
return(xlwb)
try:
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = openWorkbook(excel, 'my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
except Exception as e:
print(e)
finally:
# RELEASES RESOURCES
ws = None
wb = None
excel = None
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19573 次 |
| 最近记录: |