欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于PyQt5制作Excel数据分组汇总器

程序员文章站 2022-05-10 17:26:08
...

这篇文章主要介绍了基于PyQt5制作的一个小工具:Excel数据分组汇总器。文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起试一试
在写数据汇总分组工具之前梳理一下需求,要求一:能够将excel的数据展示到列表中。要求二:能够支持按列汇总数据,并且多列分组汇总。要求三:能够预览分组汇总以后的数据,最后将分好组汇总的数据保存到新的excel数据文件中。
基于PyQt5制作Excel数据分组汇总器
主要使用到第三方python模块有下面这些,和前面几个 PyQt5 应用不同的是这次增加了一个样式模块 qdarkstyle ,通过最后将这个模块直接加入到 QApplication 中就可以显示成黑色酷酷的应用了。这个样式我个人是比较喜欢的…

  1. '''应用操作库'''
  2. import sys
  3. import os
  4. '''应用样式库'''
  5. from qdarkstyle import load_stylesheet_pyqt5
  6. '''UI界面库'''
  7. from PyQt5.QtWidgets import *
  8. from PyQt5.QtCore import *
  9. from PyQt5.QtGui import *
  10. '''数据提取库'''
  11. import pandas as pd

编写 UI 界面组件布局,UI 布局函数 init_ui()。init_ui() 的函数整体内容都贴在下面这里,大佬们可以根据自己的需要随意发挥。

  1. def init_ui(self):
  2. # 标题、图标设置
  3. self.setWindowTitle('Excel数据汇总工具 公众号:[Python *]')
  4. self.setWindowIcon(QIcon(':/data_sum.ico'))
  5. # 初始化水平布局
  6. hbox = QHBoxLayout()
  7. # 初始化栅格布局
  8. grid = QGridLayout()
  9. self.data_source_text = QLineEdit()
  10. self.data_source_text.setReadOnly(True)
  11. self.data_source_btn = QPushButton()
  12. self.data_source_btn.setText('数据')
  13. self.data_source_btn.clicked.connect(self.data_source_btn_click)
  14. self.data_group_column = QLabel()
  15. self.data_group_column.setText('设置分组列')
  16. self.data_group_column_text = QLineEdit()
  17. self.data_group_column_text.setPlaceholderText('列名1,列名2...')
  18. self.save_dir_text = QLineEdit()
  19. self.save_dir_text.setReadOnly(True)
  20. self.save_dir_btn = QPushButton()
  21. self.save_dir_btn.setText('路径')
  22. self.save_dir_btn.clicked.connect(self.save_dir_btn_click)
  23. self.view_data_btn = QPushButton()
  24. self.view_data_btn.setText('预览数据')
  25. self.view_data_btn.clicked.connect(self.view_data_btn_click)
  26. self.save_data_btn = QPushButton()
  27. self.save_data_btn.setText('保存')
  28. self.save_data_btn.clicked.connect(self.save_data_btn_click)
  29. grid.addWidget(self.data_source_text, 0, 0, 1, 2)
  30. grid.addWidget(self.data_source_btn, 0, 2, 1, 1)
  31. grid.addWidget(self.data_group_column, 1, 0, 1, 1)
  32. grid.addWidget(self.data_group_column_text, 1, 1, 1, 2)
  33. grid.addWidget(self.save_dir_text, 2, 0, 1, 2)
  34. grid.addWidget(self.save_dir_btn, 2, 2, 1, 1)
  35. grid.addWidget(self.view_data_btn, 3, 0, 1, 2)
  36. grid.addWidget(self.save_data_btn, 3, 2, 1, 1)
  37. self.table_view = QTableView()
  38. self.table_view.setFixedWidth(500)
  39. self.table_view.setFixedHeight(100)
  40. hbox.addWidget(self.table_view)
  41. hbox.addLayout(grid)
  42. self.setLayout(hbox)

槽函数总共使用了四个,分别是下面这些。

save_data_btn_click:将分组汇总后的 DataFrame 数据直接保存。

data_source_btn_click:用来加载需要分组汇总的 excel 文件的,并将加载出来的 DataFrame 数据直接显示到 QTableView 的组件上面,这样可以实时的看见加载进来的原始数据。

save_dir_btn_click:点击选择存储路径时触发的槽函数,用来调起 QFileDialog 来选择文件路径。

view_data_btn_click:调起预览分组汇总后的数据,将分组后的数据显示到窗口上。
槽函数 data_source_btn_click,加载 excel 源数据。

  1. def data_source_btn_click(self):
  2. xlsx_file = QFileDialog.getOpenFileName(self, '选择文件', self.cwd, 'Excel File(*.xlsx)')
  3. self.data_source_text.setText(xlsx_file[0])
  4. self.data_frame = pd.read_excel(self.data_source_text.text().strip())
  5. print(self.data_frame)
  6. model = TableModelView(self.data_frame)
  7. self.table_view.setModel(model)

槽函数 save_data_btn_click,保存最终的 excel 数据。

  1. def save_data_btn_click(self):
  2. dir = self.save_dir_text.text().strip()
  3. self.data_frame_group.to_excel(dir + 'group_data.xlsx',sheet_name='数据信息汇总')

槽函数 view_data_btn_click,预览分组汇总的数据。

  1. def view_data_btn_click(self):
  2. columns = self.data_group_column_text.text().strip()
  3. column_list = []
  4. if columns != '':
  5. column_list = columns.split(',')
  6. self.data_frame_group = self.data_frame.groupby(column_list, as_index=False).sum()
  7. print(self.data_frame_group)
  8. model = TableModelView(self.data_frame_group)
  9. self.table_view.setModel(model)

槽函数 save_dir_btn_click,存储文件选择。

  1. def save_dir_btn_click(self):
  2. save_path = QFileDialog.getExistingDirectory(self, '选择文件夹', self.cwd)
  3. self.save_dir_text.setText(save_path + '/')

最后,在主要代码块中展示列表数据时时使用了一个 QTableView 组件自定义的模型 TableModelView。