如何使用PyQt5遍历QSqlTableModel选中行并导出数据为.csv文件
你遇到的问题核心是两点:1. 之前的实现把所有选中单元格的数据放到同一个一维列表里,导致所有选中值都挤在同一行;2. 你使用了QSortFilterProxyModel做筛选排序,直接拿视图的行号去源模型取数据会出现匹配错误。
直接替换你的exportCadastro方法即可实现仅导出选中行,格式符合要求:
def exportCadastro(self): import csv # 判断是否有选中行 if not self.tableView.selectionModel().hasSelection(): print('No row selected!') return # 打开csv文件,指定编码避免中文乱码,newline=''避免Windows下出现空行 with open("cadastro.csv", 'w', newline='', encoding='utf-8-sig') as csvfile: csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) # 先写入表头 csvwriter.writerow(['id', 'instituicao', 'crianca', 'data_de_nascimento', 'manequim', 'calcado', 'responsavel']) # 获取所有选中行的首列索引(selectedRows(0)代表每行返回第一列的索引,避免重复) selected_rows = self.tableView.selectionModel().selectedRows(0) for proxy_idx in selected_rows: # 代理模型索引转源模型索引,适配筛选、排序后的行号映射 source_idx = self.proxy_model.mapToSource(proxy_idx) source_row = source_idx.row() # 构造当前行的所有字段数据 row_data = [ self.model.data(self.model.index(source_row, col), Qt.DisplayRole) for col in range(self.model.columnCount()) ] csvwriter.writerow(row_data)
修改说明
- 使用
selectedRows(0)获取选中行的首列索引,避免遍历所有选中单元格导致数据乱序 - 增加代理模型到源模型的索引转换,就算你做了筛选、排序操作,导出的选中行数据也不会错
- 逐行构造数据列表,导出的csv每一行对应视图里的一条选中记录
- 增加
utf-8-sig编码适配Windows下Excel打开不乱码,newline=''避免出现多余空行
内容的提问来源于stack exchange,提问作者user2128412
相关产品推荐
相关产品推荐

