import sys import warnings from pathlib import Path import pandas as pd from PySide6 import QtWidgets from PySide6.QtCore import Qt from PySide6.QtGui import QStandardItemModel # 读取Excel工作簿数据 def read_excel_with_pandas(path_excel, _cols): """ :param path_excel:Excel工作簿全路径 :param _cols:读取Excel工作簿的列数 功能:读取Excel工作簿指定列数,返回表头列表、行数据列表 """ assert path_excel.exists(), f'Excel工作簿“{path_excel}”务必存在!!!' str_dict = {i: str for i in range(_cols)} # 每列都转换为str df = pd.read_excel(path_excel, sheet_name=0, header=None, skiprows=1, converters=str_dict) # 使用pandas读取Excel pd.set_option('future.no_silent_downcasting', True) # 不提示函数在未来版本中将被替代的警告 df = df.replace(r'\s+', '', regex=True) # 删除所有字符串列的空格(姓名中的空格在此去除) df = df.iloc[:, 1:_cols] # 取15列:B:P,跳过序号列 df = df.dropna(subset=[1]) # 删除第1列(姓名)具有"NaN"的行 df = df.fillna('') # 将nan替换为'' head_list = df.values.tolist()[0] # 表头列表 info_lists = df.values.tolist()[1:] # 信息列表,数据帧转列表,每行对应一个列表(包括表头) return head_list, info_lists # 创建数据模型 def setup_model(_head, _rows): """ :param _head:Excel工作簿表头列表 :param _rows:Excel工作簿行数据列表 """ _row = len(_rows) # 行数 _col = len(_head) # 列数 # 创建模型并填充数据 model = QStandardItemModel(_row, _col) for col in range(model.columnCount()): # 设置表头 model.setHeaderData(col, Qt.Orientation.Horizontal, f"{_head[col]}") for row in range(model.rowCount()): # 设置模型数据 for col in range(model.columnCount()): model.setData(model.index(row, col), f"{_rows[row][col]}") return model # 定义主函数 def main(): app = QtWidgets.QApplication() model = setup_model(head, rows) # 创建并配置QTableView table_view = QtWidgets.QTableView() table_view.setModel(model) # 设置视图数据模型 table_view.setWindowTitle("QTableView Example") table_view.resize(1024, 768) table_view.show() # 显示窗口 sys.exit(app.exec()) if __name__ == '__main__': # 忽略UserWarning: Data Validation extension的警告(Excel读取时出现) warnings.simplefilter(action='ignore', category=UserWarning) excel_path = Path(__file__).parent / 'data/特种作业报名表(生成表)6.19.xlsx' head, rows = read_excel_with_pandas(excel_path, 16) main()标签:head,Python,Excel,excel,PySide6,df,model,col From: https://www.cnblogs.com/zdt168/p/18353735