qtabwidget qtablewidget显示excel工作表内容(极简excel viewer)

python 复制代码
import sys 
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget, QVBoxLayout, QLabel,QFileDialog
import getpath
import os
from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem
import openpyxl
# Creating the main window 
class MainW(QMainWindow): 
    def __init__(self): 
        super().__init__() 
        self.title = 'PyQt5 - QTabWidget'
        self.left = 0
        self.top = 0
        # self.width = 300
        # self.height = 200
        self.setWindowTitle(self.title) 
        # self.setGeometry(self.left, self.top, self.width, self.height) 

        self.tab_widget = MyTabWidget(self) 
        self.setCentralWidget(self.tab_widget) 
        self.showMaximized() 

# Creating tab widgets 

class MyTabWidget(QWidget): 
    def getBook(self,fname):
        print(fname)
        from openpyxl import load_workbook
        xl_book = load_workbook(filename=fname)
        datas=[]
        titles=[]
        for i in range(len(xl_book.worksheets)):
            table = xl_book.worksheets[i]
            data = []
            titles.append(table.title)
            for row in table.values:
                r = []
                for one in row:
                    if one!=None:
                        r.append(one)
                    else:
                        r.append("")
                data.append(r)
            datas.append(data)
        return (titles,datas)
    def Table(self,data):
        print(data)
        table = QTableWidget()
        table.setRowCount(len(data)) # 设置行数
        if len(data)>0:
            table.setColumnCount(len(data[0]))  # 设置列数
            headers=[openpyxl.utils.get_column_letter(i+1) for i in range(len(data[0]))]
            table.setHorizontalHeaderLabels(headers)
            # 遍历Excel数据并插入到表格控件中
            row = 0
            for row_data in data:
                col = 0
                for cell in row_data:
                    item = QTableWidgetItem(str(cell))
                    table.setItem(row, col, item)
                    col += 1
                row += 1
        return table
    def __init__(self, parent): 
        super(QWidget, self).__init__(parent) 
        self.layout = QVBoxLayout(self) 
        b=QPushButton('open')
        b.clicked.connect(self.open_xlsx)
        self.layout.addWidget(b) 
        # (self.titles,self.datas)=self.getBook(os.path.join(getpath.getpath(),"..","data","spec","low steel.xlsx"))
        self.tab_widget = QTabWidget() 
        # for i in range(len(self.datas)):
        #     one=self.Table(self.datas[i])
        #     self.tab_widget.addTab(one,self.titles[i])#"sheet"+str(i+1))
        self.tab_widget.setTabPosition(QTabWidget.South)
        self.layout.addWidget(self.tab_widget) 
        print(sys.argv)
        if len(sys.argv)>1:
            self.open_file(sys.argv[1])
    def open_file(self,fname):
        print(fname)
        (self.titles,self.datas)=self.getBook(fname)
        self.tab_widget.clear()
        for i in range(len(self.datas)):
            one=self.Table(self.datas[i])
            self.tab_widget.addTab(one,self.titles[i])#"sheet"+str(i+1))
        print(dir(self.tab_widget))
    def open_xlsx(self):
        FileDialog = QFileDialog(self)
        folder=os.path.join(os.path.expanduser('~'), "Desktop")
        fil = "xlsx Files (*.xlsx);;All Files (*)"    
        FileDirectory = FileDialog.getOpenFileName(
            None, 'select import file', folder, fil)  # 选择目录,返回选中的路径
        # logging.info(FileDirectory)
        fname = FileDirectory[0]
        if fname == "":
            pass
        else:
            self.open_file(fname)
if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    ex = App() 
    sys.exit(app.exec_()) 
相关推荐
8Qi836 分钟前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
秋943 分钟前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
无风听海1 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
CTA终结者2 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
huangdong_2 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
马士兵教育2 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
youngerwang2 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
chase_my_dream2 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
KaMeidebaby2 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法