IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Automatisation d'un processus copier / coller Excel


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études en recherche en santé
    Inscrit en
    Avril 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur d'études en recherche en santé
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2024
    Messages : 2
    Par défaut Automatisation d'un processus copier / coller Excel
    Bonjour à toutes et à tous,

    Je me permets de poser ma question sur ce forum car je vois souvent passer des topics questions / réponses de developpez.net, et je pense obtenir l'aide dont j'ai besoin ici !

    Pour commencer : je suis un néophyte en matière de programmation. J'apprends sur le tas, bidouillant à droite à gauche, cherchant à comprendre ce que je fais plutôt que de copier bêtement une solution et l'appliquer. C'est rapide, certes, mais mon but est de développer une compétence pour être capable de la réutiliser intelligemment, de l'adapter si besoin, etc.
    Bref, laissez-moi vous exposer mon "problème". Je vais essayer d'être le plus complet possible, et surtout le plus clair possible !

    J'ai un dossier, que nous appellerons "dossier_a" dans lequel j'ai une centaine de fichiers excel, nommés "fichier_a1.xlsx", "fichier_a2.xlsx", etc. jusqu'à "fichier_a150.xlsx"
    Sur ces fichiers, je n'ai qu'un onglet sur lequel j'ai une quantité astronomique de données. Pour chacun de ces fichiers, les données sont au même format (les cellules sont complétées de la même manière, il n'y a aucun décalage, etc.). Seule chose qui peut différer d'un fichier à l'autre : le nombre de lignes (certains fichiers ont jusqu'à 150 000 lignes, d'autres jusqu'à 132 000)...

    En parallèle, dans un autre dossier ("dossier_b"), j'ai un fichier modèle "extract.xlsx". Sur ce fichier, j'ai deux onglets :
    - le premier qui est vierge,
    - et le deuxième qui convient des formules de calcul qui se basent sur les valeurs renseignées dans le premier onglet pour calculer d'autres paramètres.


    Jusqu'à maintenant, je devais :
    - ouvrir un des fichiers "fichier_aX.xlsx",
    - copier l'intégralité des données disponibles sur l'onglet,
    - ouvrir le fichier "extract.xlsx",
    - coller les données sur le premier onglet de ce fichier,
    - attendre que mon PC mouline et que les données soient utilisées par les formules de calcul du deuxième onglet,
    - enregistrer le fichier sous un nouveau nom, par exemple "extract_aX.xlsx",
    - effacer les données du premier onglet de ce fichier modèle,
    - recommencer avec un nouveau fichier,
    - etc.

    L'idée est donc, pour chaque fichier "fichier_aX.xlsx", copier / coller les valeurs dans ce fameux fichier modèle "extract.xlsx" et enregistrer une nouvelle version avec les données du fichier "fichier_aX.xlsx", et refaire ça pour ma centaine de fichiers.

    La tâche est fastidieuse et chronophage. Cela n'est pas difficile, puisque c'est une histoire de copié / collé, mais comme chaque action prend du temps en raison du grand nombre de données dont je dispose, rester trois heures devant le PC à faire des copiés / collés n'est pas ultra intéressant...
    Et donc, je souhaiterais automatiser tout ça avec un script python, et ainsi faire en sorte de faire toutes les étapes et de les répéter pour chaque fichier. Ainsi, par exemple :

    - pour cinq fichiers "fichier_a1.xlsx", "fichier_a2.xlsx", "fichier_a3.xlsx", "fichier_a4.xlsx" et "fichier_a5.xlsx",
    - copier les données de chaque fichier sur ce modèle "extract.xlsx",
    - attendre que mes valeurs soient calculées automatiquement sur le deuxième onglet de ce fichier,
    - enregistrer une version "extract_a1.xlsx", effacer les données du fichier "extract.xlsx", puis recommencer avec le fichier "a2", puis "a3", et ainsi de suite...

    Voilà ! Je ne sais pas si j'ai été très limpide dans mes explications, et donc n'hésitez pas à me demander d'étoffer ou de préciser certaines choses !
    Si, en revanche, mon problème est clair, j'attends vos retours en sachant une fois de plus : mon but est de comprendre ce que je fais !

    Merci beaucoup par avance !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Perso, je passerai par une macro excel, en ayant ton fichier extract.xlsx en type template (.xltx), ça évitera de l'écraser par erreur et tu aura toujours un fichier identique au template à son ouverture (ça évite de faire l'opération de suppression des données, mais de l'autre côté, ça oblige à l'ouvrir à chaque fois).
    Tu ne copies à chaque fois que le contenu d'un seul fichier source ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études en recherche en santé
    Inscrit en
    Avril 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur d'études en recherche en santé
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2024
    Messages : 2
    Par défaut
    Salut !

    Merci beaucoup pour ta réponse !
    J'avais en effet pensé à faire une macro avec Excel, mais à dire vrai je m'étais naïvement dit que "ce serait plus simple et efficace" avec Python ! ^^
    Cela dit : rien ne m'empêche de regarder !

    Tu ne copies à chaque fois que le contenu d'un seul fichier source ?
    |> Oui, c'est ça : j'ouvre le premier fichier source, je copie l'intégralité du contenu de la première feuille / du premier onglet, j'ouvre le fichier template, je colle tout ce que j'ai dans le presse-papier sur le premier onglet de ce template, j'attends bien trente secondes (le temps que toutes les données soient copiées et que les calculs soient faits sur la deuxième feuille), j'enregistre le fichier sous un nouveau nom, puis j'efface le contenu du premier onglet et je recommence avec un nouveau fichier.

    C'est aussi pour ça que j'ai mis de côté la macro Excel car, même si ça doit être moins chronophage que ce que je fais manuellement, cela me demandera toujours un peu de manipulation.

    Après, si à la majorité (ou à l'unanimité !) vous me dites qu'il est plus simple et plus direct de faire une macro, dans ce cas je peux commencer par ça et apprendre à coder sous Python pour d'autres choses !

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    tu peux aussi manipuler tes fichiers xlsx avec LibreOffice et alors tu peux écrire des macros en python.
    Ami calmant, J.P

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Que ce soit avec un macro ou en python, ça devrait revenir grosso modo au même

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    voici un exemple de code python pour LibreOffice (à mettre dans un module python de LibreOffice (ex : ModulePython.py)) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    # coding: utf-8
    from __future__ import unicode_literals
    import uno
    import os
    from com.sun.star.beans import PropertyValue
    from com.sun.star.awt.MessageBoxType import MESSAGEBOX, INFOBOX, ERRORBOX, WARNINGBOX, QUERYBOX
    from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK
     
    try:
        CTX = uno.getComponentContext()
        SM = CTX.getServiceManager()
        desktop = XSCRIPTCONTEXT.getDesktop()
        ODOC = desktop.getCurrentComponent()
        parentwin = ODOC.CurrentController.Frame.ContainerWindow
        dispatcher = SM.createInstanceWithContext("com.sun.star.frame.DispatchHelper", CTX)
        model = desktop.getCurrentComponent()
    except:
        print("ModulePython init Error")
     
    def extraireTout(*args):
        dossierSrc = r"D:\temp\dossier_a"
        dossierDest = r"D:\temp\dossier_b"
        for name in os.listdir(dossierSrc):
            ficSrc = os.path.join(dossierSrc,name )
            ficDest = os.path.join(dossierDest, name.replace('fichier','extract') )
            print(ficSrc,ficDest)
            extraction(ficSrc,ficDest)
        MsgBox("fin d'extraction")
     
    def extraction(ficSrc,ficDest):
        ongletSrc = "Feuille1"
        ongletDest = "Feuille1"
        urlSrc = uno.systemPathToFileUrl(ficSrc)
        urlDest = uno.systemPathToFileUrl(ficDest)
        args =  (PropertyValue(Name='Hidden', Value=True),)
        docSrc = desktop.loadComponentFromURL(urlSrc, '_default', 0, args)
        oFeuilleSrc = docSrc.getSheets().getByName(ongletSrc)
        scc = oFeuilleSrc.createCursor()
        scc.gotoStartOfUsedArea(False)
        scc.gotoEndOfUsedArea(True)
        oAddr = scc.getRangeAddress()
        oDataSrc = oFeuilleSrc.getCellRangeByPosition(oAddr.StartColumn,oAddr.StartRow,
                                        oAddr.EndColumn,oAddr.EndRow).getDataArray()
        docSrc.close(0)
        oFeuilleDest = ODOC.getSheets().getByName(ongletDest)
        rngUtil = oFeuilleDest.getCellRangeByPosition(oAddr.StartColumn,oAddr.StartRow,
                                        oAddr.EndColumn,oAddr.EndRow)
        rngUtil.setDataArray(oDataSrc)
        ODOC.calculateAll() 
        args =  (PropertyValue(Name='FilterName', Value='Calc MS Excel 2007 XML'),)
        ODOC.storeToURL(urlDest, args)
        rngUtil.clearContents(7)
     
    def MsgBox(message, titre="Message", boxtype='message', boutons=BUTTONS_OK):
        types = {'message': MESSAGEBOX, 'info': INFOBOX, 'error': ERRORBOX,
                 'warn': WARNINGBOX, 'query': QUERYBOX}
        tk = SM.createInstanceWithContext("com.sun.star.awt.Toolkit", CTX)
        box = tk.createMessageBox(parentwin, types[boxtype], boutons, titre, message)
        return box.execute()
     
    g_exportedScripts = extraireTout,
    Ce que fait le code (macro extraireTout à exécuter à partir du classeur modèle ):

    1 - Balayer le répertoire source pour récupérer les fichiers source
    2 - Pour chaque fichier source appeler la fonction extraction
    3 - La fonction extraction qui a les noms entiers du fichier source et du fichier destination en paramètres fait ceci :
    4 - Ouvre le fichier source en mode invisible, récupère les données utiles (oDataSrc) de l'onglet choisi , et ferme le fichier
    5 - Copie les données utiles dans l'onglet choisi du classeur modèle et recalcule les formules de ce classeur.
    6 - On enregistre le classeur modèle dans le fichier de destination.
    7 - On efface les données utiles du classeur modèle
    8 - Quand on a fini le balayage, on affiche une fenêtre de dialogue qui dit que la macro est terminée.


    Pour en savoir plus sur les macros python dans libreOffice regarder ici : Macros/Conception et Développement d'Applications Python


    Ami calmant, J.P

Discussions similaires

  1. copier / coller excel 2000
    Par dawood dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/10/2008, 21h06
  2. Copier coller Excel
    Par wardavb dans le forum WinDev
    Réponses: 3
    Dernier message: 19/10/2007, 15h43
  3. Probleme de copier-coller EXCEL
    Par a.dequidt dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/09/2007, 15h10
  4. Réponses: 4
    Dernier message: 21/04/2006, 17h59
  5. Copier/Coller Excel
    Par tiftay01 dans le forum Excel
    Réponses: 15
    Dernier message: 10/03/2006, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo