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()
![]()