


“带你横跨办公自动化的数据江海”
@摸鱼
前言
关于摸鱼
(
ABOUT MOYU
)
闻道有先后,术业有专攻。
各位大佬朋友们好!
~我依旧是你们的老朋友摸鱼~
在职场摸爬滚打的这十多年里,我用Python悄悄干了不少“正事”——不知不觉攒下了一整套办公自动化的实用项目技巧。去年10月初创立了公众号 「码海听潮」 ,初衷很简单:把重复的劳动交给代码,把摸鱼的时间留给生活。
目前已经吭哧吭哧更新了100多篇原创文章,每一篇都是实操干货,不讲虚的,只聊怎么用代码真正解放双手,帮大家早点下班、准点摸鱼
好了,多了不说,少了不唠,今天给大佬们分享一款本人原创的Excel/CSV文件批量处理小工具,相比手动复制粘贴、一个个打开合并,效率提升数十倍。特别适合经常合并多份报表、清理重复数据、多列快速分组汇总统计的场景。

《办公工具成品展示:》


《该办公工具核心功能亮点:》
01
亮点1:拖拽即用,零配置⭐
直接拖拽文件或文件夹到界面即可,无需手动添加路径
自动识别文件格式和编码
02
亮点2:多列分组与丰富汇总🎨
不局限于单列分组,支持任意多级分组
6 种汇总方式覆盖大多数统计需求
03
亮点3:后台线程处理⚙️
处理大文件时界面不会卡死
实时日志输出,处理进度一目了然

