eagleye

Python使用PyCharm+PySide6+Pandas创建QTableView显示Excel工作簿数据

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()

posted on 2024-08-11 18:51  GoGrid  阅读(559)  评论(0)    收藏  举报

导航