- 显示文件内容
主要内容 #
完成效果 #
本节课程是简化版Excel的第三节,完成本节课程,能实现将打开的xlsx表格文件内容,用QTableView表格视图展示。
收获 #
学习完本节内容,我们会知道如何读取xlsx表格文件,将其中的内容以表格的形式显示在QTableView中,完成与Excel类似的功能。
1.显示文件内容 #
本例中打开的Example3.xlsx文件,里面是学生信息,仿照Excel,我们也以表格形式展示读取到的文件内容。
首先用pandas库read_excel函数读取二维表格数据Example3.xlsx得到data,注意data也是一个二维表格形式的数据,可以通过data.iloc[row, column]获取data的第row行column列的数据。
然后逐行逐列一次将data的数据传给QStandardItemModel,之后将QStandardItemModel应用于QTableView展示。
本例中对QTableView的样式也进行了设置,尽量美观。以下就是本例代码:
from PyQt5.QtWidgets import QMainWindow, QWidget, QAction, QFileDialog, QHeaderView, QApplication, QTableView, \ QMessageBox from PyQt5.QtGui import QStandardItemModel, QStandardItem, QIcon from PyQt5.QtCore import Qt import sys import pandas as pd class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.table = QTableView(self) # 创建一个QTableView表格视图对象 self.setCentralWidget(self.table) # 将该表格试图放在主窗口中间 self.statusBar().showMessage("Ready") # 添加状态栏 openAct = QAction(QIcon("D:\\Python_Tips\\Dashima\\pics\\open.png"), "打开", self) # 添加打开动作,并设置图标 saveAct = QAction(QIcon("D:\\Python_Tips\\Dashima\\pics\\save.png"), "保存", self) # 添加保存动作,并设置图标 openAct.triggered.connect(self.openfile) # 点击打开动作触发triggered信号,连接到槽函数openfile menubar = self.menuBar() # 添加菜单栏 fileMenu = menubar.addMenu("文件") # 添加文件菜单 fileMenu.addAction(openAct) # 将打开动作添加到文件菜单 fileMenu.addAction(saveAct) # 将保存动作添加到文件菜单 self.toolbar = self.addToolBar("工具栏") # 添加工具栏 self.toolbar.addAction(openAct) # 将打开动作添加到工具栏 self.toolbar.addAction(saveAct) # 将保存动作添加到工具栏 self.setGeometry(300, 300, 500, 400) self.setWindowTitle("简化版Excel") self.show() def openfile(self): # 槽函数, 用来打开文件 self.statusBar().showMessage("正在打开文件") # 更新状态栏信息 filepath = "D:\\Python_Tips\\Dashima\\pics" # 设置打开文件路径 filename, filetype = QFileDialog.getOpenFileName( self, "打开文件", filepath, "XLSX (*.xlsx *.XLSX)" ) # 弹出打开文件对话框,只选择Excel的xlsx文件 if filename: # 如果文件名不为空,即选择了一个文件 model = self.getModel(filename) # 获取模型 self.table.setModel(model) # 将模型应用到tableview上去 self.table.horizontalHeader().setVisible(False) # 隐藏模型的水平表头 self.table.verticalHeader().setVisible(False) # 隐藏模型的垂直表头 # 让表格的所有列自动拉伸,充满界面 self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.statusBar().showMessage("文件已成功打开") # 更新状态栏信息 def getModel(self, filename): # 用来制作模型 #注:需要安装pandas包,命令:pip install pandas #同时,需要安装openpyxl包,否则会读取错误,命令:pip install openpyxl data = pd.read_excel(filename, header=None) # 读取Excel文件,header=None表示不设置表头 datashape = data.shape # 获取二维数据的形状 model = QStandardItemModel(datashape[0], datashape[1]) # 根据数据的形状 创建标准数据模型 for row in range(datashape[0]): # 按行循环 for column in range(datashape[1]): # 按列循环 item = data.iloc[row, column] # 获取row行column列的数据 item = QStandardItem(str(item)) # 转换为QStandardItem对象 item.setTextAlignment(Qt.AlignCenter) # 设置数据居中显示 model.setItem(row, column, item) # 给模型的第row行,第column列添加数据 return model # 返回创建好的模型 app = QApplication(sys.argv) # 创建应用程序 ex = Example() # 创建窗口对象 sys.exit(app.exec_()) # 设置关闭窗口后结束进程
拓展练习:尝试更改应用窗口的大小,看表格是否仍会自动填充满窗口。
小结 #
习题 #
- 习题1:尝试用本程序打开并展示自定义的xlsx文件。