Existe-t-il un moyen de mettre à jour une feuille de calcul en temps réel lorsqu'elle est ouverte dans Excel? J'ai un classeur appelé Example.xlsx qui est ouvert dans Excel et j'ai le code python qui essaie de mettre à jour la cellule B1 avec la chaîne 'ID':
import openpyxl
wb = openpyxl.load_workbook('Example.xlsx')
sheet = wb['Sheet']
sheet['B1'] = 'ID'
wb.save('Example.xlsx')
En exécutant le script, j'obtiens cette erreur:
PermissionError: [Errno 13] Permission denied: 'Example.xlsx'
Je sais que c'est parce que le fichier est actuellement ouvert dans Excel, mais je me demandais s'il existe un autre moyen ou module que je peux utiliser pour mettre à jour une feuille pendant son ouverture.
J'ai en fait compris cela et c'est assez simple en utilisant xlwings. Le code suivant ouvre un fichier Excel existant appelé Example.xlsx et le met à jour en temps réel, dans ce cas, met la valeur 45 dans la cellule B2 instantanément dès que vous exécutez le script.
import xlwings as xw
wb = xw.Book('Example.xlsx')
sht1 = wb.sheets['Sheet']
sht1.range('B2').value = 45
Vous avez déjà compris pourquoi vous ne pouvez pas utiliser openpyxl
pour écrire dans le .xlsx
fichier: il est verrouillé pendant qu'Excel l'ouvre. Vous ne pouvez pas y écrire directement, mais vous pouvez utiliser win32com
pour communiquer avec la copie d'Excel qui s'exécute via son interface COM.
Vous pouvez télécharger win32com
de https://github.com/mhammond/pywin32 .
Utilisez-le comme ceci:
from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
wb=xlApp.Workbooks.Item("MyExcelFile.xlsx")
ws=wb.Sheets("MyWorksheetName")
À ce stade, ws
est une référence à un objet de feuille de calcul que vous pouvez modifier. Les objets que vous récupérez ne sont pas Python objets mais un mince Python wrapper autour d'objets VBA qui obéissent à leurs propres conventions, pas à Python).
Il existe ici une documentation utile mais plutôt ancienne sur Python: http://timgolden.me.uk/pywin32-docs/contents.html
Il existe une documentation complète pour le modèle d'objet ici: https://msdn.Microsoft.com/en-us/library/wss56bz7.aspx mais gardez à l'esprit qu'il s'adresse aux programmeurs VBA.
Si vous souhaitez diffuser des données en temps réel dans Excel à partir de Python, vous pouvez utiliser une fonction RTD. Si vous avez déjà utilisé le complément Bloomberg pour accéder aux données du marché en temps réel dans Excel, vous serez familiarisé avec les fonctions RTD.
La façon la plus simple d'écrire une fonction RTD pour Excel en Python est d'utiliser PyXLL. Vous pouvez lire comment le faire dans les documents ici: https: //www.pyxll. com/docs/userguide/rtd.html
Il y a aussi un article de blog montrant comment diffuser des tweets en direct dans Excel en utilisant Python ici: https://www.pyxll.com/blog/a-real-time-Twitter- feed-in-Excel /
Si vous vouliez écrire un serveur RTD pour fonctionner en dehors d'Excel, vous devez l'enregistrer en tant que serveur COM. Le package pywin32 comprend un exemple qui montre comment procéder, mais il ne fonctionne que pour Excel avant 2007. Pour les versions 2007 et ultérieures, vous aurez besoin de ce code https://github.com/pyxll/exceltypes = pour faire fonctionner cet exemple (voir l'exemple modifié de pywin32 dans exceltypes/demos dans ce repo).
Vous ne pouvez pas modifier un fichier Excel utilisé par une autre application car le format de fichier ne prend pas en charge l'accès simultané.