Cet article concerne la version 3.0.2 ou antérieure. OpenPyXL est amélioré de jour en jour et, à l'avenir, il sera peut-être possible de résoudre les problèmes décrits ici.
OpenPyXL vous permet de créer par force brute des feuilles Excel à partir d'un tout nouveau classeur avec juste du code Python, mais la création à partir de zéro rend le code plus difficile à lire et sépare le code et la conception. Il est également avantageux pour la maintenance, donc je pense que c'est une pratique courante de lire un modèle de classeur Excel conçu dans une certaine mesure avec OpenPyXL et de définir les données nécessaires.
Cependant, OpenPyXL fonctionne d'une manière complètement différente d'Excel, il y a donc certaines choses qui peuvent être faites facilement avec Excel VBA mais pas avec OpenPyXL.
À l'exception des conditions suivantes, il est souvent difficile d'implémenter le traitement à l'aide du classeur Excel modèle uniquement avec OpenPyXL actuel.
--Ceux sans images ni formes --Ceux qui ne nécessitent pas de copie de la feuille de calcul --Ceux qui n'utilisent pas beaucoup les cellules fusionnées
--Choses avec images et formes
Dans OpenPyXL, les informations sur l'image et la forme seront ignorées lors de l'ouverture du livre. Si vous souhaitez gérer des images et des formes dans OpenPyXL, vous devez le définir dans le processus OpenPyXL après avoir ouvert le livre.
La fonction workbook.copy_worksheet ()
qui copie les feuilles de calcul se comporte différemment de celle d'Excel (Worksheets.Copy
) et contient des informations qui ne sont pas copiées, comme la mise en forme conditionnelle.
La réécriture du code source d'OpenPyXL peut aider dans une certaine mesure, mais elle ne se copie toujours pas aussi parfaitement qu'Excel.
--Ceux qui font un usage intensif des cellules fusionnées
OpenPyXL peut gérer les cellules fusionnées elles-mêmes, mais il existe de nombreuses restrictions sur le dessin des bordures et la mise en forme. (Il est facile de causer des ennuis) Pour les pièces exploitées par OpenPyXL, il est nécessaire d'éviter autant que possible d'utiliser des cellules fusionnées en concevant la conception, ou de confirmer qu'il n'y a pas de problème dans le fonctionnement d'OpenPyXL avant de l'utiliser.
--N'ajoutez pas de lignes ou de colonnes au milieu de la feuille de calcul
worksheet.insert_rows ()
et worksheet.insert_col ()
qui insèrent des lignes et des colonnes sont ** tout à fait ** les comportements d'Excel (row (). Insert
, col (). Insert
) Est différent.
Même si la fonction ci-dessus est exécutée, les informations d'attribut (nom défini, format, format conditionnel) données à la cellule, cellule fusionnée, informations d'image placées sur la cellule, formule de fonction, etc. ne suivent pas, donc la situation actuelle La version est ** pratiquement inutile **.
Si vous ajoutez (écrasez) des lignes et des colonnes à la fin plutôt qu'au milieu de la feuille de calcul, le problème doit être relativement petit.
OpenPyXL peut gérer un modèle de classeur Excel (xlsm) contenant des macros VBA en ajoutant keep_vba = True
à l'argument ouvert.
Par conséquent, en laissant la macro Excel VBA effectuer un traitement difficile avec OpenPyXL, il est possible de réaliser un traitement difficile ou impossible avec OpenPyXL.
(Malheureusement, cela ne peut pas être fait dans un environnement où l'exécution de macros Excel VBA n'est pas autorisée en raison de circonstances internes, etc.)
Nous organiserons le traitement effectué par OpenPyXL et le traitement effectué par les macros Excel VBA, et effectuerons respectivement le traitement du code et les paramètres pour Python et Excel VBA. Par exemple, vous pouvez copier une feuille de calcul et ajouter / supprimer des colonnes au milieu d'une feuille de calcul avec la macro Excel VBA.
Pour les données requises par la macro Excel VBA, créez une feuille de calcul de données distincte de la feuille de calcul modèle et définissez les données qu'elle contient avec OpenPyXL.
Si vous devez gérer des images qui ne peuvent être créées que du côté OpenPyXL, créez une feuille de calcul pour les données de la même manière et placez les images dessus avec OpenPyXL. Si vous ne pouvez pas définir un nom d'identification pour l'image créée par ʻadd_image () ʻ d'OpenPyXL et que vous devez passer plusieurs images, vous pouvez distinguer les images car le côté macro Excel VBA ne peut pas distinguer les images. Il est également nécessaire de concevoir quelque chose comme ça.
Je pense qu'il est plus rapide de voir l'échantillon que de l'expliquer en détail. Le traitement principal de Python et Excel VBA est d'environ 100 lignes. Pour exécuter l'exemple, Python nécessite le package OpenPyXL ainsi que le package Pillow pour l'édition d'images. (Si vous obtenez une erreur, veuillez installer le package si nécessaire)
Il est disponible sur Github (https://github.com/umazular/openpyxl).
--Standard Python 2.7.5 + OpenPyXL 2.6.4 sur CentOS 7 --Python 3.7.3 + OpenPyXL 3.0.2 sur Raspbian (Debian 10.2) --Python 3.7.2 + OpenPyXL 3.0.0 installé sur Windows10
J'ai confirmé à. (J'essaye de ne pas dépendre autant que possible de l'environnement)
L'échantillon a été créé en imaginant la sortie du reçu. Lisez une ou plusieurs données de reçu CSV + images et affichez le résultat dans Excel. Dans l'exemple, les fichiers CSV et les images pour 2 feuilles sont créés à l'avance. Le fichier CSV par défaut de l'exemple est Shift-JIS, remplacez-le par UTF-8 en fonction de votre environnement.
J'ai essayé de définir le modèle de feuille de rapport ("reçu") qui semble difficile avec OpenPyXL.
Excel VBA peut être ouvert en sélectionnant "Développement" -> "Visual Basic" dans le menu Excel. Si l'onglet «Développement» n'est pas affiché, ouvrez l'écran d'options Excel avec Fichier-> Options et cochez «Développement» sur l'onglet principal des paramètres utilisateur sur le ruban pour l'afficher.
L'exécution du programme python générera un classeur Excel (sampleoutput.xlsm) avec l'ensemble de données.
$ ls *.xlsm
sample.xlsm
$ python sample.py
$ ls *.xlsm
sample.xlsm sampleoutput.xlsm
$
Si vous ouvrez le classeur Excel de sortie dans un environnement dans lequel l'exécution de macro est autorisée, le traitement de la macro de paramétrage des données sera exécuté uniquement pour la première fois et le résultat sera créé.
--Notes sur l'utilisation d'openpyxl en python https://qiita.com/sky_jokerxx/items/dc9d8827d946b467ba4b
Recommended Posts