关闭Excel工作簿的Python Win32 COM方法

14

我在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
4个回答

37

Workbook COM 对象有一个 Close() 方法。基本上,它应该像这样:

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版本是什么?请看我的稍微长一些的例子。 - ig0774
奇怪...现在它可以工作了。我猜我之前测试的时候写错了什么东西。 - Razor Storm
必须先从 https://github.com/mhammond/pywin32 安装 pywin32 包。有关如何使用的示例,请参见 https://github.com/mhammond/pywin32/blob/master/pywin32_testall.py。在运行此脚本之前,必须使用 import win32api - Contango
请注意,如果工作簿具有“保存”事件处理程序,则在Excel Office 365中,Close(True)可能会在保存之前令人困惑地关闭工作簿;在这些情况下,wb.Save(); wb.Close()更为安全。 - fuglede

10

你还可以尝试使用以下代码:

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()

1
这个函数关闭任何已打开的Excel文件。
import os

def closeFile():

    try:
        os.system('TASKKILL /F /IM excel.exe')

    except Exception:
        print("KU")

closeFile()

-2
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)

7
虽然这段代码可能解决了问题,但是加上解释说明[(参见//meta.stackexchange.com/q/114762)]为什么这种方法有效将有助于提高您的帖子质量,并且很可能会得到更多的赞同。请记住,您正在为未来的读者回答问题,而不仅仅是现在的提问者。请[编辑]您的答案以添加解释,并指出适用的限制和假设。 - Adrian Mole
2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接