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 :

openoffice calc : mettre une formule de concatenation dans la cellule de fichiers et extraire le résultat une [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut openoffice calc : mettre une formule de concatenation dans la cellule de fichiers et extraire le résultat une
    Bonjour chers camarades,
    1. j'ai commencé avec le basic sur Amstrad 6128, alors je patauge un peu et chatgpt n'est pas que mon ami...
    2. J'aimerais insérer dans la cellule (D1) de tous les fichiers ayant un nom contenant le texte AZE.ods (calc openoffice) une formule de concaténation du type =JOINDRE.TEXTE(", ";1;D2:D100) et obtenir la liste des textes contenus dans les cellules D2 à D100 avec un séparateur virgule.
    3. Ensuite, j'aimerais extraire le contenu "texte" de la cellule D1 de l'ensemble des fichiers pour le placer une colonne d'un autre tableau (colonne D).
    ----
    Pour l'instant je piétine avec le 2. J'ai ce script, mais :
    I. cela ne supprime pas le contenu de la cellule cible
    II. cela n'insert pas de formule dans la cellule cible (seulement avec textjoint, mais qui ne donne rien sur openoffice calc)
    III. en utilisant JOINDRE.TEXTE(", ";1;D2:D5)"), j'ai en plus ce message d'erreur de format non respecté : def update_cell_with_formula(file_path, formula="of:=JOINDRE.TEXTE(", ";1;D2:D5)"):
    ----
    Je joins le script. Merci à ce forum et aux curieux qui viendront jeter un œil bienveillant sur mes déboires.
    Bien à vous !

    Nom : Capture d'écran 2024-09-20 221716.jpg
Affichages : 146
Taille : 267,7 Ko

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 966
    Points : 7 389
    Points
    7 389
    Par défaut
    Bonjour,

    Citation Envoyé par ANewB
    3. Ensuite, j'aimerais extraire le contenu "texte" de la cellule D1 de l'ensemble des fichiers pour le placer une colonne d'un autre tableau (colonne D).
    Pas sûr d'avoir compris, mais faudra garder en mémoire chaque texte de la cellule D1 dans une liste. Vous voulez placer quoi après ? Car on parle de plusieurs éléments texte...

    Je ne sais pas non plus si vous ne faîtes pas un défaut de langage entre lignes et colonnes.

    Pour vous aider dans votre script, il faudrait déjà que le contexte et la problématique soit bien posée.

  3. #3
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,



    Pas sûr d'avoir compris, mais faudra garder en mémoire chaque texte de la cellule D1 dans une liste. Vous voulez placer quoi après ? Car on parle de plusieurs éléments texte...

    Je ne sais pas non plus si vous ne faîtes pas un défaut de langage entre lignes et colonnes.

    Pour vous aider dans votre script, il faudrait déjà que le contexte et la problématique soit bien posée.
    Merci pour cette demande de détails :
    -j'aimerais extraire de différents calc (qui sont sur le même modèle) les éléments contenus pour tous dans la colonne D (entre D2 et Dn). Ces éléments sont du texte court (un mot ou une suite de mots avec un séparateur " ; ") et les placer une nouvelle table : par exemple C2 pour le premier groupe de texte, C3 pour le deuxième groupe de texte, Cn pour le nième groupe de texte. EXEMPLE : D2 "documentaire" / D3 "poésie" / D4 "roman ; aventure" -> D1 =JOINDRE.TEXTE(", ";1;D2:D100) PUIS SUR UNE AUTRE TABLE C2 "documentaire, poésie, roman ; aventure" / C2 "résultat pour un autre fichier", etc.

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 966
    Points : 7 389
    Points
    7 389
    Par défaut
    Avec

    Nom : Capture d’écran_2024-09-21_14-11-21.png
Affichages : 116
Taille : 1,7 Ko


    J'ai créé un nouveau fichier result.ods

    Nom : Capture d’écran_2024-09-21_14-12-32.png
Affichages : 115
Taille : 1,7 Ko


    Voici mon code de tests

    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
    from odf.opendocument import load, OpenDocumentSpreadsheet
    from odf.table import Table, TableRow, TableCell
     
    from odf.text import P
     
    def lire_colonne(fichier, colonne_index):
        ods = load(fichier)
        tables = ods.getElementsByType(Table)
        texte = []
     
        for row in tables[0].getElementsByType(TableRow):
            cells = row.getElementsByType(TableCell)
            col_index = 0
     
            for cell in cells:
                repeated = int(cell.getAttribute("numbercolumnsrepeated") or 1)
                if col_index <= colonne_index < col_index + repeated:
                    cell_text = ''.join([str(p) for p in cell.getElementsByType(P)])
                    if cell_text.strip():
                        texte.append(cell_text.strip())
                col_index += repeated
     
        return ', '.join(texte)
     
    def ecrire_resultat(fichiers, fichier_sortie, colonne_index):
        ods_sortie = OpenDocumentSpreadsheet()
        table = Table()
        ods_sortie.spreadsheet.addElement(table)
     
        for fichier in fichiers:
            texte = lire_colonne(fichier, colonne_index)
            if texte:
                row = TableRow()
                cell = TableCell()
                cell.addElement(P(text=texte))
                row.addElement(cell)
                table.addElement(row)
     
        ods_sortie.save(fichier_sortie)
     
     
    ecrire_resultat(["my_file.ods"], "result.ods", 3)
    L'index 3 représentant la colonne D

  5. #5
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut génial ! ça marche
    Merci beaucoup Fred (et Gaston !),
    cela fonctionne ! J'ai ajouté ce bout de script pour aller chercher tous les fichiers ayant une extension similaire et ça marche super !

    code :

    def rechercher_fichiers_ods(repertoire):
    fichiers_trouves = []
    for root, dirs, files in os.walk(repertoire):
    for file in files:
    if fnmatch.fnmatch(file, '*-LIVR.ods'):
    fichiers_trouves.append(os.path.join(root, file))
    return fichiers_trouves

    Bonne journée
    (l'informatique, c'est plus sympa quand ça marche)

  6. #6
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Avec

    L'index 3 représentant la colonne D
    Bonsoir,

    j'ai créé une nouvelle colonne (avant la colonne A) pour mettre un "nouveau" contenu (même genre) dans la nouvelle colonne. Cependant, le contenu ne s'insert pas dès le haut de la colonne, mais seulement dans une ligne en dessous du texte, en escalier... je ne vois pas.
    Pièce jointe 659584

    le script :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    import os
    import fnmatch
    from odf.opendocument import load, OpenDocumentSpreadsheet
    from odf.table import Table, TableColumn, TableRow, TableCell
    from odf.text import P
     
    # Fonction pour ajouter une colonne avant la colonne A
    def ajouter_colonne_avant_a(qfichier_sortie):
        # Charger le fichier ODS existant
        if os.path.exists(qfichier_sortie):
            ods = load(qfichier_sortie)
        else:
            print("Fichier non trouvé.")
            return
     
        tables = ods.getElementsByType(Table)
        if not tables:
            print("Pas de table trouvée dans le fichier.")
            return
     
        table = tables[0]  # Sélectionner la première table
     
        # Vérifier s'il y a des colonnes dans la table, sinon en ajouter une
        colonnes = table.getElementsByType(TableColumn)
        if not colonnes:
            # Ajouter une colonne par défaut s'il n'y a pas de colonnes définies
            default_column = TableColumn()
            table.addElement(default_column)
            colonnes = table.getElementsByType(TableColumn)
     
        # Insérer une nouvelle colonne avant la première colonne (colonne A)
        new_column = TableColumn()
        table.insertBefore(new_column, colonnes[0])
     
        # Ajouter une cellule vide au début de chaque ligne
        rows = table.getElementsByType(TableRow)
        for row in rows:
            new_cell = TableCell()
            row.insertBefore(new_cell, row.getElementsByType(TableCell)[0])
     
        # Sauvegarder les modifications dans le fichier
        ods.save(cfichier_sortie)
        print(f"Colonne ajoutée avec succès avant la colonne A dans le fichier '{cfichier_sortie}'.")
     
    # Exemple d'utilisation
    cfichier_sortie = "C:/Users/Utilisateur/Desktop/result.ods"
    ajouter_colonne_avant_a(cfichier_sortie)
     
    # Fonction pour lire la colonne d'un fichier ODS
    def lire_colonne(fichier, acolonne_index):
        ods = load(fichier)
        tables = ods.getElementsByType(Table)
        texte = []
     
        for row in tables[0].getElementsByType(TableRow):
            cells = row.getElementsByType(TableCell)
            col_index = 0
     
            for cell in cells:
                repeated = int(cell.getAttribute("numbercolumnsrepeated") or 1)
                if col_index <= acolonne_index < col_index + repeated:
                    cell_text = ''.join([str(p) for p in cell.getElementsByType(P)])
                    if cell_text.strip():
                        texte.append(cell_text.strip())
                col_index += repeated
     
        return ', '.join(texte)
     
    # Fonction pour rechercher tous les fichiers contenant "-AZE.ods" dans leur nom
    def rechercher_fichiers_ods(repertoire):
        fichiers_trouves = []
        for root, dirs, files in os.walk(repertoire):
            for file in files:
                if fnmatch.fnmatch(file, '*-AZE.ods'):
                    fichiers_trouves.append(os.path.join(root, file))
        return fichiers_trouves
     
    # Fonction pour écrire les résultats dans une colonne spécifique d'un fichier ODS
    def ecrire_resultat_dans_colonne(repertoire, afichier_sortie, acolonne_index):
        fichiers = rechercher_fichiers_ods(repertoire)  # Recherche des fichiers
     
        # Charger le fichier ODS existant
        if os.path.exists(afichier_sortie):
            ods_sortie = load(afichier_sortie)
        else:
            ods_sortie = OpenDocumentSpreadsheet()  # Créer un nouveau fichier si nécessaire
     
        tables = ods_sortie.getElementsByType(Table)
        if not tables:
            table = Table()
            ods_sortie.spreadsheet.addElement(table)
        else:
            table = tables[0]  # Sélectionner la première table
     
        # Vérifier et ajouter une colonne avant la colonne A
        new_column = TableColumn()
        table.insertBefore(new_column, table.getElementsByType(TableColumn)[0] if table.getElementsByType(TableColumn) else None)
     
        # Ajouter les résultats dans la nouvelle colonne
        for fichier in fichiers:
            texte = lire_colonne(fichier, acolonne_index)
            if texte:
                # Ajouter une nouvelle ligne ou trouver la première ligne vide
                rows = table.getElementsByType(TableRow)
                if not rows:
                    new_row = TableRow()
                    table.addElement(new_row)
                    new_cell = TableCell()
                    new_cell.addElement(P(text=texte))
                    new_row.addElement(new_cell)
                else:
                    # Trouver la première ligne vide pour ajouter le texte
                    for row in rows:
                        cells = row.getElementsByType(TableCell)
                        if len(cells) < 1:  # Si la ligne n'a pas de cellules
                            new_cell = TableCell()
                            new_cell.addElement(P(text=texte))
                            row.addElement(new_cell)
                            break
                    else:
                        # Si aucune cellule n'est vide, ajouter une nouvelle ligne
                        new_row = TableRow()
                        table.addElement(new_row)
                        new_cell = TableCell()
                        new_cell.addElement(P(text=texte))
                        new_row.addElement(new_cell)
     
        # Sauvegarder les modifications dans le fichier
        ods_sortie.save(fichier_sortie)
        print(f"Résultats ajoutés avec succès dans le fichier '{fichier_sortie}'.")
     
    # Exemple d'utilisation : recherche de fichiers dans un répertoire spécifique
    repertoire_de_recherche = "C:/Users/Utilisateur/Desktop/"
    fichier_sortie = "C:/Users/Utilisateur/Desktop/result.ods"
    colonne_index = 10
     
    ecrire_resultat_dans_colonne(repertoire_de_recherche, fichier_sortie, colonne_index)
    Bonne soirée à tous.
    (l'informatique, c'est bien, mais c'est long...

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 966
    Points : 7 389
    Points
    7 389
    Par défaut
    Citation Envoyé par ANewB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ods.save(cfichier_sortie)
    serait pas plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ods.save(qfichier_sortie)
    et

    Code ANewB : Sélectionner tout - Visualiser dans une fenêtre à part
    ods_sortie.save(fichier_sortie)
    plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ods_sortie.save(afichier_sortie)
    ?

    Bref vous vous mélangez dans vos manipulations de fichiers, vous devriez commencer soft en faisant des petits programmes utilisant ce module.

    Si table.getElementsByType(TableColumn) est vide, vous insérez new_column avant None, ce qui peut placer la colonne à la fin plutôt qu'au début, ce qui est contraire à votre intention d'ajouter la colonne avant la colonne A.
    Il faut vous assurer qu'il y a au moins une colonne avant d'insérer la nouvelle colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    colonnes = table.getElementsByType(TableColumn)
    if colonnes:
        table.insertBefore(new_column, colonnes[0])
    else:
        table.addElement(new_column)  # Ajoute la colonne si aucune colonne n'existe

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 132
    Points : 9 676
    Points
    9 676
    Par défaut
    hello,
    on peut aussi utiliser le paquet pandas pour faire le traitement car il sait manipuler les fichiers ods si le paquet odfpy est installé.
    Avec ce code :
    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
    import os
    import fnmatch
    import pandas as pd
     
     
    # Fonction pour rechercher tous les fichiers contenant "-AZE.ods" dans leur nom
    def rechercher_fichiers_ods(repertoire):
        fichiers_trouves = []
        for root, dirs, files in os.walk(repertoire):
            for file in files:
                if fnmatch.fnmatch(file, '*AZE.ods'):
                    fichiers_trouves.append(os.path.join(root, file))
        return fichiers_trouves
     
     
    repertoire = 'd:/dev/LibreOffice'
    fichiers = rechercher_fichiers_ods(repertoire)  # Recherche des fichiers
    maliste = []
    # Create the pandas DataFrame
    dfout = pd.DataFrame(columns=['col1', 'col2','Genre'])
    for fic in fichiers:
        df = pd.read_excel(fic, usecols='D')
        maliste.append(', '.join(df['Genre'].tolist()))
    dfout['Genre'] = maliste
    with pd.ExcelWriter("d:/temp/result.ods") as writer:
        dfout.to_excel(writer)
    avec ces 2 classeurs dans le répertoire source :
    Nom : Fic1Aze.png
Affichages : 94
Taille : 22,0 KoNom : fic2Aze.png
Affichages : 92
Taille : 20,4 Ko


    j'obtiens ce classeur en résultat :
    Nom : resultAze.png
Affichages : 149
Taille : 26,6 Ko

    Ami calmant, J.P

  9. #9
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut Excellent !
    Vous êtes formidables !!!
    C'est vrai que je devrais commencer simple... merci en tous cas de vos tutorat.
    Bon dimanche.

  10. #10
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut PyCharm n'est pas d'accord ???
    Citation Envoyé par jurassic pork Voir le message
    hello,
    on peut aussi utiliser le paquet pandas pour faire le traitement car il sait manipuler les fichiers ods si le paquet odfpy est installé.
    Avec ce code :
    Nom : resultAze.png
Affichages : 149
Taille : 26,6 Ko
    Ami calmant, J.P
    Bonsoir JP,
    PyCharm m'indique deux avertissements et n'execute pas la commande ?
    1. Expected type 'int', got 'str' instead
    2. Shadows name 'repertoire' from outer scope

    Comment se fait-ce ?
    à bientôt !

  11. #11
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    serait pas plutôt...
    Bonsoir Fred,
    j'ai essayé de placer le code (et j'ai rectifié mes erreurs de nommage), mais je n'obtient toujours pas le résultat 'comme sur l'exemple de JP). Les nouvelles entrées se placent en dessous des précédentes.
    Bien cordialement.

  12. #12
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 966
    Points : 7 389
    Points
    7 389
    Par défaut
    Il faut voir le code entier après modifications... ça marche pas est une expression qui ne permet pas d'avancer en informatique !

  13. #13
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il faut voir le code entier après modifications... ça marche pas est une expression qui ne permet pas d'avancer en informatique !
    Bonsoir Fred,

    je me suis mal exprimé. Cela fonctionne puisque vous en avez fait l'expérience. J'ai dû rater une étape.

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    import os
    import fnmatch
    from odf.opendocument import load, OpenDocumentSpreadsheet
    from odf.table import Table, TableColumn, TableRow, TableCell
    from odf.text import P
     
     
    # Fonction pour lire la colonne d'un fichier ODS
    def lire_colonne(fichier, acolonne_index):
        ods = load(fichier)
        tables = ods.getElementsByType(Table)
        texte = []
     
        for row in tables[0].getElementsByType(TableRow):
            cells = row.getElementsByType(TableCell)
            col_index = 0
     
            for cell in cells:
                repeated = int(cell.getAttribute("numbercolumnsrepeated") or 1)
                if col_index <= acolonne_index < col_index + repeated:
                    cell_text = ''.join([str(p) for p in cell.getElementsByType(P)])
                    if cell_text.strip():
                        texte.append(cell_text.strip())
                col_index += repeated
     
        return ', '.join(texte)
     
     
    # Fonction pour rechercher tous les fichiers contenant "-AZE.ods" dans leur nom
    def rechercher_fichiers_ods(repertoire):
        fichiers_trouves = []
        for root, dirs, files in os.walk(repertoire):
            for file in files:
                if fnmatch.fnmatch(file, '*-AZE.ods'):
                    fichiers_trouves.append(os.path.join(root, file))
        return fichiers_trouves
     
     
    # Fonction pour écrire les résultats dans une colonne spécifique d'un fichier ODS
    def ecrire_resultat_dans_colonne(repertoire, afichier_sortie, acolonne_index):
        fichiers = rechercher_fichiers_ods(repertoire)  # Recherche des fichiers
     
        # Charger le fichier ODS existant
        if os.path.exists(afichier_sortie):
            ods_sortie = load(afichier_sortie)
        else:
            ods_sortie = OpenDocumentSpreadsheet()  # Créer un nouveau fichier si nécessaire
     
        tables = ods_sortie.getElementsByType(Table)
        if not tables:
            table = Table()
            ods_sortie.spreadsheet.addElement(table)
        else:
            table = tables[0]  # Sélectionner la première table
     
        # Vérifier et ajouter une colonne avant la colonne A
        new_column = TableColumn()
        colonnes = table.getElementsByType(TableColumn)
        if colonnes:
            table.insertBefore(new_column, colonnes[0])
        else:
            table.addElement(new_column)  # Ajoute la colonne si aucune colonne n'existe
     
        # Ajouter les résultats dans la nouvelle colonne
        for fichier in fichiers:
            texte = lire_colonne(fichier, acolonne_index)
            if texte:
                # Ajouter une nouvelle ligne ou trouver la première ligne vide
                rows = table.getElementsByType(TableRow)
                if not rows:
                    new_row = TableRow()
                    table.addElement(new_row)
                    new_cell = TableCell()
                    new_cell.addElement(P(text=texte))
                    new_row.addElement(new_cell)
                else:
                    # Trouver la première ligne vide pour ajouter le texte
                    for row in rows:
                        cells = row.getElementsByType(TableCell)
                        if len(cells) < 1:  # Si la ligne n'a pas de cellules
                            new_cell = TableCell()
                            new_cell.addElement(P(text=texte))
                            row.addElement(new_cell)
                            break
                    else:
                        # Si aucune cellule n'est vide, ajouter une nouvelle ligne
                        new_row = TableRow()
                        table.addElement(new_row)
                        new_cell = TableCell()
                        new_cell.addElement(P(text=texte))
                        new_row.addElement(new_cell)
     
        # Sauvegarder les modifications dans le fichier
        ods_sortie.save(fichier_sortie)
        print(f"Résultats ajoutés avec succès dans le fichier '{fichier_sortie}'.")
     
     
    # Exemple d'utilisation : recherche de fichiers dans un répertoire spécifique
    repertoire_de_recherche = "C:/Users/Utilisateur/Desktop/"
    fichier_sortie = "C:/Users/Utilisateur/Desktop/result.ods"
    colonne_index = 10
     
    ecrire_resultat_dans_colonne(repertoire_de_recherche, fichier_sortie, colonne_index)
    Bien cordialement (et merci pour le temps passé)

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 132
    Points : 9 676
    Points
    9 676
    Par défaut
    Hello,
    Citation Envoyé par ANewB Voir le message
    PyCharm m'indique deux avertissements et n'execute pas la commande ?
    1. Expected type 'int', got 'str' instead
    2. Shadows name 'repertoire' from outer scope

    Comment se fait-ce ?
    Pour la première erreur il faudrait nous dire où se situe l'erreur et nous montrer toutes tes données Source. Par contre si tu as dans les données de la colonne que tu veux utiliser des données qui ne sont pas des chaînes. Il faut alors forcer le type des données dans le join à str(string) par un map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            maliste.append(', '.join(map(str,df['Genre'].tolist())))
    Pour la deuxième erreur c'est certainement que Pycharm voit la variable repertoire comme une variable globale. Alors deux solutions :
    1 - renommer la variable dans la partie principale du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        rep = 'd:/dev/LibreOffice'
        fichiers = rechercher_fichiers_ods(rep)  # Recherche des fichiers
    où alors mettre la partie principale du programme dans une procédure main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def main():
        repertoire = 'd:/dev/LibreOffice'
        fichiers = rechercher_fichiers_ods(repertoire)  # Recherche des fichiers
        # etc ...
     
    main()
    Voici mon code corrigé :
    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
    import os
    import fnmatch
    import pandas as pd
     
    # Fonction pour rechercher tous les fichiers contenant "-AZE.ods" dans leur nom
    def rechercher_fichiers_ods(repertoire):
        fichiers_trouves = []
        for root, dirs, files in os.walk(repertoire):
            for file in files:
                if fnmatch.fnmatch(file, '*AZE.ods'):
                    fichiers_trouves.append(os.path.join(root, file))
        return fichiers_trouves
     
     
    def main():
        repertoire = 'd:/dev/LibreOffice'
        fichiers = rechercher_fichiers_ods(repertoire)  # Recherche des fichiers
        maliste = []
        # Create the pandas DataFrame
        dfout = pd.DataFrame(columns=['col1', 'col2','Genre'])
        for fic in fichiers:
            df = pd.read_excel(fic, usecols='D',converters={'Genre':str})
            maliste.append(', '.join(df['Genre'].tolist()))
        dfout['Genre'] = maliste
        with pd.ExcelWriter("d:/temp/result.ods") as writer:
            dfout.to_excel(writer,index=False)
     
    main()
    J'ai rajouté dans la fonction de sortie index=False pour ne pas avoir la colonne des numéros de lignes dans le fichier de sortie.

    Ami calmant, J.P

  15. #15
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 966
    Points : 7 389
    Points
    7 389
    Par défaut
    Il y a toujours une erreur...

    Citation Envoyé par ANewB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ods_sortie.save(fichier_sortie)
    alors que votre paramètre est nommé afichier_sortie.

  16. #16
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut réponse à JP sur l'erreur 1.
    Citation Envoyé par jurassic pork Voir le message
    Hello,

    Pour la première erreur il faudrait nous dire où se situe l'erreur et nous montrer toutes tes données Source. Par contre si tu as dans les données de la colonne que tu veux utiliser des données qui ne sont pas des chaînes. Il faut alors forcer le type des données dans le join à str(string) par un map...
    Voilà, pour la première erreur, il tique PyCharm tique sur usecols='D' a priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               df = pd.read_excel(fic, usecols='D', converters={'Genre': str})

  17. #17
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut réponse à Fred sur l'erreur de nommage
    Citation Envoyé par fred1599 Voir le message
    Il y a toujours une erreur...
    alors que votre paramètre est nommé afichier_sortie.
    Bonjour Fred,
    l'erreur retirée, le contenu s'affiche (dans result.ods) toujours en dessous de ligne dans laquelle une celle est remplie, quelque soit sa place dans la ligne.
    Bonne journée

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 132
    Points : 9 676
    Points
    9 676
    Par défaut
    Citation Envoyé par ANewB Voir le message
    Voilà, pour la première erreur, il tique PyCharm tique sur usecols='D' a priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               df = pd.read_excel(fic, usecols='D', converters={'Genre': str})
    c'est bizarre parce normalement usecols doit être une str :
    usecols : str, list-like, or callable, default None
    Quelle version de pandas ?
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  19. #19
    Candidat au Club
    Homme Profil pro
    salariéassociatif
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : salariéassociatif
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    c'est bizarre parce normalement usecols doit être une str :

    Quelle version de pandas ?
    JP,
    un pip show m'indique la version 2.2.3

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 132
    Points : 9 676
    Points
    9 676
    Par défaut
    L'erreur serait plutot du côté du converters surtout si tu n'as pas de colonne Genre dans tes données sources . Essaie ceci pour main (il faut que la colonne D se nomme Genre (mettre Genre en D1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def main():
        repertoire = 'd:/dev/LibreOffice'
        fichiers = rechercher_fichiers_ods(repertoire)  # Recherche des fichiers
        maliste = []
        # Create the pandas DataFrame
        dfout = pd.DataFrame(columns=['col1', 'col2','Genre'])
        for fic in fichiers:
            df = pd.read_excel(fic, usecols='D')
            maliste.append(', '.join(map(str,df['Genre'].tolist())))
            # si on veut éliminer les doublons
            # maliste.append(', '.join(map(str,list(set(df['Genre'].tolist())))))
        dfout['Genre'] = maliste
        with pd.ExcelWriter("d:/temp/result.ods") as writer:
            dfout.to_excel(writer,index=False)
    em modifiant les chemins pour que cela corresponde à tes chemins
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/07/2017, 21h56
  2. formule non rafraichie dans ma cellule
    Par batou22003 dans le forum Excel
    Réponses: 1
    Dernier message: 02/10/2009, 16h43
  3. mettre la date du jour dans un nom de fichier
    Par oudin.charles dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 10/06/2009, 17h39
  4. [VBA-E] Formule SOMME incluse dans la cellule
    Par max2245 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/01/2007, 20h48

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