【问题标题】:Python: Open Excel Workbook using Win32 COM ApiPython:使用 Win32 COM Api 打开 Excel 工作簿
【发布时间】:2016-10-06 02:08:15
【问题描述】:

我正在使用以下代码在 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

当文件“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

还有一个问题:我的工作表包含一些标题,我在其中启用了一些过滤。因此,当设置过滤器时,当我从 Python 打开工作簿时,它有时会要求我输入一个唯一的名称来保存过滤器。这是为什么?这是对话:

编辑好的,这里(德语)说后一个问题是 2007 年和 2010 年文件中的一个已知错误:https://social.msdn.microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff-5c0d83166e73/excel-api-interne-namen,如果您以编程方式打开 Excel 文件,它似乎存在。不知道有没有解决办法。

【问题讨论】:

    标签: python excel winapi com-interface


    【解决方案1】:

    当您找到解决方案时,请考虑使用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
    

    【讨论】:

    • C'est parfait :-)
    • @Parfait 您的 try/except/finally 解决方案非常棒!虽然我最近看到由于某种原因我的一些文件被卡在后台运行,我也无法从任务管理器中释放它们。我想删除这些文件,但它说已锁定以进行编辑。我不想每次发生这种情况时都重新启动我的系统。有没有办法释放它们?
    • 如果没有更多关于这些文件如何运行的上下文,我无能为力。此解决方案仅释放它产生的那些资源。但是,此特定答案会将 Excel 应用程序启动到屏幕并保持应用程序和工作簿均处于打开状态。要在后台隐藏并释放进程,请使用 try 块中的行:excel.Visible = Falsewb.Close(True)excel.Quit
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2021-07-15
    • 2013-12-10
    • 2014-09-12
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多