《该办公工具代码展示:》
下面,我就用python代码让各位大佬见识一下,什么叫"传统文化"遇上"赛博效率"
import sysfrom PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLabel, QCheckBox, QLineEdit, QTextEdit,QMessageBox, QFrame, QGroupBox, QComboBox)from PyQt6.QtCore import Qtfrom PyQt6.QtGui import QFontclass DropZone(QFrame):"""文件拖拽区域"""def __init__(self, parent=None):super().__init__(parent)self.setAcceptDrops(True)self.setMinimumHeight(150)self.setStyleSheet("""QFrame {border: 2px dashed#c0c0c0;border-radius: 8px;background-color:#fafafa;}QFrame:hover {border-color:#409eff;background-color:#ecf5ff;}""")layout = QVBoxLayout()icon_label = QLabel("📂")icon_label.setAlignment(Qt.AlignmentFlag.AlignCenter)icon_label.setStyleSheet("font-size: 48px; border: none; background: transparent;")self.label = QLabel("拖拽 Excel/CSV 文件或文件夹到此处")self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)self.label.setStyleSheet("color:#909399; font-size: 14px; border: none; background: transparent;")self.hint_label = QLabel("支持 .xlsx, .xls, .csv 格式")self.hint_label.setAlignment(Qt.AlignmentFlag.AlignCenter)self.hint_label.setStyleSheet("color:#c0c4cc; font-size: 12px; border: none; background: transparent;")layout.addWidget(icon_label)layout.addWidget(self.label)layout.addWidget(self.hint_label)layout.setSpacing(8)self.setLayout(layout)class ExcelMergerApp(QMainWindow):def __init__(self):super().__init__()self.init_ui()def init_ui(self):self.setWindowTitle("Excel 数据处理工具")self.setGeometry(100, 100, 800, 650)self.setFixedSize(800, 650)# 中心部件central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)main_layout.setSpacing(12)main_layout.setContentsMargins(20, 15, 20, 15)# 拖拽区域self.drop_zone = DropZone()main_layout.addWidget(self.drop_zone)# 数据清洗选项clean_group = QGroupBox("数据清洗")clean_group.setFont(QFont("", 10, QFont.Weight.Bold))clean_layout = QVBoxLayout()clean_layout.setSpacing(8)self.check_dropna = QCheckBox("删除完全空白的行")self.check_dropna.setChecked(True)self.check_dropdup = QCheckBox("删除重复行")self.check_dropdup.setChecked(True)cols_layout = QHBoxLayout()cols_layout.addWidget(QLabel("删除列:"))self.entry_dropcols = QLineEdit()self.entry_dropcols.setPlaceholderText("多个列名用逗号分隔,例如:列1,列2")cols_layout.addWidget(self.entry_dropcols)self.check_continue = QCheckBox("出错时继续处理其他文件")self.check_continue.setChecked(True)clean_layout.addWidget(self.check_dropna)clean_layout.addWidget(self.check_dropdup)clean_layout.addLayout(cols_layout)clean_layout.addWidget(self.check_continue)clean_group.setLayout(clean_layout)main_layout.addWidget(clean_group)# 分组汇总选项summary_group = QGroupBox("分组汇总")summary_group.setFont(QFont("", 10, QFont.Weight.Bold))summary_layout = QVBoxLayout()summary_layout.setSpacing(8)self.check_summary = QCheckBox("启用分组汇总")self.check_summary.toggled.connect(self.toggle_summary)summary_layout.addWidget(self.check_summary)# 分组列输入行group_layout = QHBoxLayout()group_layout.addWidget(QLabel("分组列:"))self.entry_groupcol = QLineEdit()self.entry_groupcol.setPlaceholderText("支持多列,用逗号分隔,例如:部门,地区")self.entry_groupcol.setEnabled(False)group_layout.addWidget(self.entry_groupcol)summary_layout.addLayout(group_layout)# 数值列输入行value_layout = QHBoxLayout()value_layout.addWidget(QLabel("数值列:"))self.entry_valuecol = QLineEdit()self.entry_valuecol.setPlaceholderText("可选,用于求和/平均/最大/最小等")self.entry_valuecol.setEnabled(False)value_layout.addWidget(self.entry_valuecol)summary_layout.addLayout(value_layout)# 汇总类型选择agg_layout = QHBoxLayout()agg_layout.addWidget(QLabel("汇总方式:"))self.combo_agg = QComboBox()self.combo_agg.addItems(['计数', '求和', '平均值', '最大值', '最小值', '中位数'])self.combo_agg.setEnabled(False)agg_layout.addWidget(self.combo_agg)agg_layout.addStretch()summary_layout.addLayout(agg_layout)summary_group.setLayout(summary_layout)main_layout.addWidget(summary_group)# 日志区域log_group = QGroupBox("处理日志")log_group.setFont(QFont("", 10, QFont.Weight.Bold))log_layout = QVBoxLayout()self.log_text = QTextEdit()self.log_text.setReadOnly(True)self.log_text.setMaximumHeight(180)self.log_text.setFont(QFont("Consolas", 9))log_layout.addWidget(self.log_text)log_group.setLayout(log_layout)main_layout.addWidget(log_group)# 处理按钮self.btn_process = QPushButton("🚀 开始处理")self.btn_process.setFont(QFont("", 11))self.btn_process.setMinimumHeight(40)main_layout.addWidget(self.btn_process)def toggle_summary(self):"""切换汇总选项"""enabled = self.check_summary.isChecked()self.entry_groupcol.setEnabled(enabled)self.entry_valuecol.setEnabled(enabled)self.combo_agg.setEnabled(enabled)def main():app = QApplication(sys.argv)app.setApplicationName("Excel 数据处理工具")font = app.font()font.setPointSize(10)app.setFont(font)window = ExcelMergerApp()window.show()sys.exit(app.exec())if __name__ == "__main__":main()
通过上面Python自动化脚本,仅用几秒钟的时间就完成原需手动操作数小时甚至数天的工作任务。从最初准备手动人工机械操作的麻木到用python实现高效自动化的畅快,工作效率获得指数级提升,终于实现了不加班熬夜的自由!
大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

《该办公工具的应用场景:》
销售数据汇总 | 合并多个月的销售报表,按"产品类别"汇总销售额 |
人事档案整理 | 合并多个部门的员工表,去重、删除无用列 |
财务报表合并 | 合并各分公司财务报表,按"部门"计算平均工资 |
库存统计 | 合并多个仓库的库存文件,按"商品编码"统计数量 |
数据清洗预处理 | 批量清理多个数据文件中的空行和重复行 |
结语
当Python遇见办公,牛马打工人终于笑出了猪叫声
【职场人必看】每天早上一睁眼,想到又要面对:
1.📊 堆积如山的Excel表格
2.📑 机械重复的复制粘贴
3.✍️ 永远改不完的各类文档
4.诸如此类的更多........
是不是连Ctrl+Alt+Delete的心都有了?
别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!
感谢各位大佬观看,还望各位大佬抬抬贵手一键三连,多多关注点赞转发评论,大佬们的支持才是摸鱼孜孜不倦更新原创干货的动力!
另外,本篇文章代码和exe资源已经上传nas私有云,有需要的大佬私信摸鱼君进群获取!

夜雨聆风