如何将QTableView中(含过滤后)的数据转换为Pandas Dataframe?
解决QTableView过滤后数据转Pandas Dataframe导出空白问题
你的代码导出空白文件核心是数据收集逻辑错误,加上几个细节处理不到位,修正方案如下:
原代码的问题
p_data.append(rowRes)写在了内层列循环里,导致每遍历一列就把未完成的行数据加入一次,最终p_data的结构完全混乱,生成的Dataframe根本不是正常的表格数据。- 只判断
item != '',但model.data()返回的空值可能是None,会漏掉这类情况,导致部分数据缺失。 - 没有提取表头列名,导出的Excel不仅没有列名,Dataframe的结构也和原始数据不匹配。
修正后的代码
from PyQt5.QtCore import Qt import pandas as pd # 获取当前QTableView的代理模型(过滤后的模型) proxy_model = self.PortTable.model() # 从原始模型获取表头列名(保证和最初的Dataframe列名一致) source_model = proxy_model.sourceModel() columns = [source_model.headerData(col, Qt.Horizontal) for col in range(source_model.columnCount())] p_data = [] # 遍历过滤后的每一行 for row in range(proxy_model.rowCount()): row_res = [] # 遍历当前行的每一列 for col in range(proxy_model.columnCount()): index = proxy_model.index(row, col) item = proxy_model.data(index) # 统一处理空值,避免Dataframe中出现None row_res.append(item if item is not None else "") # 整行数据收集完成后再加入到数据集 p_data.append(row_res) # 生成带列名的Dataframe p_df = pd.DataFrame(p_data, columns=columns) # 导出到Excel(不包含行索引) with pd.ExcelWriter("filtered_data.xlsx") as writer: p_df.to_excel(writer, index=False)
关键说明
- 直接操作代理模型(
proxy_model)就能获取过滤后的行和列,不需要手动去匹配原始数据的行索引。 - 通过
sourceModel()获取原始模型的表头,保证导出的Excel列名和最初加载的Dataframe一致。 - 把行数据的添加移到列循环外,确保每一行的所有列数据都收集完成后才存入数据集。
- 处理
None类型的空值,避免Dataframe出现无效值导致导出异常。
内容的提问来源于stack exchange,提问作者LucklyUnlucky
相关产品推荐
相关产品推荐

