簡體   English   中英

EXCEL 應用程序窗口未在 workbook.close() 上關閉

[英]EXCEL application window not closing on workbook.close()

當我使用打開工作簿時

wbTest = xlwings.Book('test.xlsm')

EXCEL 應用程序打開並顯示工作簿。 但是當做一個

wbTest.close()

之后,工作簿關閉,但 EXCEL 窗口保持打開狀態,因此我必須手動關閉它,即使xlwings.apps返回一個空列表:

EXCEL 窗口仍然打開

有沒有辦法在最后一個工作簿關閉后立即關閉 EXCEL 窗口?

到目前為止,在官方文檔 (readthedocs) 中,我找不到任何解決此問題的方法。

有時,加載的工作簿包含的宏會使應用程序處於“未保存”狀態,即使尚未進行任何更改。 在這種情況下,使用wbTest.app.quit()會提示一個我不想看到的保存對話框。 使用wbTest.app.kill()將關閉工作簿(並關閉 EXCEL 窗口),但在重新打開 EXCEL 時,將顯示被殺死的 wbTest 工作簿的恢復對話框,我想避免這種情況。

所以,這里是對我有用的整體解決方案:

import xlwings
import tempfile
import os

# ... some code creating at least one workbook "wbTest"

# check, if there is only one workbook left and we don't want to save it
if len(xlwings.apps) == 1:

    #save the remaining workbook into temporary folder
    wbTest.save(
        os.path.join(
            tempfile.gettempdir(),
            'test.xlsm',
        )
    )

    # close the application
    wbTest.app.quit()

感謝所有提示。

在 Windows 上,xlwings 當前需要工作簿才能與 Excel 通信。 但是您可以通過退出應用程序而不是僅僅關閉工作簿來實現您想要的(您可以通過len(wbTest.app.books)首先檢查該應用程序中是否打開了多個工作簿):

wbTest.app.quit()

您可能想先保存工作簿,或者也有app.kill()

隨着作者提出的解決方案,我發現有時當您在個人宏工作簿上有宏時,打開的工作簿的計數器會發生變化。 這就是為什么我添加了一個簡單的函數來處理這種情況。

就我而言,有時我會打開多個 excel 文件,這對於擺脫受宏影響但您不想關閉的工作簿非常方便。

def quit_excel(wb):
    """wb: workbook object from xlwings"""

    print(wb.app.books)  # for debugging and visualization of opened workbooks

    # look if PERSONAL.XLSB is in the list of books associated with the Excel App
    if "PERSONAL.XLSB" in [b.name for b in wb.app.books]:

        if len(wb.app.books) == 2: 
            print("personal, 2, quitting")
            wb.app.quit()

        else:
            print("personal, closing")
            wb.close()

    else:


        if len(wb.app.books) == 1: 
            print("no personal, 1, quitting")
            wb.app.quit()

        else:
            print("no personal, closing")
            wb.close()

我想分享一個解決方案,它可以幫助一些對原始問題稍有變化的用戶。 在某些情況下,我在運行代碼之前打開了多個 excel 工作簿,因此我只想關閉腳本打開的工作簿,而不是整個 excel 應用程序。 這是我的解決方案,適用於這種情況。

wb = xw.Book(file_path)
excel_app = xw.apps.active

#
# do stuff with workbook
#

# close workbook if more then one workbook is open. 
# you won't get empty grey excel app since you have another workbook open.
if xw.apps.count > 1:
     wb.close()
# close excel application if only one workbook is open
else:
     excel_app.quit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM