[Résolu] [Python] Automatisation de fichier Calc

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

[Résolu] [Python] Automatisation de fichier Calc

Message par Julie49 »

Bonjour

Il y a 2 ans, Hubert Lambert m'a fait un script
La modération vous a écrit: voir : https://forum.openoffice.org/fr/forum/v ... =8&t=52447

(en phyton si je ne dit pas de bêtises) mais il faut que je modifie mon fichier et donc le script qu'il m'avais fait. J'avoue que je suis incapable de modifier ce script...

Il faut que je rajoute des champs et en enlève certains dans le script qu'Hubert Lambert m'avait fait.

J'ai mis en PJ le nouveau fichier.

A dispo s'il y a des questions.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Julie49 le 20 oct. 2017 07:58, modifié 6 fois.
AOO 4.1.1 - Windows 10
Avatar de l’utilisateur
Oukcha
RespOOnsable modération
RespOOnsable modération
Messages : 3948
Inscription : 06 oct. 2008 08:03

Re: [Calc] Automatisation de fichier(2)

Message par Oukcha »

Bonjour,

Plutôt que de poster dans un fil résolu, un nouveau sujet a été créé.
Julie49 a écrit :il faut que je modifie mon fichier
Merci de choisir un titre explicite ayant rapport avec les modifications voulues.

Cordialement
                                        
Pour tout savoir sur le fonctionnement de ce forum :arrow: À lire avant tout ! Image
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Automatisation de fichier(2)

Message par Hubert Lambert »

Bonjour,

Essaie avec cette version :

Code : Tout sélectionner

from operator import itemgetter
from itertools import groupby


def convertir(event=None):
    doc = XSCRIPTCONTEXT.getDocument()
    c = doc.Sheets.getByIndex(0).createCursor()
    c.gotoStartOfUsedArea(False)
    c.gotoEndOfUsedArea(True)
    data = list(c.DataArray)
    data = sorted(data[1:],key= itemgetter(2,6))
    lignes = []
    for m, l in groupby(data, itemgetter(2)):
        l = list(zip(*l))
        maxitem = len(l[0])//len(set(l[6]))
        lignes.append((m,   #Modèle
                       'Collection',   #Famille
                       l[0][0] == "GARCON" and "Garçon" or l[5][0].title(),   #Genre
                       l[1][0] == "BEBE" and "Bébé" or l[0][0].title(),   #Genre 2
                       l[3][0], l[4][0], l[5][0],   #Ligne, Forme, Fermeture
                       '{}/{}'.format(*itemgetter(0,-1)(''.join(l[6]).split('/'))),   #Pointures
                       '{}_{}_16.jpg'.format(l[8][0],int(l[9][0])),   #Image
                       '|'.join(l[7][:maxitem]),   #Matières
                       '|'.join(l[8][:maxitem]),   #Articles
                       '|'.join(str(int(x)) for x in l[9][:maxitem]),   #N° coloris
                       '|'.join(l[10][:maxitem]),   #Coloris
                       '|'.join('{}_{}_16.jpg'.format(x,int(y)) for x, y in list(zip(l[8],l[9]))[:maxitem]),   #Images
                       '|'.join(x.replace('\n','+') for x in l[11][:maxitem])))  #Semelles
    f = doc.Sheets.getByIndex(1)
    f.getCellRangeByPosition(0,1,14,500).clearContents(31)
    dest = f.getCellRangeByPosition(0,1,len(lignes[0])-1,len(lignes))
    dest.setDataArray(tuple(lignes))
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Bonjour

Je m'excuse pour le temps de réponse, je n'ai pas eu de notif et j'ai zappé de venir voir avant sur le post...

J'ai remplacé l'ancien code par celui que tu vient de me faire.
Juste deux petites choses :
- Dans la case "Genre" se met la fermeture" au lieu de "Fille" ou "Garçon"
- Pour le type de semelle, il y a des + à la place du | sauf le dernier (ex Semelle flexible+Voûte plantaire+Zip extérieur|Première moussée)

Et j'ai rajouté une colonne "Authentiques"

Merci pour ton aide ^^
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.1 - Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Automatisation de fichier(2)

Message par Hubert Lambert »

Nouvel essai donc :

Code : Tout sélectionner

from operator import itemgetter
from itertools import groupby


def convertir(event=None):
    MODELE = 3
    POINTURES = 7
    doc = XSCRIPTCONTEXT.getDocument()
    c = doc.Sheets.getByIndex(0).createCursor()
    c.gotoStartOfUsedArea(False)
    c.gotoEndOfUsedArea(True)
    data = list(c.DataArray)
    data = sorted(data[1:],key= itemgetter(MODELE, POINTURES))
    lignes = []
    for m, l in groupby(data, itemgetter(MODELE)):
        l = list(zip(*l))
        maxitem = len(l[0])//len(set(l[POINTURES]))
        lignes.append((m,   #Modèle
                      'Collection',   #Famille
                      l[0][0] == "GARCON" and "Garçon" or l[0][0].title(),   #Genre
                      l[1][0] == "BEBE" and "Bébé" or l[0][0].title(),   #Genre 2
                      l[2][0], l[4][0], l[5][0], l[6][0],   #Authentique, Ligne, Forme, Fermeture
                      '{}/{}'.format(*itemgetter(0,-1)(''.join(l[POINTURES]).split('/'))),   #Pointures
                      '{}_{}_16.jpg'.format(l[9][0], int(l[10][0])),   #Image
                      '|'.join(l[8][:maxitem]),   #Matières
                      '|'.join(l[9][:maxitem]),   #Articles
                      '|'.join(str(int(x)) for x in l[10][:maxitem]),   #N° coloris
                      '|'.join(l[11][:maxitem]),   #Coloris
                      '|'.join('{}_{}_16.jpg'.format(x,int(y)) for x, y in list(zip(l[9],l[10]))[:maxitem]),   #Images
                      '|'.join(x.replace('\n','|') for x in l[12][:maxitem])))  #Semelles
    f = doc.Sheets.getByIndex(1)
    f.getCellRangeByPosition(0,1,14,500).clearContents(31)
    dest = f.getCellRangeByPosition(0,1,len(lignes[0])-1,len(lignes))
    dest.setDataArray(tuple(lignes))
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Calc] Automatisation de fichier(2)

Message par Jurassic Pork »

hello,
Julie49 a écrit :(en phyton si je ne dit pas de bêtises) .
le phyton c'est la partie végétale du python :mrgreen:
Trêve de plaisanterie, Hubert dans ton script, il me semble qu'il y a une erreur sur la ligne :

Code : Tout sélectionner

l[1][0] == "BEBE" and "Bébé" or l[0][0].title(),   #Genre 2
Ne serait-ce pas plutôt (pas le chien) :

Code : Tout sélectionner

l[1][0] == "BEBE" and "Bébé" or l[1][0].title(),   #Genre 2
?
D'autre part en sortie dans les colonnes avec liste séparée par | on a parfois des répétitions par exemple :

Code : Tout sélectionner

Blanc|Marine Foncé|Blanc|Marine Foncé|Rose |Blanc imprimé|Rose Corail
est-ce grave ?
Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Automatisation de fichier(2)

Message par Hubert Lambert »

Jurassic Pork a écrit :Hubert dans ton script, il me semble qu'il y a une erreur sur la ligne :

Code : Tout sélectionner

l[1][0] == "BEBE" and "Bébé" or l[0][0].title(),   #Genre 2
Ne serait-ce pas plutôt (pas le chien) :

Code : Tout sélectionner

l[1][0] == "BEBE" and "Bébé" or l[1][0].title(),   #Genre 2
?
En effet, merci.
Jurassic Pork a écrit :D'autre part en sortie dans les colonnes avec liste séparée par | on a parfois des répétitions par exemple :

Code : Tout sélectionner

Blanc|Marine Foncé|Blanc|Marine Foncé|Rose |Blanc imprimé|Rose Corail
est-ce grave ?
Julie49 nous le dira...
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Je vous remercie.

Je regarde cela et vous tient au courant.
Le code fonctionne mais j'ai un soucis avec mon import sur WordPress à cause de la catégorie Authentique et des types de semelle... Il faudra peut-être que je modifie mon fichier...
Jurassic Pork a écrit :D'autre part en sortie dans les colonnes avec liste séparée par | on a parfois des répétitions par exemple :

Code : Tout sélectionner

Blanc|Marine Foncé|Blanc|Marine Foncé|Rose |Blanc imprimé|Rose Corail
est-ce grave ?
Oui c'est normal, il s'agit de variantes.


Merci à vous 2 en tout cas !
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Rebonjour

J'ai ajouté 2 colonnes "Magasins" et "Eshop", si je comprend ton code, il faut que je rajoute ces lignes

Code : Tout sélectionner

'|'.join(l[13][:maxitem]),   #Magasin
'|'.join(l[14][:maxitem]),   #Eshop
Après

Code : Tout sélectionner

 '|'.join(x.replace('\n','|') for x in l[12][:maxitem])))  #Semelles
C'est bien cela ?


Concernant la colonne "Semelle", il faut la générée comme les colonnes "Ligne", "Forme", ... C'est à dire qu'il ne s'agit pas de variantes (comme les coloris). Il peut y avoir plusieurs types mais ce sera tous les mêmes pour une ligne.

en espérant que je suis claire :tesfou:


Je vous ai remis le fichier mis à jour en PJ (les 2 feuilles st remplies)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.1 - Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Automatisation de fichier(2)

Message par Hubert Lambert »

Il me semble que tu as bien compris la logique du code :) .
Voici une toute nouvelle version, avec cette fois une gestion des erreurs pour le cas où des colonnes seraient mal remplies (comme dans un des derniers exemples) :

Code : Tout sélectionner

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import sys
import traceback  
from operator import itemgetter
from itertools import groupby


def convertir(event=None):
    try:
        MODELE = 3
        POINTURES = 7
        doc = XSCRIPTCONTEXT.getDocument()
        c = doc.Sheets.getByIndex(0).createCursor()
        c.gotoStartOfUsedArea(False)
        c.gotoEndOfUsedArea(True)
        data = list(c.DataArray)
        data = sorted(data[1:],key= itemgetter(MODELE, POINTURES))
        lignes = []
        for m, l in groupby(data, itemgetter(MODELE)):
            l = list(zip(*l))
            maxitem = len(l[0])//len(set(l[POINTURES]))
            lignes.append((m,   #Modèle
                        'Collection',   #Famille
                        l[0][0] == "GARCON" and "Garçon" or l[0][0].title(),   #Genre
                        l[1][0] == "BEBE" and "Bébé" or l[1][0].title(),   #Genre 2
                        l[2][0], l[4][0], l[5][0], l[6][0],   #Authentique, Ligne, Forme, Fermeture
                        '{}/{}'.format(*itemgetter(0,-1)(''.join(l[POINTURES]).split('/'))),   #Pointures
                        '{}_{}_16.jpg'.format(l[9][0], int(l[10][0])),   #Image
                        '|'.join(l[8][:maxitem]),   #Matières
                        '|'.join(l[9][:maxitem]),   #Articles
                        '|'.join(str(int(x)) for x in l[10][:maxitem]),   #N° coloris
                        '|'.join(l[11][:maxitem]),   #Coloris
                        '|'.join('{}_{}_16.jpg'.format(x,int(y)) for x, y in list(zip(l[9],l[10]))[:maxitem]),   #Images
                        l[12][0].replace('\n','|'),  #Semelles
                        l[13][0], l[14][0],  #Magasin, Eshop
                        ))
        f = doc.Sheets.getByIndex(1)
        f.getCellRangeByPosition(0,1,14,500).clearContents(31)
        dest = f.getCellRangeByPosition(0,1,len(lignes[0])-1,len(lignes))
        dest.setDataArray(tuple(lignes))
    except AttributeError as e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        errmsg = traceback.format_tb(exc_traceback)[0].decode('utf8')
        col = errmsg.split(b' #')[-1].strip(b'\n')
        errorbox("Une erreur s'est produite.\n\n"
               "Vérifiez les données dans la colonne <#{}>.".format(col))
    except:
        errorbox('{}'.format(traceback.format_exc().decode('utf8')))


#------------ERRORBOX----------------
def errorbox(message):
    doc = XSCRIPTCONTEXT.getDocument()
    win = doc.CurrentController.Frame.ContainerWindow
    tk = win.Toolkit
    box = tk.createMessageBox(win, 3, 1, "Erreur", message)
    return box.execute()


g_exportedScripts = convertir, 
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Hubert Lambert a écrit :Il me semble que tu as bien compris la logique du code :)
J'ai fait un BTS option développeur mais je me suis orienté vers l'intégration ensuite, j'ai encore qq reste (du basic toutefois) ^^

Merci pour ta nouvelle version.
Une dernière question, est-il possible de transformer les "Oui" des colonnes "magasins" et "eshop" en 1 et les non en 0 ?
Et que ces chiffres restent sur la feuille 2 (j'ai fait un test en live et ça les a transformé en "Vrai" et "Faux")

Ensuite, j'ai juste un problème avec ma colonne type de semelle sur mon import mais je pense que c'est un soucis lié à WordPress ^^
AOO 4.1.1 - Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Automatisation de fichier(2)

Message par Hubert Lambert »

Tu peux essayer quelque chose comme ceci :

Code : Tout sélectionner

l[13][0].lower() == 'oui' and 1 or 0,  #Magasin
l[14][0].lower() == 'oui' and 1 or 0,  #Eshop     
Pour ton problème de semelles ( je fais dans la coordonnerie maintenant :) ), tu peux décrire un peu plus ?
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Calc] Automatisation de fichier(2)

Message par Jurassic Pork »

hello,
concernant le dernier fichier de données de julie49, on ne retrouve pas en sortie de trace de la ligne ESTRELLA du modèle ELY. Est-ce normal ?
Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Jurassic Pork a écrit :concernant le dernier fichier de données de julie49, on ne retrouve pas en sortie de trace de la ligne ESTRELLA du modèle ELY. Est-ce normal ?
Exact mais c'est moi qui me suis trompée de colonne :marto:

Hubert Lambert a écrit :Tu peux essayer quelque chose comme ceci :

Code : Tout sélectionner

l[13][0].lower() == 'oui' and 1 or 0,  #Magasin
l[14][0].lower() == 'oui' and 1 or 0,  #Eshop       
Top merci !
Petite variante, peut-on mettre 0 si le champ n'est pas rempli ? donc 1 s'il y a "Oui" et 0 s'il n'y a rien ?

Hubert Lambert a écrit :Pour ton problème de semelles ( je fais dans la cordonnerie maintenant :) ), tu peux décrire un peu plus ?
Je dois importer mon tableur compressé dans WordPress via un plugin d'import (WP All Import). Tous mes champs ont créé via un autre plugin (ACF).
Sauf que mon champ "type de semelle" est un champ select et je ne voit pas comment associé mes données à ce champ...
J'ai demandé au support du plugin d'import pour voir s'il y a une solution.
Je te dirais s'il faut changer la création de la colonne.
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Julie49 a écrit :
Hubert Lambert a écrit :Pour ton problème de semelles ( je fais dans la cordonnerie maintenant :) ), tu peux décrire un peu plus ?
Je dois importer mon tableur compressé dans WordPress via un plugin d'import (WP All Import). Tous mes champs ont créé via un autre plugin (ACF).
Sauf que mon champ "type de semelle" est un champ select et je ne voit pas comment associé mes données à ce champ...
J'ai demandé au support du plugin d'import pour voir s'il y a une solution.
Je te dirais s'il faut changer la création de la colonne.
J'ai eu une réponse du plugin, il faut mettre "semelle_flexible,voute_plantaire,premiere_moussee,premiere_amovible,zip_interieur,zip_exterieur" dans la colonne "type de semelle" à la place de "Semelle flexible|Voûte plantaire|Première moussée|Première amovible|Zip intérieur|Zip extérieur"

Est-ce faisable de remplacer les accents et les espaces en phyton ?
Et remplacer les | par des ,


Julie49 a écrit :
Hubert Lambert a écrit :Tu peux essayer quelque chose comme ceci :

Code : Tout sélectionner

l[13][0].lower() == 'oui' and 1 or 0,  #Magasin
l[14][0].lower() == 'oui' and 1 or 0,  #Eshop                
Top merci !
Petite variante, peut-on mettre 0 si le champ n'est pas rempli ? donc 1 s'il y a "Oui" et 0 s'il n'y a rien ?

EDIT : Je viens de recevoir le fichier du client et en fait, les champ magasins et Eshop doivent être traité comme des variantes... Avec plusieurs possibilité et des | en séparateur... Dsl :?

Exemple en PJ . Mis à jour lors de l'édit

Merci pour ton aide
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Avez-vous pu regarder si cela est faisable ?
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Calc] Automatisation de fichier(2)

Message par Julie49 »

Bonjour

Bon heureusement que vous n'avez pas eu le temps de regarder le fichier, j'ai encore eu des retours des clients... Maintenant on est ok.

Je vous ai mis le fichier en PJ, les colonnes en violet sont les variantes.

J'ai tester le code suivant (que j'ai essayé de modifier) mais j'ai l'erreur en PJ :

Code : Tout sélectionner

m,   #Modèle
'Collection',   #Famille
l[1][0] == "GARCON" and "Garçon" or l[0][0].title(),   #Genre
l[2][0] == "BEBE" and "Bébé" or l[1][0].title(),   #Genre 2
l[3][0], #Ligne
l[4][0], #Forme
l[5][0], #Fermeture
'{}/{}'.format(*itemgetter(0,-1)(''.join(l[POINTURES]).split('/'))),   #Pointures
'{}_{}___0015.jpg'.format(l[8][0], int(l[9][0])),   #Image
'|'.join(l[7][:maxitem]),   #Matières
'|'.join(l[8][:maxitem]),   #Articles
'|'.join(str(int(x)) for x in l[9][:maxitem]),   #N° coloris

'|'.join(l[10][:maxitem]),   #Coloris

#'{}-{}.png'.format( int(l[9][0]),  l[10][:maxitem] ),   #vignette coloris // colonne 11  N° coloris-Coloris.png

'|'.join('{}_{}___0015.jpg'.format(x,int(y)) for x, y in list(zip(l[8],l[9]))[:maxitem]),   #Images
l[12][0].replace('\n',','),  #Semelles

'|'.join(  l[13][0].lower() == 'oui' and 1 or 0 ),   #Magasin
'|'.join(  l[14][0].lower() == 'oui' and 1 or 0 ),   #Eshop
J'ai modifier les colonnes Magasins et Eshop qui deviennent des variantes (normalement je ne me suis pas trompée..).
Attention, j'ai supprimé la colonne "Authentique". Normalement j'ai remis les bons chiffres dans les "l[1][0]" mais il faut p-e vérifier...


La colonne "Vignette coloris" (une nouvelle), je ne voit pas comment concaténer les colonnes "N° coloris" et "Coloris", tout en enlevant les caractères spéciaux, accents et espace. Il faudrait que cela donne par ex : 83-noir-vernis.png
Quelque chose comme cela ?

Code : Tout sélectionner

#'{}-{}.png'.format( int(l[9][0]), ?? ),   #vignette coloris // colonne 11  N° coloris-Coloris.png
Est-ce faisable de remplacer les accents et les espaces en phyton ?


Pour la colonne "Type de semelle", on reçoit les infos comme ceci : "Semelle flexible,Voûte plantaire,Première moussée,Première amovible,Zip intérieur,Zip extérieur"
Et il faudrait mettre "semelle_flexible,voute_plantaire,premiere_moussee,premiere_amovible,zip_interieur,zip_exterieur"

Idem qu'au-dessus ?


Dernière question, vu que l'on rajoute des colonnes dans la 2eme feuille pour faire la conversion, comment il retrouve sa colonne.
Exemple Ligne qui est en 3ème position avant la conversion, se retrouve en 4ème position ? :tesfou:
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Python] Automatisation de fichier Calc

Message par Julie49 »

Bonjour

Avez-vous pu regarder si mes demandes sont faisables ?

Merci d'avance pour votre aide.
Bonne journée

La modération vous a écrit: :alerte: Merci de ne pas poster plusieurs messages à la suite !
Si vous devez ajouter un complément d'information, le bouton "Editer" à la droite du message permet d'y remédier.

En attendant une prochaine réponse, vous pouvez participer également en répondant à d'autres questions sur notre forum.

AOO 4.1.1 - Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python] Automatisation de fichier Calc

Message par Hubert Lambert »

Essaie ceci :

Code : Tout sélectionner

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import sys
import traceback  
import unicodedata
from operator import itemgetter
from itertools import groupby


