热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Python技巧】十分钟就能够实现Excel数据整合/拆分,为啥要花一天?|附源码

相关文件想学Python的小伙伴可以关注小编的公众号【Python日志】有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!ÿ

相关文件

想学Python的小伙伴可以关注小编的公众号【Python日志】
有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!!
需要源码的小伙伴可以在公众号回复Excel表格
Python源码、问题解答学习交流群:773162165


需求分析

现在有一大堆的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数据汇总/拆分器')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 = parentself.working = Truedef __del__(self):self.working = Falseself.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:passself.trigger.emit('数据处理完成...')self.finished.emit(True)def merge_data(self, files, new_file_path):num = 1new_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.sheetnamesfor 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 + 1else:self.trigger.emit('当前路径为空,继续...')writer.save()writer.close()def split_data(self, files, new_file_path):num = 1for file in files.split(';'):if file.strip() != '':web_sheet = pxl.load_workbook(file)sheets = web_sheet.sheetnamesfor 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 + 1else:self.trigger.emit('当前路径为空,继续...')

上面就是主要的代码块实现过程,有需要的可以参考一下。欢迎大佬在评论区进行留言。


效果展示

搞了一个程序运行效果图,看一下执行效果。在这里插入图片描述

公众号:Python日志
公众号内回复 Excel表格,获取完整源代码,直接运行即可。


推荐阅读
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • Vuforia 开发指南:第二章 环境配置与搭建
    本章节详细介绍了如何在Vuforia官网上完成账号注册及环境配置。首先,访问Vuforia官方网站并点击“Register”按钮,按照提示填写必要的个人信息。提交表单后,系统将验证信息并创建账户。接下来,用户需要下载并安装Vuforia开发工具,确保开发环境的顺利搭建。此外,还提供了详细的配置步骤和常见问题的解决方案,帮助开发者快速上手。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
author-avatar
yun悠然_434
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有