【问题标题】:python win32 COM closing excel workbookpython win32 COM关闭excel工作簿
【发布时间】:2011-09-14 07:42:22
【问题描述】:

我在 COM 中打开了几个不同的工作簿(excel xlsx 格式),并将它们弄乱了。随着程序的进行,我希望关闭一个特定的工作簿,但保持其余工作簿打开。

如何关闭一个工作簿? (而不是整个 excel 应用程序)

xl = Dispatch("Excel.Application")
xl.Visible = False
try:
    output = xl.Workbooks.Open(workbookName)
    output2 = xl.Workbooks.Open(workbook2Name)
except com_error:
    print "you screwed up blahblahblah"
    exit()

#work on some stuff
#close output but keep output2 open

【问题讨论】:

    标签: python winapi excel com win32com


    【解决方案1】:

    工作簿 COM 对象 has a Close() method。基本上,它应该是这样的:

    xl = Dispatch('Excel.Application')
    wb = xl.Workbooks.Open('New Workbook.xlsx')
    # do some stuff
    wb.Close(True) # save the workbook
    

    以上只是一个框架,下面是一些可以在我的机器上针对 Office 2010 运行的代码:

    from win32com.client import Dispatch
    xl = Dispatch('Excel.Application')
    wb = xl.Workbooks.Add()
    ws = wb.Worksheets.Add()
    cell = ws.Cells(1)
    cell.Value = 'Some text'
    wb.Close(True, r'C:\Path\to\folder\Test.xlsx')
    

    当然,这会创建一个新的 xlsx 文件。但随后我能够在同一个会话中成功打开和修改文件,如下所示:

    wb = xl.Workbooks.Open(r'C:\Path\to\folder\Test.xlsx')
    ws = wb.Worksheets(1)
    cell = ws.Cells(2)
    cell.Value = 'Some more text'
    wb.Close(True)
    

    不知道有没有帮助...

    【讨论】:

    • @RazorStorm:您使用的是什么版本的 Excel / Office?请参阅我稍长的示例。
    • 奇怪......它现在可以工作了。我想我之前测试它时写错了。
    • 必须先从github.com/mhammond/pywin32 安装包pywin32。例如,如何使用,github.com/mhammond/pywin32/blob/master/pywin32_testall.py。在运行此脚本之前必须使用import win32api
    • 请注意,如果工作簿具有“保存时”事件处理程序,则有可能(在 Excel Office 365 中)Close(True) 在保存之前不直观地设法关闭工作簿;在这些情况下,wb.Save(); wb.Close() 更安全。
    【解决方案2】:

    您也可以尝试使用以下代码:

    excel = Dispatch("Excel.Application")
    excel.Visible = False
    workbook = excel.Workbooks.Open(fileName)
    
    # with saving
    excel.DisplayAlerts = False
    if saveAs:
        excel.ActiveWorkbook.SaveAs(fullFileNameToSave)
    else:
        excel.ActiveWorkbook.Save()
    excel.Quit()
    
    #without saving
    
    map(lambda book: book.Close(False), excel.Workbooks)
    excel.Quit()
    

    【讨论】:

      【解决方案3】:

      这个函数关闭所有打开的excel文件

      import os
      
      def closeFile():
      
          try:
              os.system('TASKKILL /F /IM excel.exe')
      
          except Exception:
              print("KU")
      
      closeFile()
      

      【讨论】:

        【解决方案4】:
        def setAutoFilter(self,ws,AmountToMatch):
                amounttopass = f"{AmountToMatch}"
                print("The Amount  of that month is  ::",amounttopass)
                ws.Range("B:G").AutoFilter(Field=6, Criteria1=amounttopass,VisibleDropDown=False)
                time.sleep(timeout)
        

        【讨论】:

        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 2014-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多