web-dev-qa-db-fra.com

Conduire Excel à partir de Python dans Windows

Nous avons diverses feuilles de calcul qui utilisent des macros délicieusement compliquées et des extensions tierces pour produire des modèles compliqués. Je travaille sur un projet qui implique de modifier légèrement différentes entrées et de voir les résultats. Plutôt que de le faire à la main ou d'écrire VBA, j'aimerais voir si je peux écrire un script python pour piloter cela. En d'autres termes, le python = le script démarre, charge la feuille Excel, puis interagit avec la feuille en apportant des modifications mineures dans certaines cellules et en voyant comment elles affectent les autres cellules.

Donc, ma question est double:

  • Quelle est la meilleure bibliothèque à utiliser pour piloter Excel à partir de python de cette manière?

  • Où est la meilleure documentation/exemples sur l'utilisation de cette bibliothèque?

À la vôtre,/YGA

41
YGA

Pour contrôler Excel, utilisez pywin32, comme le suggère @igowen.

Notez qu'il est possible d'utiliser la répartition statique. Utilisation makepy.py à partir du projet pywin32 pour créer un module python avec les wrappers python. L'utilisation des wrappers générés simplifie le développement, car par exemple ipython vous permet de terminer les tabulations et aide pendant le développement.

Exemple de répartition statique:

 x:> makepy.py "Bibliothèque d'objets Microsoft Excel 11.0" 
 ... 
 Génération ... 
 Importation du module 
 x:> ipython 
> from win32com.client import Dispatch
> Excel = Dispatch("Excel.Application")
> wb = Excel.Workbooks.Append()
> range = wb.Sheets[0].Range("A1")
> range.[Press Tab]
range.Activate                 range.Merge
range.AddComment               range.NavigateArrow
range.AdvancedFilter           range.NoteText
...
range.GetOffset                range.__repr__
range.GetResize                range.__setattr__
range.GetValue                 range.__str__
range.Get_Default              range.__unicode__
range.GoalSeek                 range._get_good_object_
range.Group                    range._get_good_single_object_
range.Insert                   range._oleobj_
range.InsertIndent             range._prop_map_get_
range.Item                     range._prop_map_put_
range.Justify                  range.coclass_clsid
range.ListNames                range.__class__
> range.Value = 32
...

Liens de documentation:

46
codeape

Je l'ai fait en utilisant pywin32 . Ce n'est pas une expérience particulièrement agréable, car il n'y a pas vraiment d'abstraction; c'est comme utiliser VBA, mais avec la syntaxe python. Vous ne pouvez pas vous fier aux docstrings, vous voudrez donc avoir la référence MSDN Excel à portée de main ( http: // msdn. Microsoft.com/en-us/library/aa220733.aspx est ce que j'ai utilisé, si je me souviens bien. Vous devriez pouvoir trouver les documents Excel 2007 si vous creusez un peu.).

Voir ici pour un exemple simple.

from win32com.client import Dispatch

xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Workbooks.Add()
xlApp.ActiveSheet.Cells(1,1).Value = 'Python Rules!'
xlApp.ActiveWorkbook.ActiveSheet.Cells(1,2).Value = 'Python Rules 2!'
xlApp.ActiveWorkbook.Close(SaveChanges=0) # see note 1
xlApp.Quit()
xlApp.Visible = 0 # see note 2
del xlApp

Bonne chance!

21
igowen

Découvrez le projet DataNitro (ancien nom IronSpread). Il s'agit d'un plug-in Python pour Excel.

8
codeape

L'année dernière, j'ai travaillé sur un projet domestique impliquant un client écrit sous la forme d'un plug-in Excel Python. Le projet est essentiellement une base de données en ligne simplifiée pour l'accès de l'utilisateur final. Le plug-in Excel permet les utilisateurs à interroger les données de la base de données pour les afficher dans Excel.

Je ne suis jamais allé très loin avec le plug-in Excel et mon code est un peu moche. Mais ce que j'ai est sous licence BSD et disponible via Bazaar à l'adresse

http://www.launchpad.net/analyz/trunk

Le client ne fonctionnera pas car je n'ai pas de serveur public en cours d'exécution pour le moment, mais au moins vous pouvez regarder ce que j'ai fait avec le code pour avoir des idées sur la façon dont cela pourrait fonctionner. Le code vous montrera également comment créer une boîte de dialogue MFC en 100% Python.

1
Clint Miller

J'ai passé environ une semaine, et voici mon implémentation (ou plutôt une preuve de concept): https://github.com/Winand/SimplePython

L'idée principale est de rendre Python aussi facile à écrire et à appeler depuis Microsoft Office que les macros VBA (j'ai créé un complément uniquement pour Excel).

  • Architecture client-serveur (sur TCP), donc Python n'est démarré qu'une seule fois
  • Le serveur démarre automatiquement s'il n'est pas en cours d'exécution
  • Le serveur recharge automatiquement les modules de macro lorsque l'utilisateur les modifie
  • Interface de contrôle facile à utiliser sur le ruban Office
1
Winand

J'ai écrit python qui permet de travailler avec Excel via l'interface COM dans Windows http://sourceforge.net/projects/excelcomforpython/

La classe utilise win32com pour interagir avec Excel. Vous pouvez utiliser la classe directement ou l'utiliser comme exemple. De nombreuses options implémentées comme les formules matricielles, la mise en forme conditionnelle, les graphiques, etc.

1
Alex

Il existe un projet intéressant pour intégrer python dans Excel en tant que processus en cours DLL qui peut être trouvé à:

http://opentradingsystem.com/PythonForExcel/main.html

Un autre projet un peu plus simple dans le même esprit existe à:

http://www.codeproject.com/Articles/639887/Calling-Python-code-from-Excel-with-ExcelPython

Ces projets semblent très prometteurs mais nécessitent plus de développement.

0
Testautomation