如何基于PyQt5制作数据处理小工具
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,小编给大家分享一下如何基于PyQt5制作数据处理小工具,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!需求分析:现在有一大堆的Excel数据文件,需要根据每个Excel数据文件里面的S
千家信息网最后更新 2025年01月19日如何基于PyQt5制作数据处理小工具
小编给大家分享一下如何基于PyQt5制作数据处理小工具,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
需求分析:
现在有一大堆的Excel数据文件,需要根据每个Excel数据文件里面的Sheet批量将数据文件合并成为一个汇总后的Excel数据文件。或者是将一个汇总后的Excel数据文件按照Sheet拆分成很多个Excel数据文件。根据上面的需求,我们先来进行UI界面的布局设计。
导入UI界面设计相关的PyQt5模块
from PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *
应用操作相关的模块
import sysimport os
excel 数据处理模块
import openpyxl as pxlimport pandas as pd
看一下 UI 界面的功能和布局,感觉还可以...
下面是布局相关的代码块实例
def init_ui(self): self.setWindowTitle('Excel数据汇总/拆分器 公众号:[Python 集中营]') self.setWindowIcon(QIcon('数据.ico')) self.brower = QTextBrowser() self.brower.setReadOnly(True) self.brower.setFont(QFont('宋体', 8)) self.brower.setPlaceholderText('批量数据处理进度显示区域...') self.brower.ensureCursorVisible() self.excels = QLineEdit() self.excels.setReadOnly(True) self.excels_btn = QPushButton() self.excels_btn.setText('加载批文件') self.excels_btn.clicked.connect(self.excels_btn_click) self.oprate_type = QLabel() self.oprate_type.setText('操作类型') self.oprate_combox = QComboBox() self.oprate_combox.addItems(['数据合并', '数据拆分']) self.data_type = QLabel() self.data_type.setText('合并/拆分') self.data_combox = QComboBox() self.data_combox.addItems(['按照Sheet拆分']) self.new_file_path = QLineEdit() self.new_file_path.setReadOnly(True) self.new_file_path_btn = QPushButton() self.new_file_path_btn.setText('新文件路径') self.new_file_path_btn.clicked.connect(self.new_file_path_btn_click) self.thread_ = DataThread(self) self.thread_.trigger.connect(self.update_log) self.thread_.finished.connect(self.finished) self.start_btn = QPushButton() self.start_btn.setText('开始数据汇总/拆分') self.start_btn.clicked.connect(self.start_btn_click) form = QFormLayout() form.addRow(self.excels, self.excels_btn) form.addRow(self.oprate_type, self.oprate_combox) form.addRow(self.data_type, self.data_combox) form.addRow(self.new_file_path, self.new_file_path_btn) vbox = QVBoxLayout() vbox.addLayout(form) vbox.addWidget(self.start_btn) hbox = QHBoxLayout() hbox.addWidget(self.brower) hbox.addLayout(vbox) self.setLayout(hbox)
槽函数 update_log,将运行过程通过文本浏览器的方式实时展示,方便查看程序的运行。
def update_log(self, text): cursor = self.brower.textCursor() cursor.movePosition(QTextCursor.End) self.brower.append(text) self.brower.setTextCursor(cursor) self.brower.ensureCursorVisible()
槽函数 excels_btn_click,绑定到文件加载按钮,处理源文件的加载过程。
def excels_btn_click(self): paths = QFileDialog.getOpenFileNames(self, '选择文件', os.getcwd(), 'Excel File(*.xlsx)') files = paths[0] path_strs = '' for file in files: path_strs = path_strs + file + ';' self.excels.setText(path_strs) self.update_log('已经完成批文件路径加载!')
槽函数 new_file_path_btn_click,选择新文件要保存的路径。
def new_file_path_btn_click(self): directory = QFileDialog.getExistingDirectory(self, '选择文件夹', os.getcwd()) self.new_file_path.setText(directory)
槽函数 start_btn_click,绑定到开始按钮上,使用开始按钮启动子线程工作。
def start_btn_click(self): self.start_btn.setEnabled(False) self.thread_.start()
函数 finished,这个函数是用来接收子线程传过来的运行完成的信号,通过判断使子线程执行完成时让开始按钮处于可以点击的状态。
def finished(self, finished): if finished is True: self.start_btn.setEnabled(True)
下面是最重要的逻辑处理部分,将所有的逻辑处理相关的部分全部放到子线程中去执行。
class DataThread(QThread): trigger = pyqtSignal(str) finished = pyqtSignal(bool) def __init__(self, parent=None): super(DataThread, self).__init__(parent) self.parent = parent self.working = True def __del__(self): self.working = False self.wait() def run(self): self.trigger.emit('启动批量处理子线程...') oprate_type = self.parent.oprate_combox.currentText().strip() data_type = self.parent.data_combox.currentText().strip() files = self.parent.excels.text().strip() new_file_path = self.parent.new_file_path.text() if data_type == '按照Sheet拆分' and oprate_type == '数据合并': self.merge_data(files=files, new_file_path=new_file_path) elif data_type == '按照Sheet拆分' and oprate_type == '数据拆分': self.split_data(files=files, new_file_path=new_file_path) else: pass self.trigger.emit('数据处理完成...') self.finished.emit(True) def merge_data(self, files, new_file_path): num = 1 new_file = new_file_path + '/数据汇总.xlsx' writer = pd.ExcelWriter(new_file) for file in files.split(';'): if file.strip() != '': web_sheet = pxl.load_workbook(file) sheets = web_sheet.sheetnames for sheet in sheets: sheet_name = sheet.title() self.trigger.emit('准备处理工作表名称:' + str(sheet.title())) data_frame = pd.read_excel(file, sheet_name=sheet_name) sheet_name = sheet_name + 'TO数据合并' + str(num) data_frame.to_excel(writer, sheet_name, index=False) num = num + 1 else: self.trigger.emit('当前路径为空,继续...') writer.save() writer.close() def split_data(self, files, new_file_path): num = 1 for file in files.split(';'): if file.strip() != '': web_sheet = pxl.load_workbook(file) sheets = web_sheet.sheetnames for sheet in sheets: sheet_name = sheet.title() self.trigger.emit('准备处理工作表名称:' + str(sheet.title())) data_frame = pd.read_excel(file, sheet_name=sheet_name) writer = pd.ExcelWriter(new_file_path + '/数据拆分' + str(num) + '.xlsx') data_frame.to_excel(writer, '数据拆分', index=False) writer.save() writer.close() num = num + 1 else: self.trigger.emit('当前路径为空,继续...')
上面就是主要的代码块实现过程,有需要的可以参考一下。欢迎大佬在评论区进行留言。
搞了一个程序运行效果图,看一下执行效果。
完整代码
# -*- coding:utf-8 -*-# @author Python 集中营# @date 2022/1/12# @file test8.py# done# 数据处理小工具:Excel 批量数据文件拆分/整合器# 需求分析:# 现在有一大堆的Excel数据文件,需要根据每个Excel数据文件里面的Sheet批量将数据文件# 合并成为一个汇总后的Excel数据文件。# 或者是将一个汇总后的Excel数据文件按照Sheet拆分成很多个Excel数据文件。# 根据上面的需求,我们先来进行UI界面的布局设计。# 导入UI界面设计相关的PyQt5模块from PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *# 应用操作相关的模块import sysimport os# excel 数据处理模块import openpyxl as pxlimport pandas as pdclass ExcelDataMerge(QWidget): def __init__(self): super(ExcelDataMerge, self).__init__() self.init_ui() def init_ui(self): self.setWindowTitle('Excel数据汇总/拆分器 公众号:[Python 集中营]') self.setWindowIcon(QIcon('数据.ico')) self.brower = QTextBrowser() self.brower.setReadOnly(True) self.brower.setFont(QFont('宋体', 8)) self.brower.setPlaceholderText('批量数据处理进度显示区域...') self.brower.ensureCursorVisible() self.excels = QLineEdit() self.excels.setReadOnly(True) self.excels_btn = QPushButton() self.excels_btn.setText('加载批文件') self.excels_btn.clicked.connect(self.excels_btn_click) self.oprate_type = QLabel() self.oprate_type.setText('操作类型') self.oprate_combox = QComboBox() self.oprate_combox.addItems(['数据合并', '数据拆分']) self.data_type = QLabel() self.data_type.setText('合并/拆分') self.data_combox = QComboBox() self.data_combox.addItems(['按照Sheet拆分']) self.new_file_path = QLineEdit() self.new_file_path.setReadOnly(True) self.new_file_path_btn = QPushButton() self.new_file_path_btn.setText('新文件路径') self.new_file_path_btn.clicked.connect(self.new_file_path_btn_click) self.thread_ = DataThread(self) self.thread_.trigger.connect(self.update_log) self.thread_.finished.connect(self.finished) self.start_btn = QPushButton() self.start_btn.setText('开始数据汇总/拆分') self.start_btn.clicked.connect(self.start_btn_click) form = QFormLayout() form.addRow(self.excels, self.excels_btn) form.addRow(self.oprate_type, self.oprate_combox) form.addRow(self.data_type, self.data_combox) form.addRow(self.new_file_path, self.new_file_path_btn) vbox = QVBoxLayout() vbox.addLayout(form) vbox.addWidget(self.start_btn) hbox = QHBoxLayout() hbox.addWidget(self.brower) hbox.addLayout(vbox) self.setLayout(hbox) def update_log(self, text): cursor = self.brower.textCursor() cursor.movePosition(QTextCursor.End) self.brower.append(text) self.brower.setTextCursor(cursor) self.brower.ensureCursorVisible() def excels_btn_click(self): paths = QFileDialog.getOpenFileNames(self, '选择文件', os.getcwd(), 'Excel File(*.xlsx)') files = paths[0] path_strs = '' for file in files: path_strs = path_strs + file + ';' self.excels.setText(path_strs) self.update_log('已经完成批文件路径加载!') def new_file_path_btn_click(self): directory = QFileDialog.getExistingDirectory(self, '选择文件夹', os.getcwd()) self.new_file_path.setText(directory) def start_btn_click(self): self.start_btn.setEnabled(False) self.thread_.start() def finished(self, finished): if finished is True: self.start_btn.setEnabled(True)class DataThread(QThread): trigger = pyqtSignal(str) finished = pyqtSignal(bool) def __init__(self, parent=None): super(DataThread, self).__init__(parent) self.parent = parent self.working = True def __del__(self): self.working = False self.wait() def run(self): self.trigger.emit('启动批量处理子线程...') oprate_type = self.parent.oprate_combox.currentText().strip() data_type = self.parent.data_combox.currentText().strip() files = self.parent.excels.text().strip() new_file_path = self.parent.new_file_path.text() if data_type == '按照Sheet拆分' and oprate_type == '数据合并': self.merge_data(files=files, new_file_path=new_file_path) elif data_type == '按照Sheet拆分' and oprate_type == '数据拆分': self.split_data(files=files, new_file_path=new_file_path) else: pass self.trigger.emit('数据处理完成...') self.finished.emit(True) def merge_data(self, files, new_file_path): num = 1 new_file = new_file_path + '/数据汇总.xlsx' writer = pd.ExcelWriter(new_file) for file in files.split(';'): if file.strip() != '': web_sheet = pxl.load_workbook(file) sheets = web_sheet.sheetnames for sheet in sheets: sheet_name = sheet.title() self.trigger.emit('准备处理工作表名称:' + str(sheet.title())) data_frame = pd.read_excel(file, sheet_name=sheet_name) sheet_name = sheet_name + 'TO数据合并' + str(num) data_frame.to_excel(writer, sheet_name, index=False) num = num + 1 else: self.trigger.emit('当前路径为空,继续...') writer.save() writer.close() def split_data(self, files, new_file_path): num = 1 for file in files.split(';'): if file.strip() != '': web_sheet = pxl.load_workbook(file) sheets = web_sheet.sheetnames for sheet in sheets: sheet_name = sheet.title() self.trigger.emit('准备处理工作表名称:' + str(sheet.title())) data_frame = pd.read_excel(file, sheet_name=sheet_name) writer = pd.ExcelWriter(new_file_path + '/数据拆分' + str(num) + '.xlsx') data_frame.to_excel(writer, '数据拆分', index=False) writer.save() writer.close() num = num + 1 else: self.trigger.emit('当前路径为空,继续...')if __name__ == '__main__': app = QApplication(sys.argv) main = ExcelDataMerge() main.show() sys.exit(app.exec_())
看完了这篇文章,相信你对"如何基于PyQt5制作数据处理小工具"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
数据
文件
处理
数据处理
路径
函数
模块
线程
界面
工作
选择
名称
布局
按钮
需求
准备
设计
运行
工具
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
阿雪的全文数据库
数据库系统的安全管理软件
vray许可证服务器信息
软件开发沙僧科技
数据库备份到其他服务器
广州教育技术软件开发机构
朝月科技软件开发有限公司
服务器license
莱芜仓库管理erp软件开发公司
西安 服务器 托管
网络安全排查整治会议简报
日本服务器网速快吗
软件开发的薪酬方案
数据库学习版
省市区三级联动数据库结构
武汉网络安全基地总体规划图
建模软件开发入口
上海的嵌入式软件开发行业
我的世界服务器服主强开指令
数据库要用的软件
软件开发我为什么都配几个显示屏
fiddler 服务器
软件开发者线路图
服务器主板开机跳线图解
软件开发项目如何确认收入
北京搜房网络技术公司苏州分公司
德国服务器适合什么业务
河南潮流软件开发服务检测中心
mc服务器没人仍占用
erp无法连接消息服务器