Bonjour,
Je voudrais votre aide pour exporter un QTableView vers un fichier Excel ou CSV.
Merci.![]()
Bonjour,
Je voudrais votre aide pour exporter un QTableView vers un fichier Excel ou CSV.
Merci.![]()
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.
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 :
Qu'est ce que vous en dit ?
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)
Merci
Bonjour,
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:
Je confirme mes remarques pour l'importation des fichiers csv dans Excel français:
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)
- 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.
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
Y a t'il une solution ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while self.model.canFetchMore(): self.model.fetchMore()
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.
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.
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
Comme vous voyez, je me suis inspiré d'un exemple que j'ai trouvé sur le Net.
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
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.
Enfin j'ai trouvé la solution, il m'a suffit d'intégré le code à la bonne place :
Merci encore même en lisant uniquement mon problème.
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
Partager