You need to enable JavaScript to run this app. 如何使用PyQt5遍历QSqlTableModel选中行并导出数据为.csv文件
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 00:45:04