def convertir(event=None):
    try:
        MODELE = 3
        POINTURES = 6
        doc = XSCRIPTCONTEXT.getDocument()
        c = doc.Sheets.getByIndex(0).createCursor()
        c.gotoStartOfUsedArea(False)
        c.gotoEndOfUsedArea(True)
        data = list(c.DataArray)
        data = sorted(data[1:],key= itemgetter(MODELE, POINTURES))
        lignes = []
        for m, l in groupby(data, itemgetter(MODELE)):
            l = list(zip(*l))
            maxitem = len(l[0])//len(set(l[POINTURES]))
            lignes.append((m,   #Modèle
                        'Collection',   #Famille
                        l[0][0] == "GARCON" and "Garçon" or l[0][0].title(),   #Genre
                        l[1][0] == "BEBE" and "Bébé" or l[1][0].title(),   #Genre 2
                        l[3][0], l[4][0], l[5][0],   #Ligne, Forme, Fermeture
                        '{}/{}'.format(*itemgetter(0,-1)(''.join(l[POINTURES]).split('/'))),   #Pointures
                        '{}_{}_16.jpg'.format(l[8][0], int(l[9][0])),   #Image
                        '|'.join(l[7][:maxitem]),   #Matières
                        '|'.join(l[8][:maxitem]),   #Articles
                        '|'.join(str(int(x)) for x in l[9][:maxitem]),   #N° coloris
                        '|'.join(l[10][:maxitem]),   #Coloris
                        '|'.join(l[11][:maxitem]),   #Vignettes coloris
                        '|'.join('{}_{}_16.jpg'.format(x,int(y)) for x, y in list(zip(l[8],l[9]))[:maxitem]),   #Images
                        suppraccent(l[12][0]).replace('\n',','),  #Semelles
                        '|'.join((x.lower() == 'oui' and '1' or '0') for x in l[13][:maxitem]),  #Magasin
                        '|'.join((x.lower() == 'oui' and '1' or '0') for x in l[14][:maxitem]),  #Eshop
                        ))
        f = doc.Sheets.getByIndex(1)
        f.getCellRangeByPosition(0,1,14,500).clearContents(31)
        dest = f.getCellRangeByPosition(0,1,len(lignes[0])-1,len(lignes))
        dest.setDataArray(tuple(lignes))
    except AttributeError as e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        errmsg = traceback.format_tb(exc_traceback)[0] 
        col = errmsg.split(b' #')[-1].strip(b'\n')
        errorbox("Une erreur s'est produite.\n\n"
               "Vérifiez les données dans la colonne <#{}>.".format(col))
    except:
        errorbox('{}'.format(traceback.format_exc().decode('utf8')))

def suppraccent(s):
    return  unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').replace(' ','_').lower()


#------------ERRORBOX----------------
def errorbox(message):
    doc = XSCRIPTCONTEXT.getDocument()
    win = doc.CurrentController.Frame.ContainerWindow
    tk = win.Toolkit
    box = tk.createMessageBox(win, 3, 1, "Erreur", message)
    return box.execute()


g_exportedScripts = convertir, 
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Python] Automatisation de fichier Calc

Message par Julie49 »

Je vous remercie.

Quelques petites choses et après j'arrête de vous embêter...

La 1ère colonne "modèle" se remplie avec la colonne "ligne" au lieu du "modèle".
La colonne "genre" est rempli avec le "modèle" à la place du "genre".
"genre2" est rempli avec le "genre" au lieu de la colonne "Activité".

Je ne comprend pas le numéro des colonnes... :?

C'est ma faute, j'avais mal rempli le fichier, mais normalement il faudrait supprimer la colonne "Vignette coloris" de la feuille1 et ne l'avoir QUE dans la feuille2.. Je viens de le faire dans le doc en PJ. :?

Et cette colonne comporterais la concaténation du N° coloris et du coloris.
Est-ce faisable ?
Julie49 a écrit :La colonne "Vignette coloris" (une nouvelle), je ne voit pas comment concaténer les colonnes "N° coloris" et "Coloris", tout en enlevant les caractères spéciaux, accents et espace. Il faudrait que cela donne par ex : 83-noir-vernis.png

Petite question pour ma culture ^^
Julie49 a écrit :Dernière question, vu que l'on rajoute des colonnes dans la 2eme feuille pour faire la conversion, comment il retrouve sa colonne.
Exemple Ligne qui est en 3ème position avant la conversion, se retrouve en 4ème position ? :tesfou:
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.1 - Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python] Automatisation de fichier Calc

