[Calc] Automatisation de fichier(2)

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 !

[Calc] Automatisation de fichier(2)

Messagepar Julie49 » 31 Août 2017 15: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é 10 fois
Dernière édition par Julie49 le 31 Août 2017 16:23, édité 4 fois.
AOO 4.1.1 - Windows 10
Julie49
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Oct 2016 09:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Oukcha » 31 Août 2017 16: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) : 2622
Inscrit le : 06 Oct 2008 10:03

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 31 Août 2017 21: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) : 566
Inscrit le : 06 Avr 2016 09:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 12 Sep 2017 11: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é 7 fois
AOO 4.1.1 - Windows 10
Julie49
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Oct 2016 09:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 12 Sep 2017 19: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) : 566
Inscrit le : 06 Avr 2016 09:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Jurassic Pork » 12 Sep 2017 23: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) : 51
Inscrit le : 10 Août 2017 00:15

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 13 Sep 2017 08: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) : 566
Inscrit le : 06 Avr 2016 09:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 13 Sep 2017 09: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
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Oct 2016 09:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 13 Sep 2017 15: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é 6 fois
AOO 4.1.1 - Windows 10
Julie49
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Oct 2016 09:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 13 Sep 2017 17: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) : 566
Inscrit le : 06 Avr 2016 09:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 13 Sep 2017 17: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
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Oct 2016 09:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Hubert Lambert » 13 Sep 2017 18: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) : 566
Inscrit le : 06 Avr 2016 09:26

Re: [Calc] Automatisation de fichier(2)

Messagepar Jurassic Pork » 13 Sep 2017 22: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) : 51
Inscrit le : 10 Août 2017 00:15

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 14 Sep 2017 09: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
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Oct 2016 09:10

Re: [Calc] Automatisation de fichier(2)

Messagepar Julie49 » 15 Sep 2017 09: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é 1 fois
AOO 4.1.1 - Windows 10
Julie49
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 04 Oct 2016 09:10


Retour vers Macros et API

Qui est en ligne ?

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