Le besoin était simple, à partir d’un fichier de vente global à une société, il fallait proposer un fichier spécifique par commercial pour qu’il puisse saisir son prévisionnel propre à chacun de ses clients … puis proposer un outil permettant de réaliser la synthèse de ses documents particuliers.
La manipulation de fichier Excel via openpyxl
Les fonctions de base :
L’ouverture d’un fichier excel avec cette libraire se fait comme dans la vraie vie. Il faut ouvrir le fichier : load_workbook puis sélectionner l’onglet dans lequel on souhaite travailler . Les onglets sont stockés sous forme de dictionnaire, il suffit de donc le charger en utilisant comme clé le nom de l’onglet workbook[‘nomOnglet’].
Lire une valeur : Il suffit de repartir de l’objet utilisé pour récupérer l’onglet. Les cellules sont atteignables via le couple Ligne/colonne. Par exemple, pour récupérer la valeur en F13, il suffit de faire : val = onglet[‘F13’].value
def getValueNumerique(ong, key): valT = 0 val = ong[key].value if (isinstance(val, Number)): valT = val return valT
Enregistrer une valeur peut être réaliser en faisant une simple affectation : onglet[‘F13’] = val
Ajouter/dupliquer un onglet : wb.copy_worksheet(wb[‘CC’])
Enregistrer le fichier final : wb.save(« nouveauNom »)
De un vers plusieurs : Python via Panda pour un éclatement rapide
La difficulté la plus grande est de trouver l’élément sur lequel vos filtres vont pouvoir s’appuyer. Dans mon contexte, chaque vente était relié à son représentant. La sélection des données fut donc de :
- Filtrer sur la période de temps souhaité : listeCommade38_2018 = df_filtre_soc[( (df_filtre_soc[« MOIS_FACT »] >= 201800.) & (df_filtre_soc[« MOIS_FACT »] <= 201900.) )]
- Puis, après construit la liste des représentants, boucler dessus afin de ne traiter que les ventes du représentant en cours de traitement : df_filtre = df[(df[« CODE_REPRESENTANT »] == representant_ref)]
- Dans certain cas, nous n’avons pas besoin que d’une valeur, mais d’une combinaison de valeur. Dans ce cas, la fonction query facilite les regroupements d’information : m2019 = (liste_2019_cc_filtre.query(‘@pp.liste_ref in CODE_ART’))[« QTE_EXPE »]
- On peut ensuite appliquer des fonctions sur le résultat obtenu : nbProd_2019 = m2019.sum()
De plusieurs vers un : une simple routine en Python
Tout aussi simple. Pour identifier l’ensemble des fichiers résultats, la commande glob.glob(path) permet de retrouver un ensemble de fichier correspondant à un dossier et possédant un pattern exploitable.
Ensuite, il suffit d’ouvrir chacun des fichiers, de retrouver l’onglet de synthèse, puis de lire les données calculée via macro. Attention, afin d’avoir la valeur et non la méthode de la macro, il faut passer des arguments à la fonction d’ouverture de document excel : wb = load_workbook(fich, read_only=False, keep_vba=True, data_only=True).
Dans mon cas, les données étant réparties en fonction d’un template fixe, j’ai préféré passer par un dictionnaire pour faciliter l’identification des données à consulter :
totaux ={ 'F7' : 0, 'F8' : 0, 'F9' : 0, 'F13' : 0, 'F14' : 0, 'F15' : 0, 'F16' : 0 }
Il suffit ensuite de boucler sur le dictionnaire, pour réaliser, en une boucle, la lecture de l’ensemble des données :
def rechercheOngletSynthese(wb, sommeTige): synth = wb['Synthese'] for key in totaux: val = synth[key].value
Une fois les valeurs obtenues, il n’y a plus qu’à construire le fichier résultat (basé une fois de plus sur un template excel.
wb = load_workbook(fichR, read_only=False, keep_vba=True, data_only=True) # On va dans l'onglet synthèse synth = wb['Synthese'] for key in totaux: synth[key] = totaux[key] sauvegarde_finale('resultat2019.xls' , wb)
Au final, avec deux scripts, nous pouvons automatiser la génération des fichiers à faire remplir, puis la construction de la synthèse. Le temps de développement est relativement cours (le plus long fut la prise du résultat à produire). De plus, le résultat pouvant être produit à la demande, il est très simple de fournir des résultats intermédiaire … le temps que l’ensemble des fichiers reviennent après leur saisie.
Liste des imports utiles :
import csv import pandas as pd import produit import re as Regex #Pour le traitement des fichiers excels from openpyxl import Workbook from openpyxl import load_workbook #Pour la vérification des nombres from numbers import Number # Pour les fichiers import os.path import glob from pathlib import Path import unicodedata
Url :