PyQt实现读取MySql数据库表数据将其显示在TableWidget并保存为excel表格

记录将数据从MySql数据库中读取表数据并制作报表

	 想要将mysql数据库中表的数据显示在ui上,需要用到tableWidget控件,这里我们在QtDesigner中新建一个Widget窗
	 口,然后再窗口中添加一个frame作为父容器,之后将TableWidget拖入进去就可以了。

1、利用QTDesigner生成一般界面,包含基本的控件信息。
qt中的界面如下图所示
在这里插入图片描述

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(828, 539)
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setGeometry(QtCore.QRect(30, 20, 771, 471))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.tableWidget = QtWidgets.QTableWidget(self.frame)
        self.tableWidget.setGeometry(QtCore.QRect(30, 20, 691, 331))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.tableWidget.horizontalHeader().setVisible(True)
        self.tableWidget.horizontalHeader().setCascadingSectionResizes(True)
        self.tableWidget.horizontalHeader().setSortIndicatorShown(False)
        self.tableWidget.verticalHeader().setVisible(False)
        self.lineEdit = QtWidgets.QLineEdit(self.frame)
        self.lineEdit.setGeometry(QtCore.QRect(100, 380, 211, 31))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(self.frame)
        self.label.setGeometry(QtCore.QRect(30, 380, 61, 31))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setGeometry(QtCore.QRect(330, 380, 71, 31))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.frame)
        self.pushButton_2.setGeometry(QtCore.QRect(330, 420, 71, 31))
        self.pushButton_2.setObjectName("pushButton_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.frame)
        self.lineEdit_2.setGeometry(QtCore.QRect(100, 420, 211, 31))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_2 = QtWidgets.QLabel(self.frame)
        self.label_2.setGeometry(QtCore.QRect(30, 420, 51, 31))
        self.label_2.setObjectName("label_2")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "文件浏览"))
        self.pushButton.setText(_translate("Form", "浏览"))
        self.pushButton_2.setText(_translate("Form", "保存"))
        self.label_2.setText(_translate("Form", "文件名"))

2、书写控制调用程序,对QT生成的程序进行调用。完成mysql数据的读取,报表的形成,并可以将报表数据存储到excel数据表格中。

from PyQt5 import QtWidgets,QtCore, QtGui
from PyQt5.QtWidgets import QWidget, QApplication, QTableWidgetItem, QLineEdit, QMessageBox
import xlwt
import table001
import sys
import MySQLdb

class MyClass(QWidget,table001.Ui_Form):
    def __init__(self):
        super().__init__()
        self.InitUi()
        self.My_Sql()

    def InitUi(self):
        self.setupUi(self)
        self.setWindowTitle("轨道检测")
        self.show()
        self.pushButton.clicked.connect(self.setBrowerPath)
        self.pushButton_2.clicked.connect(self.savefile)
        self._translate = QtCore.QCoreApplication.translate
    def Table_Data(self,i,j,data):

        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(i,j, item)
        item = self.tableWidget.item(i,j)
        item.setText(self._translate("Form", str(data)))

    def My_Sql(self):    #连接mysql数据库
        connection = MySQLdb.connect(host = 'localhost',port=3306 ,user = 'root',passwd = '123456',db = 'imooc',charset='utf8')
        print('successfully connect')
        cur = connection.cursor()
        cur.execute('select * from new_table')  # 将数据从数据库中拿出来
        total = cur.fetchall()
        col_result = cur.description
        self.row = cur.rowcount  # 取得记录个数,用于设置表格的行数
        self.vol = len(total[0])  # 取得字段数,用于设置表格的列数
        col_result = list(col_result)
        a = 0
        self.tableWidget.setColumnCount(self.vol)
        self.tableWidget.setRowCount(self.row)
        for i in col_result:   #设置表头信息,将mysql数据表中的表头信息拿出来,放进TableWidget中
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(a,item)
            item = self.tableWidget.horizontalHeaderItem(a)
            item.setText(self._translate("Form", i[0]))
            a = a + 1

        total = list(total)          # 将数据格式改为列表形式,其是将数据库中取出的数据整体改为列表形式
        for i in range(len(total)):      #将相关的数据
            total[i] = list(total[i])  #将获取的数据转为列表形式
        for i in range(self.row):
            for j in range(self.vol):
                self.Table_Data(i,j,total[i][j])

    def setBrowerPath(self):   #选择文件夹进行存储
        download_path = QtWidgets.QFileDialog.getExistingDirectory(None, "浏览", "/home")
        self.lineEdit.setText(download_path)

    def savefile(self):
        print("hello")
        book=xlwt.Workbook()
        sheet=book.add_sheet('超限数据报表')
        for i in range(0,self.tableWidget.rowCount()):
            for j in range(0,self.tableWidget.columnCount()):
                try:
                    sheet.write(i,j,self.tableWidget.item(i,j).text())
                except:
                    continue
        if len(self.lineEdit_2.text())<1:
            QMessageBox.information(self.pushButton, ' ', '文件名不可为空', QMessageBox.Ok)
        else:
            try:
                book.save(self.lineEdit.text()+'/'+self.lineEdit_2.text()+'.xls')
                QApplication.instance().exit()

            except:
                QMessageBox.information(self.pushButton,' ','所选目录错误!',QMessageBox.Ok)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mc = MyClass()
    sys.exit(app.exec_())

运行程序生成界面

在这里插入图片描述

