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

PyQt Python Discussion :

Exporter QTableView vers Fichier Excel ou CSV. [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut Exporter QTableView vers Fichier Excel ou CSV.
    Bonjour,

    Je voudrais votre aide pour exporter un QTableView vers un fichier Excel ou CSV.
    Merci.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai déjà donné une méthode pour lire un QTableView ici:
    https://www.developpez.net/forums/d1...-d-qtableview/

    Une fois obtenue le liste de listes des données, la création du fichier csv pour importer dans Excel est facile. Avec le module csv, je suggère de passer par le container "Dialect" qui permet de configurer la création du csv pour Excel.
    Il y a tout de même quelques particularités dans ce transfert dans Excel:
    - les nombres entiers sont importés comme nombres, même s'il s'agit d'un code postal (en international, les codes postaux peuvent comporter des lettres, ce qui donne une mauvaise présentation: certains calés à droite, d'autre à gauche).
    - les nombres flottants ne sont importés comme nombres que s'ils ont une virgule décimale (pour un Excel français).
    - attention à l'encodage des chaines de caractères pour Excel en cas de caractères accentués (utf-8 ou cp1252 ?).
    Il faut simplement en tenir compte dans la conversion.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci Tyrtamos pour votre réponse,

    J'ai trouvé une autre solution plus facile, à mon avis, pour convertir mon QTableView en CSV par la méthode suivante :

    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
     
            ...
            table_clients = []
            for lig in range(0, self.listeclients.rowCount()): # où self.listeclients est QSqlRelationalTableModel
                table_clients.append([])  # ajout d'une nouvelle ligne
                for col in range(0, self.listeclients.columnCount()):
                    index = self.listeclients.index(lig, col)
                    valeur = self.listeclients.data(index)
                    table_clients[-1].append(valeur)  # ajout d'une nouvelle valeur à la ligne en cours
     
            fields = ["ID","INTITULE","TEL"]
            filename = "Liste_Clients.txt"
            with open(filename, 'w', encoding='utf-8-sig', errors='ignore') as csvfile:
                csvwriter = csv.writer(csvfile, delimiter=';')
                csvwriter.writerow(fields)
                csvwriter.writerows(table_clients)
    Qu'est ce que vous en dit ?
    Merci

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par noureddine1967 Voir le message
    Qu'est ce que vous en dit ?
    En principe, on arrive pour écrire un fichier csv avec une "liste de listes", chaque sous-liste représentant les différents éléments d'une même ligne.

    Voilà comment j'écrirais la partie écriture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import csv
     
    fields = [["ID","INTITULE","TEL", "12345", 12.456, "12,345"], 
              ["ID2","Intitulé2","TEL2", "67890", 99.654, "78,321"]]
    filename = "Liste_Clients.csv"
    with open(filename, 'w', newline='', encoding='utf-8-sig', errors='ignore') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=';', dialect=csv.excel)
        for field in fields:
            # c'est là qu'on peut modifier certains éléments de la ligne
            csvwriter.writerow(field)
    Je confirme mes remarques pour l'importation des fichiers csv dans Excel français:
    - les entiers comme "12345", même écrits avec des guillemets, sont compris comme des nombres entiers et donc calés à droite dans Excel.
    - les flottants comme 12.456 sont compris comme des chaines de caractères et donc calés à gauche dans Excel.
    - les flottants comme "12,345", forcément écrits avec des guillemets sous Python, sont compris comme des flottants et donc calés à droite dans Excel.
    - le mot "Intitulé2" comportant un accent et écrit avec l'encodage "utf-8" est correctement restitué dans Excel.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Bonjour Tyrtamos,

    J'ai pu exporter mon QTableView en fichier CSV, seulement, il y a un bémol je suis obligé de parcourir tout le tableau de haut en bas (Vertical Scroll Bar)
    pour avoir l'ensemble des lignes exportées dans le fichier de sortie.
    Même en utilisant en vain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while self.model.canFetchMore():
         self.model.fetchMore()
    Y a t'il une solution ???

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Y a-t-il une clé étrangère en lien avec la table que tu veux lire?

    Si oui, il faut aussi demander à ce que cette 2ème table soit chargée complètement avec fetchMore, en utilisant, bien sûr le modèle de cette 2ème table.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Bonjour Tyrtamos,

    Il n'y a pas de clé étrangère j'essaye d'afficher une view d'une table selon une requête sql.

  8. #8
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Bonjour Tyrtamos,

    Je vais vous poser mon problème en détail, car je suis persuadé que j'ai loupé quelque chose.
    La partie de mon projet que je suis sur, consiste à afficher dans des QTableView des listes en fonction d'une période sélectionnée dans un QCombobox

    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
     
    # ComboBox periode
     
            self.listeperiode = QSqlTableModel(self)
            self.listeperiode.setTable('tmp_periode')
            self.listeperiode.select()
            self.ui.cbperiode.setModel(self.listeperiode)
            self.ui.cbperiode.setModelColumn(self.listeperiode.fieldIndex('periode'))
            self._periodeModel = self.listeperiode
     
        def affichage(self):
     
            self.model_clients = QSqlRelationalTableModel(self)
            self.model_clients.setTable("tmp_clients")
            self.model_clients.setEditStrategy(QSqlRelationalTableModel.OnManualSubmit)
            self.model_clients.select()
     
            self.model_clients.setHeaderData(0, Qt.Horizontal, "ID")
            self.model_clients.setHeaderData(1, Qt.Horizontal, "INTITULE")
     
            self.ui.tableclients.setModel(self.model_clients)
            self.ui.tableclients.setSortingEnabled(True)
            self.ui.tableclients.sortByColumn(1, Qt.AscendingOrder)
     
            self.ui.tableclients.setSortingEnabled(False)
            self.ui.tableclients.resizeColumnsToContents()
            self.ui.tableclients.resizeRowsToContents()
     
            proxymodel_client = PeriodeFilter()
            proxymodel_client.setSourceModel(self.model_clients)
            self.model_clients = proxymodel_client
     
            self.ui.tableclients.setModel(self.model_clients)
            self._exportModel = self.model_clients
            self.ui.cbperiode.activated.connect(self.activated)
     
       def activated(self, index):
            record = self._periodeModel.record(index)
            periode = record.value(0)
     
            self.modelclients = self._clientModel
            self.modelclients.periode = periode
            self.modelclients.invalidate()
     
    class PeriodeFilter(QSortFilterProxyModel):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.periode = 0
     
        def filterAcceptsRow(self, source_row, modelIndex):
            sourceModel = self.sourceModel()
            sourceModelIndex = sourceModel.index(source_row, 3)
            return sourceModel.data(sourceModelIndex) == self.periode
    Comme vous voyez, je me suis inspiré d'un exemple que j'ai trouvé sur le Net.
    L'affichage et exacte, mais j'ai pas ajouter le nombre de clients et lors d'exportation vers un fichier CSV, le résultat est au nombre d'enregistrements déroulés.

    Merci.

  9. #9
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Enfin j'ai trouvé la solution, il m'a suffit d'intégré le code à la bonne place :

    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
    # ComboBox periode
     
            self.listeperiode = QSqlTableModel(self)
            self.listeperiode.setTable('tmp_periode')
            self.listeperiode.select()
            self.ui.cbperiode.setModel(self.listeperiode)
            self.ui.cbperiode.setModelColumn(self.listeperiode.fieldIndex('periode'))
            self._periodeModel = self.listeperiode
     
        def affichage(self):
     
            self.model_clients = QSqlRelationalTableModel(self)
            self.model_clients.setTable("tmp_clients")
            self.model_clients.setEditStrategy(QSqlRelationalTableModel.OnManualSubmit)
            self.model_clients.select()
     
            self.model_clients.setHeaderData(0, Qt.Horizontal, "ID")
            self.model_clients.setHeaderData(1, Qt.Horizontal, "INTITULE")
     
            self.ui.tableclients.setModel(self.model_clients)
            self.ui.tableclients.setSortingEnabled(True)
            self.ui.tableclients.sortByColumn(1, Qt.AscendingOrder)
     
            self.ui.tableclients.setSortingEnabled(False)
            self.ui.tableclients.resizeColumnsToContents()
            self.ui.tableclients.resizeRowsToContents()
    
            while self.model_clients.canFetchMore():
                self.model_clients.fetchMore()
     
            proxymodel_client = PeriodeFilter()
            proxymodel_client.setSourceModel(self.model_clients)
            self.model_clients = proxymodel_client
     
            self.ui.tableclients.setModel(self.model_clients)
            self._exportModel = self.model_clients
            self.ui.cbperiode.activated.connect(self.activated)
     
       def activated(self, index):
            record = self._periodeModel.record(index)
            periode = record.value(0)
     
            self.modelclients = self._clientModel
            self.modelclients.periode = periode
            self.modelclients.invalidate()
    
            nombre_clients =  self.model_clients.rowCount()
            self.ui.nombre.setText(str(nombre))
     
    class PeriodeFilter(QSortFilterProxyModel):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.periode = 0
     
        def filterAcceptsRow(self, source_row, modelIndex):
            sourceModel = self.sourceModel()
            sourceModelIndex = sourceModel.index(source_row, 3)
            return sourceModel.data(sourceModelIndex) == self.periode
    Merci encore même en lisant uniquement mon problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Export lien vers fichier Excel
    Par Gilles93 dans le forum VBA Access
    Réponses: 4
    Dernier message: 10/10/2013, 10h42
  2. [AC-2007] Export requête vers fichier excel
    Par bibou2146 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 01/08/2013, 15h33
  3. Exporter Access vers fichier Excel existant sous java
    Par clamar45 dans le forum Documents
    Réponses: 0
    Dernier message: 30/07/2009, 11h09
  4. export données vers fichier excel
    Par pascale86 dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2009, 11h55
  5. Export SQL vers fichier EXcel
    Par The Bro dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/10/2008, 19h09

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