You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6调用pandas read_excel读取Excel时程序卡顿崩溃问题求助

问题背景

开发基于Qt的GUI工具,目标是从Excel文件提取对数正态分布相关数据,生成绘图所需的结构化数据,核心实现代码如下:

import sys
from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QDialog, QApplication, QFileDialog, QTableWidget, QTableWidgetItem, QTabWidget
from PySide6.QtCore import Slot
from PyQt6.uic import loadUi
import pandas as pd


class MainWindow(QDialog):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.initUI()

    def initUI(self):
        loadUi('gui.ui', self)
        self.btnShow.setEnabled(False)
        self.btnBrowse.clicked.connect(self.browseFiles)
        self.btnLoad.clicked.connect(lambda: self.loadExcelData(self.filename.text()))

    @Slot()
    def browseFiles(self):
        fname = QFileDialog.getOpenFileName(self, 'Open Excel file', 'C:\\', "Excel (*.xls *.xlsx)")
        self.filename.setText(fname[0])

    @Slot()
    def loadExcelData(self, pathOfFile):
        column_names = ["IDofCell", "SerialNumber", "Action", "TimeOfFailure", "ReverseRankR", "Cdf", "Ppf", "LogTime"]
        df = pd.read_excel(pathOfFile, names=column_names)
        if df.size == 0:
            return
        self.tableExcelData.setRowCount(df.shape[0])
        self.tableExcelData.setColumnCount(df.shape[1])
        self.tableExcelData.setHorizontalHearsLabels(df.columns)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWidget = QtWidgets.QStackedWidget()
    mainWidget.addWidget(mainWindow)
    mainWidget.show()
    sys.exit(app.exec())

界面包含文件浏览、操作按钮区域,以及QTableWidget组成的Excel数据展示区域。

故障现象

点击「Load Data」按钮读取Excel文件时,程序先进入无响应卡顿状态,片刻后直接崩溃。初步定位崩溃触发点位于pd.read_excel代码行,测试所用Excel为常规结构化行列数据。

故障根因及修复方案

按优先级从高到低排查修复:

  1. Qt绑定混用导致的底层崩溃
    代码同时导入PyQt6和PySide6两套Qt绑定,二者的元对象系统、事件循环、内存管理逻辑完全不兼容,信号槽绑定跨绑定调用时会直接触发内存访问错误,这是最常见的崩溃诱因。

    • 修复:统一使用单套Qt绑定,保留PyQt6的前提下,将from PySide6.QtCore import Slot替换为from PyQt6.QtCore import Slot,删除所有PySide6相关导入。
  2. Excel读取依赖缺失
    pandas的read_excel方法本身不包含Excel解析能力,读取.xlsx格式需要openpyxl依赖,读取旧版.xls格式需要xlrd==1.2.0依赖,环境缺依赖时pandas抛出的异常如果未被捕获,会直接导致Qt程序崩溃,而非正常抛出错误提示。

    • 修复:执行命令安装依赖:pip install openpyxl xlrd==1.2.0,读取时显式指定引擎避免自动匹配错误,示例:pd.read_excel(pathOfFile, names=column_names, engine='openpyxl')
  3. 代码拼写错误导致的后续崩溃
    代码中setHorizontalHearsLabels为拼写错误,正确方法名是setHorizontalHeaderLabels,即便Excel读取成功,执行到该行也会因为方法不存在触发崩溃。此外当前代码仅设置了表格行列数,未实际填充DataFrame数据,修复拼写后表格也会显示空白。

    • 修复:修正方法名,补充表格数据填充逻辑:
    self.tableExcelData.setHorizontalHeaderLabels(df.columns)
    # 逐行逐列填充单元格数据
    for row_idx in range(df.shape[0]):
        for col_idx in range(df.shape[1]):
            cell_val = str(df.iloc[row_idx, col_idx]) if pd.notna(df.iloc[row_idx, col_idx]) else ""
            self.tableExcelData.setItem(row_idx, col_idx, QTableWidgetItem(cell_val))
    
  4. 主线程阻塞+无异常捕获
    Excel读取属于IO密集型操作,直接在GUI主线程执行会阻塞Qt事件循环,表现为界面无响应;同时代码未做路径合法性校验、未加异常捕获,文件不存在、文件格式损坏等场景都会直接触发崩溃。

    • 修复:增加路径校验和异常捕获,大文件读取建议移到QThread子线程执行,基础校验逻辑示例:
    import os
    from PyQt6.QtWidgets import QMessageBox
    
    @Slot()
    def loadExcelData(self, pathOfFile):
        if not os.path.isfile(pathOfFile):
            QMessageBox.warning(self, "提示", "请先选择有效的Excel文件")
            return
        column_names = ["IDofCell", "SerialNumber", "Action", "TimeOfFailure", "ReverseRankR", "Cdf", "Ppf", "LogTime"]
        try:
            df = pd.read_excel(pathOfFile, names=column_names, engine='openpyxl')
        except Exception as e:
            QMessageBox.critical(self, "读取失败", f"Excel解析错误:{str(e)}")
            return
        # 后续表格渲染逻辑
    

内容的提问来源于stack exchange,提问作者Hubertius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 18:54:32