Message par Hubert Lambert »

Voici, dans les moindres détails... enfin j'espère :wink: .

Code : Tout sélectionner

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import sys
import traceback  
import unicodedata
from operator import itemgetter
from itertools import groupby


def convertir(event=None):
    try:
        MODELE = 3
        POINTURES = 6
        doc = XSCRIPTCONTEXT.getDocument()
        c = doc.Sheets.getByIndex(0).createCursor()
        c.gotoStartOfUsedArea(False)
        c.gotoEndOfUsedArea(True)
        data = list(c.DataArray)
        data = sorted(data[1:],key= itemgetter(MODELE, POINTURES))
        lignes = []
        for m, l in groupby(data, itemgetter(MODELE)):
            l = list(zip(*l))
            maxitem = len(l[0])//len(set(l[POINTURES]))
            lignes.append((m,   #Modèle
                        'Collection',   #Famille
                        l[1][0] == "GARCON" and "Garçon" or l[1][0].title(),   #Genre
                        l[2][0] == "BEBE" and "Bébé" or l[2][0].title(),   #Genre 2
                        l[3][0], l[4][0], l[5][0],   #Ligne, Forme, Fermeture
                        '{}/{}'.format(*itemgetter(0,-1)(''.join(l[POINTURES]).split('/'))),   #Pointures
                        '{}_{}_16.jpg'.format(l[8][0], int(l[9][0])),   #Image
                        '|'.join(l[7][:maxitem]),   #Matières
                        '|'.join(l[8][:maxitem]),   #Articles
                        '|'.join(str(int(x)) for x in l[9][:maxitem]),   #N° coloris
                        '|'.join(l[10][:maxitem]),   #Coloris
                        '|'.join(suppraccent('{}-{}.png'.format(int(x), y), '-') for x, y in list(zip(l[9], l[10]))[:maxitem]),   #Vignettes coloris
                        '|'.join('{}_{}_16.jpg'.format(x,int(y)) for x, y in list(zip(l[8], l[9]))[:maxitem]),   #Images
                        suppraccent(l[11][0], '_').replace('\n',','),  #Semelles
                        '|'.join((x.lower() == 'oui' and '1' or '0') for x in l[12][:maxitem]),  #Magasin
                        '|'.join((x.lower() == 'oui' and '1' or '0') for x in l[13][:maxitem]),  #Eshop
                        ))
        f = doc.Sheets.getByIndex(1)
        f.getCellRangeByPosition(0,1,14,500).clearContents(31)
        dest = f.getCellRangeByPosition(0,1,len(lignes[0])-1,len(lignes))
        dest.setDataArray(tuple(lignes))
    except AttributeError as e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        errmsg = traceback.format_tb(exc_traceback)[0] 
        col = errmsg.split(b' #')[-1].strip(b'\n')
        errorbox("Une erreur s'est produite.\n\n"
               "Vérifiez les données dans la colonne <#{}>.".format(col))
    except:
        errorbox('{}'.format(traceback.format_exc().decode('utf8')))

def suppraccent(s, espace):
    return  unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').replace(' ', espace).lower()


#------------ERRORBOX----------------
def errorbox(message):
    doc = XSCRIPTCONTEXT.getDocument()
    win = doc.CurrentController.Frame.ContainerWindow
    tk = win.Toolkit
    box = tk.createMessageBox(win, 3, 1, "Erreur", message)
    return box.execute()


g_exportedScripts = convertir,
Et pour info :
- le chiffre entre crochets après la variable "l" (l[x]) correspond à l'index de la colonne de la feuille source ;
- chaque ligne de transformation qui suit "lignes.append" correspond, dans l'ordre, à une colonne de la feuille destination (titre en commentaire).
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Julie49
Membre lOOyal
Membre lOOyal
Messages : 26
Inscription : 04 oct. 2016 07:10

Re: [Python] Automatisation de fichier Calc

Message par Julie49 »

Top merci !

Il y a juste la colonne "Modèle" qui était mal remplie mais du coup j'ai compris comment changer le numéro de la colonne donc c'est tout bon !

Je te remercie pour ta patience et ton aide précieuse ! :super:
AOO 4.1.1 - Windows 10