[PYTHON] À propos des problèmes et des solutions d'OpenPyXL (version Ver 3.0)

introduction

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.

À propos du problème d'OpenPyXL (2.6, 3.0)

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

Pourquoi est-il difficile de traiter avec OpenPyXL?

--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.

Solution au problème

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.

Exemple d'exemple

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)

Exemple d'emplacement de publication

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.

Comment exécuter l'exemple

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éé.

Matériaux de référence, etc.

--Notes sur l'utilisation d'openpyxl en python https://qiita.com/sky_jokerxx/items/dc9d8827d946b467ba4b

Recommended Posts

À propos des problèmes et des solutions d'OpenPyXL (version Ver 3.0)
À propos des problèmes et des solutions d'OpenPyXL (version Ver 3.0)
Le problème des menteurs et de l'honnêteté
Le problème des menteurs et de l'honnêteté
[Astuces] Problèmes et solutions dans le développement de python + kivy
À propos de l'environnement virtuel de Python version 3.7
Comparaison des solutions aux problèmes d'appariement de poids
À propos de _ et __
À propos de la justification gauche et de la justification droite de Kivy Label
À propos du comportement de copy, deepcopy et numpy.copy
Écrire une note sur la version python de python virtualenv
À propos des copies superficielles et profondes de Python / Ruby
"Régression linéaire" et "Version probabiliste de la régression linéaire" en Python "Régression linéaire de Bayes"
À propos de l'erreur d'importation de numpy et scipy dans anaconda
Pensez à la nouvelle génération de Rack et WSGI
Notes personnelles sur l'intégration de vscode et anaconda
[Python] Chapitre 01-02 À propos de Python (Exécution et installation de l'environnement de développement)
Gestion des versions de Node, Ruby et Python avec anyenv