0
votes

La fenêtre de l'application EXCEL ne se ferme pas sur classeur.close ()

Lorsque j'ouvre un classeur en utilisant

wbTest.close()

l'application EXCEL s'ouvre et affiche le classeur. Mais en faisant un

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

ensuite, le classeur se ferme, mais la fenêtre EXCEL reste ouverte pour que je xlwings.apps fermer manuellement, même si xlwings.apps renvoie une liste vide:

La fenêtre EXCEL est toujours ouverte

Existe-t-il un moyen de fermer la fenêtre EXCEL dès que le dernier classeur se ferme?

Dans la documentation officielle (readthedocs), je n'ai rien trouvé pour résoudre cette question, jusqu'à présent.


2 commentaires

Je ne sais pas si cela fonctionne dans xlwings mais j'ai eu du succès en exécutant: del excel utilisant win32com et openpyxl


cela aurait été ma prochaine alternative à vérifier. Merci @Vink


4 Réponses :


0
votes

Sous Windows, xlwings nécessite actuellement un classeur pour communiquer avec Excel. Mais vous pouvez obtenir ce que vous voulez en quittant l'application plutôt qu'en fermant simplement le classeur (vous pouvez d'abord vérifier s'il y a plus d'un classeur ouvert dans cette application via len(wbTest.app.books) ):

wbTest.app.quit()

Vous voudrez peut-être enregistrer le classeur en premier ou il y a aussi app.kill() .


1 commentaires

Merci @FelixZumstein. J'ai inclus votre suggestion dans la réponse finale.



1
votes

Parfois, un classeur chargé contient des macros qui laissent l'application dans un état «non enregistré», même lorsqu'aucune modification n'a encore été apportée. L'utilisation de wbTest.app.quit() , dans ce cas, affichera une boîte de dialogue d'enregistrement, que je ne veux pas voir. L'utilisation de wbTest.app.kill() fermerait le classeur (et fermerait la fenêtre EXCEL), mais à la réouverture d'EXCEL, une boîte de dialogue de récupération pour le classeur wbTest tué sera affichée, ce que j'aimerais éviter.

Alors, voici la solution globale qui fonctionne pour moi:

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

Merci pour tous les indices.


0 commentaires

0
votes

Parallèlement à la solution proposée par l'auteur, j'ai compris que parfois, lorsque vous avez des macros sur le classeur de macros personnelles, le compteur de classeurs ouverts change. C'est pourquoi j'ai ajouté une fonction simple qui gère cette situation.

Dans mon cas, je travaille parfois avec plusieurs fichiers Excel ouverts et c'est très pratique pour se débarrasser des classeurs affectés par les macros mais que vous ne voulez pas fermer.

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


0 commentaires

0
votes

Je voulais partager une solution qui pourrait aider certains utilisateurs avec une légère variation du problème d'origine. Dans certains scénarios, plusieurs classeurs Excel étaient ouverts et avant d'exécuter le code, je voulais uniquement fermer le classeur ouvert par le script et non l'application Excel entière. Voici ma solution qui fonctionnera pour ce scénario.

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


0 commentaires