可以选择文件夹并保存数据到excel表格中。

  • 19
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 使用PyQtQTreeView控件可以实现双击修改内容并保存数据库的功能。具体步骤如下: 1. 首先,我们需要创建一个QTreeView控件并将其与一个QStandardItemModel模型绑定,用于显示数据。 ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeView from PyQt5.QtGui import QStandardItemModel class MyWindow(QMainWindow): def __init__(self): super().__init__() self.treeView = QTreeView(self) self.setCentralWidget(self.treeView) self.model = QStandardItemModel() self.treeView.setModel(self.model) ``` 2. 在模型添加数据,并为每个数据项设置编辑标志,以便允许双击编辑。 ```python from PyQt5.QtGui import QStandardItem # 添加数据 def addData(self): item = QStandardItem("数据") item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) # 允许编辑 self.model.appendRow(item) ``` 3. 监听双击事件,并获取双击的表格索引。 ```python from PyQt5.QtCore import QModelIndex # 双击事件 def doubleClicked(self, index: QModelIndex): # 判断是否是双击事件 if index.isValid() and index.column() == 0: # 获取双击的单元格数据 item = self.model.itemFromIndex(index) current_data = item.text() print(current_data) ``` 4. 弹出一个可编辑的对话框,实现数据的修改。 ```python from PyQt5.QtWidgets import QInputDialog # 修改数据 def editData(self, current_data): # 在对话框获取修改后的数据 new_data, ok = QInputDialog.getText(self, "编辑数据", "请输入新的数据:", text=current_data) if ok: # 更新数据模型 item = QStandardItem(new_data) item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) self.model.setItem(index.row(), index.column(), item) ``` 5. 将修改后的数据保存数据库。 ```python import sqlite3 # 连接数据库 def connectDatabase(self): self.conn = sqlite3.connect('mydb.db') self.cursor = self.conn.cursor() # 保存数据数据库 def saveToDatabase(self, current_data, new_data): self.cursor.execute("UPDATE tablename SET columnname = ? WHERE columnname = ?", (new_data, current_data)) self.conn.commit() print("数据保存数据库") ``` 以上就是通过PyQtQTreeView控件实现双击编辑数据保存数据库的简单示例。 ### 回答2: 使用PyQt的TreeView组件实现双击修改内容并保存数据库的功能,可以按照以下步骤进行操作: 1. 首先,需要创建一个TreeView,可以使用QTreeView来实现。使用QStandardItemModel作为Model,将其设置给TreeView。 ```python tree_view = QTreeView() model = QStandardItemModel() tree_view.setModel(model) ``` 2. 然后,将需要展示的数据数据库获取,并添加到Model。可以使用QStandardItem来创建每个节点,并设置节点的文本内容。 ```python # 从数据库获取数据并添加到Model data = get_data_from_database() for item_data in data: item = QStandardItem(item_data) model.appendRow(item) ``` 3. 接下来,需要处理双击事件。使用双击事件的信号与槽机制来响应双击事件,并进行相应的处理。 ```python tree_view.doubleClicked.connect(handle_double_click) ``` 4. 在双击事件的处理函数获取双击的节点,并创建一个可编辑的代理(delegate)来编辑节点的内容。 ```python def handle_double_click(index): item = model.itemFromIndex(index) proxy = QItemEditorCreatorBase.createEditor(model, index) tree_view.setIndexWidget(index, proxy) proxy.editingFinished.connect(lambda: save_to_database(item, proxy)) ``` 5. 编辑完成后,保存修改的内容到数据库。可以根据需要,使用SQL语句或ORM框架来更新数据库数据。 ```python def save_to_database(item, proxy): new_value = proxy.text() # 更新数据库数据 update_data_in_database(item, new_value) # 更新Tree View数据 item.setText(new_value) ``` 通过以上步骤,就可以实现双击TreeView的节点,对内容进行修改,并将修改后的内容保存数据库。 ### 回答3: 在使用PyQt的TreeView控件时,要实现双击修改内容并保存数据库,可以按照以下步骤进行: 1. 首先,需要导入所需的PyQt模块: ```python from PyQt5.QtWidgets import QApplication, QTreeView, QStandardItemModel, QLineEdit, QStyledItemDelegate from PyQt5.QtCore import Qt, QModelIndex import sqlite3 ``` 2. 创建一个TreeView,并设置数据模型为QStandardItemModel: ```python app = QApplication([]) tree_view = QTreeView() model = QStandardItemModel() tree_view.setModel(model) ``` 3. 连接数据库并将数据加载到TreeView: ```python conn = sqlite3.connect("your_database.db") cursor = conn.cursor() cursor.execute("SELECT * FROM your_table") result = cursor.fetchall() for row in result: item = QStandardItem(row[0]) model.appendRow(item) ``` 4. 创建一个自定义的委托类,用于在双击时进入编辑模式: ```python class EditDelegate(QStyledItemDelegate): def createEditor(self, parent, option, index): editor = QLineEdit(parent) return editor def setEditorData(self, editor, index): value = index.model().data(index, Qt.EditRole) editor.setText(value) def setModelData(self, editor, model, index): value = editor.text() model.setData(index, value, Qt.EditRole) ``` 5. 将自定义的委托类应用到TreeView的每个单元格: ```python delegate = EditDelegate() tree_view.setItemDelegate(delegate) ``` 6. 在修改内容时,通过双击触发编辑模式,然后按下Enter键保存修改: ```python def handle_double_click(index): tree_view.edit(index) tree_view.doubleClicked.connect(handle_double_click) ``` 7. 最后,保存修改后的数据数据库: ```python def close_event(): cursor.execute("DELETE FROM your_table") for row in range(model.rowCount()): item = model.item(row) cursor.execute("INSERT INTO your_table VALUES (?)", (item.text(),)) conn.commit() app.aboutToQuit.connect(close_event) ``` 通过以上步骤,就可以实现在双击TreeView单元格时进行内容修改,并将修改后的数据保存数据库
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值