[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 !

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

Messagepar Julie49 » 31 Août 2017 14:51

Bonjour

Il y a 2 ans, Hubert Lambert m'a fait un script
(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.
Pièces jointes
fichier-de-base-royer_mise-a-jour-17-09-01.ods
(18.54 Kio) Téléchargé 19 fois
Dernière édition par Julie49 le 20 Oct 2017 08:58, édité 6 fois.
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Oukcha » 31 Août 2017 15:10

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
                                        
:arrow: A lire avant tout ! Image
Avatar de l’utilisateur
Oukcha
RespOOnsable modération
RespOOnsable modération
 
Message(s) : 2665
Inscrit le : 06 Oct 2008 09:03

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 31 Août 2017 20:17

Bonjour,

Essaie avec cette version :
Code : Tout sélectionner   AgrandirRéduire
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.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
PassiOOnné
PassiOOnné
 
Message(s) : 618
Inscrit le : 06 Avr 2016 08:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 12 Sep 2017 10:57

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 ^^
Pièces jointes
fichier-de-base_mise-a-jour-17-09-12.ods
(20.09 Kio) Téléchargé 13 fois
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 12 Sep 2017 18:01

Nouvel essai donc :

Code : Tout sélectionner   AgrandirRéduire
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.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
PassiOOnné
PassiOOnné
 
Message(s) : 618
Inscrit le : 06 Avr 2016 08:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Jurassic Pork » 12 Sep 2017 22:34

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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
Blanc|Marine Foncé|Blanc|Marine Foncé|Rose |Blanc imprimé|Rose Corail

est-ce grave ?
Ami calmant, J.P
LibreOffice 5.x sous windows et linux
Avatar de l’utilisateur
Jurassic Pork
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 86
Inscrit le : 09 Août 2017 23:15

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 13 Sep 2017 07:25

Jurassic Pork a écrit:Hubert dans ton script, il me semble qu'il y a une erreur sur la ligne :
Code : Tout sélectionner   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
Blanc|Marine Foncé|Blanc|Marine Foncé|Rose |Blanc imprimé|Rose Corail

est-ce grave ?

Julie49 nous le dira...
AOOo 4.1.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
PassiOOnné
PassiOOnné
 
Message(s) : 618
Inscrit le : 06 Avr 2016 08:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 13 Sep 2017 08:13

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   AgrandirRéduire
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
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 13 Sep 2017 14:14

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   AgrandirRéduire
'|'.join(l[13][:maxitem]),   #Magasin
'|'.join(l[14][:maxitem]),   #Eshop


Après
Code : Tout sélectionner   AgrandirRéduire
'|'.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)
Pièces jointes
fichier-de-base_mise-a-jour-17-09-12.ods
(24.72 Kio) Téléchargé 11 fois
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 13 Sep 2017 16:16

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   AgrandirRéduire
# -*- 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.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
PassiOOnné
PassiOOnné
 
Message(s) : 618
Inscrit le : 06 Avr 2016 08:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 13 Sep 2017 16:44

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
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 13 Sep 2017 17:51

Tu peux essayer quelque chose comme ceci :

Code : Tout sélectionner   AgrandirRéduire
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.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
PassiOOnné
PassiOOnné
 
Message(s) : 618
Inscrit le : 06 Avr 2016 08:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Jurassic Pork » 13 Sep 2017 21:26

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 5.x sous windows et linux
Avatar de l’utilisateur
Jurassic Pork
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 86
Inscrit le : 09 Août 2017 23:15

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 14 Sep 2017 08:55

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   AgrandirRéduire
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
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 15 Sep 2017 08:24

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   AgrandirRéduire
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
Pièces jointes
fichier-de-base_mise-a-jour-17-09-12.ods
(21.49 Kio) Téléchargé 8 fois
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 25 Sep 2017 09:13

Avez-vous pu regarder si cela est faisable ?
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 02 Oct 2017 16:47

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   AgrandirRéduire
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   AgrandirRéduire
#'{}-{}.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:
Pièces jointes
erreur-17-10-02.jpg
fichier-de-base_mise-a-jour-17-10-02.ods
(25.14 Kio) Téléchargé 7 fois
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Python] Automatisation de fichier Calc

Messagepar Julie49 » 18 Oct 2017 13:31

Bonjour

Avez-vous pu regarder si mes demandes sont faisables ?

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


La modération 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
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Python] Automatisation de fichier Calc

Messagepar Hubert Lambert » 18 Oct 2017 15:07

Essaie ceci :
Code : Tout sélectionner   AgrandirRéduire
# -*- 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
Pièces jointes
Julie-49.ods
(19.4 Kio) Téléchargé 7 fois
AOOo 4.1.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
PassiOOnné
PassiOOnné
 
Message(s) : 618
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Automatisation de fichier Calc

Messagepar Julie49 » 18 Oct 2017 16:01

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:
Pièces jointes
fichier-de-base_mise-a-jour-17-10-18.ods
(24.66 Kio) Téléchargé 5 fois
AOO 4.1.1 - Windows 10
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10

Re: [Python] Automatisation de fichier Calc

Messagepar Hubert Lambert » 19 Oct 2017 20:55

Voici, dans les moindres détails... enfin j'espère :wink: .
Code : Tout sélectionner   AgrandirRéduire
# -*- 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).
Pièces jointes
fichier-de-base_mise-a-jour-17-10-18.ods
(20.06 Kio) Téléchargé 7 fois
AOOo 4.1.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
PassiOOnné
PassiOOnné
 
Message(s) : 618
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Automatisation de fichier Calc

Messagepar Julie49 » 20 Oct 2017 08:53

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
Julie49
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 04 Oct 2016 08:10


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)