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

Bibliothèques tierces Python Discussion :

Pil, gestion du clipboard et Manipulation d'excel.


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut Pil, gestion du clipboard et Manipulation d'excel.
    Bonjour à tous

    Je suis en train de créer un programme qui génére des images via la bibliothèque pil. J'aimerais envoyer ces images sur un fichier excel (existant, qui a déjà du contenu). Et là, c'est le drame!

    J'ai essayé via win32com, mais je ne peux pas gérer la position des images(il les envoie toujours sur la premiere cellule de la premiere colonne).

    J'ai essayé via pyexcelerator, mais il ne gère que le bitmap en 24 bits et je n'arrive pas non plus à gérer le positionnement de mes images.

    J'ai essayé via xlwt qui lui gère les positions, donc je peux faire ce que je veux, sauf que comme xlwt est consacré uniquement à l'écriture, je ne peux pas ouvrir de fichier existant et les envoyer à la fin par exemple, il agit uniquement sur des nouveaux fichiers, ça ne me convient donc pas non plus. J'ai essayé de faire communiquer xlwt avec son jumeau consacré à la lecture, xlrd, mais je n'y arrive pas à agir sur une instance créée par xlrd avec xlwt, donc ça ne fonctionne pas.

    Un autre souci, c'est que lorsque mes images sont importées, elles se "figent" sur la feuille, on ne peut donc pas les déplacer, ni les sélectionner ni quoi que ce soit d'autre, ce qui est très génant.

    J'ai donc eu une autre idée: envoyer les images vers le presse-papier "général" de windows et de les récupérer sur mon fichier excel via un simple clic droit -> coller.

    Je suis certain que c'est possible, mais je n'y arrive pour l'instant pas :s

    Je me bats avec la librairie win32clipboard, mais je n'arrive pas à envoyer une image. Le moins mauvais message d'erreur que j'ai obtenu est: "expected readable buffer object", avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import win32clipboard as w
    import win32con
     
    w.OpenClipboard()
    w.EmptyClipard()
    w.SetClipboardData(win32con.CF_BITMAP, self.image)
    Sachant que self.image est une instance créée avec pil, que je peux enregistrer ou afficher dans un canevas ou autre. Je précise aussi que je travaille sous Tkinter, je ne peux donc pas me servir du module clipboard créé pour wxpython

    Si vous connaissez un autre module qui permet d'automatiser excel, ou si dans ceux que vous connaissez vous avez une astuce ou plus d'infos concernant les images, ou si vous avez des connaissances ou de la doc concernant l'envoi d'images dans le presse papier, surtout n'hésitez pas!

    Merci d'avoir lu jusqu'au bout et de votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Voici un module qui me sert à automatiser excel. j'y ai ajouté une méthode "insertImage".
    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
    139
    140
    # -*- coding: ISO-8859-1 -*-
     
    import win32com.client,win32com.client.dynamic
    from pywintypes import UnicodeType, TimeType
    import os
     
    class PyExcel:
        def __init__(self,filename=None):
            self.xlApp = win32com.client.dynamic.Dispatch('Excel.Application')
            if filename:
                    self.filename = filename
                    self.xlBook = self.xlApp.Workbooks.Open(filename)
            else:
                    self.xlBook = self.xlApp.Workbooks.Add()
                    self.filename=''
     
        def save(self, newfilename=None):
            if newfilename:
                    self.filename = newfilename
                    self.xlBook.SaveAs(newfilename)
            else:
                    self.xlBook.Save()
     
        def close(self):
            self.xlBook.Close(SaveChanges=0)
            del self.xlApp
     
        def show(self):
            self.xlApp.Visible=1
     
        def hide(self):
            self.xlApp.Visible=0
     
        def getCell(self, sheet, row, col):
            sht = self.xlBook.Worksheets(sheet)
            return sht.Cells(row, col).Value
     
        def setCell(self, sheet, row, col, value):
            sht = self.xlBook.Worksheets(sheet)
            sht.Cells(row, col).Value = value
     
        def getRange(self, sheet, row1, col1, row2, col2):
            sht = self.xlBook.Worksheets(sheet)
            return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Value
     
        def setRange(self, sheet, leftCol, topRow, data):
            bottomRow = topRow + len(data) - 1
            rightCol = leftCol + len(data[0]) - 1
            sht = self.xlBook.Worksheets(sheet)
            sht.Range(
                sht.Cells(topRow, leftCol), 
                sht.Cells(bottomRow, rightCol)
                ).Value = data
     
        def getContiguousRange(self, sheet, row, col):
            sht = self.xlBook.Worksheets(sheet)
            # trouve la ligne du bas
            bottom = row
            while sht.Cells(bottom + 1, col).Value not in [None, '']:
                bottom = bottom + 1
            #trouve la col de droite
            right = col
            while sht.Cells(row, right + 1).Value not in [None, '']:
                right = right + 1
            return sht.Range(sht.Cells(row, col), sht.Cells(bottom, right)).Value
     
        def getActiveCell(self):
            r=self.xlApp.ActiveCell
            return r
     
        def mergeCells(self,sheet,row1,col1,row2,col2):
            sht = self.xlBook.Worksheets(sheet)
            sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Merge()
     
        def addSheet(self,Before='',After=''):
            if Before :
                pos=self.xlBook.Worksheets(Before)
                self.xlBook.Worksheets.Add(Before=pos)
            elif After:
                pos=self.xlBook.Worksheets(After)
                self.xlBook.Worksheets.Add(After=pos)
            else:
                self.xlBook.Worksheets.Add()
     
        def getActiveSheet(self):
            sheet=self.xlBook.ActiveSheet.Name
            return sheet
     
        def setActiveSheet(self,sheet):
     
            sht = self.xlBook.Worksheets(sheet)
            sht.Activate()
     
        def delSheet(self,sheet):
            sht = self.xlBook.Worksheets(sheet)
            sht.Delete()
     
        def renameSheet(self,sheet,newName):
            sht = self.xlBook.Worksheets(sheet)
            sht.Name=newName
     
        def moveSheet(self,sheet,Before='',After=''):
            sht = self.xlBook.Worksheets(sheet)
            if Before :
                pos=self.xlBook.Worksheets(Before)
                sht.Move(Before=pos)
            else:
                pos=self.xlBook.Worksheets(After)
                sht.Move(After=pos)
     
        def getSheets(self):
            lstSheets=[sheet.Name for sheet in self.xlBook.Worksheets]
            return lstSheets
     
        def copySheet(self,sheet,Before='',After=''):
            sht = self.xlBook.Worksheets(sheet)
            if Before :
                pos=self.xlBook.Worksheets(Before)
                newSht=sht.Copy(Before=pos)
            else:
                pos=self.xlBook.Worksheets(After)
                newSht=sht.Copy(After=pos)
     
        def setBorder(self,sheet,row1,col1,row2,col2,weight):
            sht = self.xlBook.Worksheets(sheet)
            ran=sht.Range(sht.Cells(row1,col1),sht.Cells(row2,col2))
            print ran
            ran.Borders.Weight=weight
     
        def insertImage(self,sheet,file,left,top,width,height,linkToFile=False,save=False):
            if not linkToFile:
                save=True
            sht = self.xlBook.Worksheets(sheet)
            sht.Shapes.AddPicture(file,linkToFile,save,left,top,width,height)
     
    if __name__=='__main__':
        tableur=PyExcel()
        tableur.show()
        tableur.insertImage('Feuil1','test.jpg',100,100,500,130)
        tableur.save()

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Merci beaucoup de ta réponse c'est exactement ce que je cherchais!

    Il y a juste un petit détail étonnant: lors de l'importation excel me grossit systématiquement mes codes barres, ils se retrouvent à une taille de 133%, donc flous.

    Si je choisis de les importer avec une hauteur et une largeur plus petites d'un quart de la taille, je me retrouve pile à la bonne taille...Ce bug ne se reproduit pas avec n'importe quelle image jpg ou autre. Etonnant non?

Discussions similaires

  1. [VBA-EXCEL] Gestion des erreurs et manipulation du contenu d'une cellule
    Par Froggy007 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/09/2008, 20h42
  2. manipuler fichier excel 2003 avec l'api jxl ?
    Par hoor3in dans le forum Documents
    Réponses: 2
    Dernier message: 30/04/2008, 13h16
  3. manipulation fichiers excel
    Par abdelilah dans le forum C
    Réponses: 4
    Dernier message: 19/01/2008, 18h11
  4. gestion des droits sur un tableau excel 2007
    Par kev0631 dans le forum Excel
    Réponses: 1
    Dernier message: 20/04/2007, 08h54
  5. Manipulation fichier excel : quel langage ?
    Par HaTnuX dans le forum Windows
    Réponses: 7
    Dernier message: 14/04/2006, 19h34

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