闻道有先后,术业有专攻。各位大佬们大家好!~我是你们的老朋友摸鱼~,本人在十多年的日常工作中摸爬滚打攒了不少Python办公自动化的实用项目技巧,自创立"码海听潮"公众号以来,已经陆续分享70多篇原创文章啦!里面满满的办公实操干货,希望能与各位大佬共同探讨办公效率提升之道,实现不加班自由。
有一个神秘的excel和word文档,excel表格里记录着某校初中某班各科科学习成绩汇总,word文档则是一份学期期末通知书模板,假设你是一位班主任老师,现在的需求是要根据学生的学习成绩表填写成绩和班主任寄语, 要是这种类似的需求你的Big 校长安排你去完成,请问阁下该如何应对?
需求的excel和word文档如下图:
- 逐一生成文档 + 复制粘贴50 名学生需创建 50 份独立通知书,需先从 Excel 查某学生的 8 科成绩,再逐一复制到 Word 对应位置,全程机械重复,50 人至少耗时 1-2 小时,且无法批量操作。
- 成绩对应错误Excel 和 Word 切换频繁,易出现 “张冠李戴”—— 比如把学生 A 的数学成绩粘贴到学生 B 的通知书中,或漏填某科成绩(如漏填生物、地理),尤其学生人数多时,核对成本极高。
- 个性化寄语耗时耗脑若需根据学生成绩差异写定制化寄语(如 “数学进步明显,英语需加强”“各科均衡,继续保持”),需逐一看学生各科成绩、排名变化,再组织语言,50 名学生需消耗大量脑力,且难保证寄语不重复、不空洞。
- 若为节省时间写通用寄语(如 “本学期表现良好,继续努力”),则失去寄语的引导意义,家长和学生感受不到重视,不符合班主任工作初衷。
由此可见若操作成百上千个word期末通知书的话整个操作流程繁琐且耗时,高频次的鼠标点击和键盘输入使操作者手指疲劳,堪称"键盘敲冒烟"式的体力劳动,加上人工疲劳操作极易导致遗漏文件夹。于是乎这时候,按以往的 “解题套路”,Python 的专属 BGM 该响起来了 ——go~ go~ go~,救苦救难的大救星这不就来了!!
1.读取 Excel 中的学生各科成绩数据,填充到word对应的成绩位置
2.调用 AI 接口生成个性化评语,替代人工写评语
3.生成保存每个同学单独的word版期末通知书
下面,我就用python代码让excel见识一下,什么叫"传统文化遇上赛博效率"(仅展示部分代码,非完整代码,需完整代码看文章末尾说明~)
import sysfrom PyQt6.QtWidgets import *from PyQt6.QtCore import *from PyQt6.QtGui import *class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setup_ui() def setup_ui(self): """设置界面""" self.setWindowTitle("AI智能学生期末通知书生成评价系统(欢迎关注微信公众号:码海听潮)") self.setGeometry(100, 100, 800, 600) # 设置中心窗口部件 central_widget = QWidget() self.setCentralWidget(central_widget) main_layout = QVBoxLayout(central_widget) main_layout.setSpacing(10) # 顶部配置区域 config_group = QGroupBox("配置") config_layout = QGridLayout() config_layout.setSpacing(10) # API密钥输入 config_layout.addWidget(QLabel("豆包API密钥:"), 0, 0) self.api_key_input = QLineEdit() self.api_key_input.setEchoMode(QLineEdit.EchoMode.Password) self.api_key_input.setPlaceholderText("请输入豆包API密钥") config_layout.addWidget(self.api_key_input, 0, 1, 1, 3) # 显示/隐藏密码按钮 self.show_password_btn = QPushButton("显示") self.show_password_btn.setCheckable(True) self.show_password_btn.clicked.connect(self.toggle_password_visibility) config_layout.addWidget(self.show_password_btn, 0, 4) # 文件选择 - Excel文件 config_layout.addWidget(QLabel("学生Excel文件:"), 1, 0) self.excel_path_input = QLineEdit() self.excel_path_input.setPlaceholderText("选择学生成绩Excel文件") config_layout.addWidget(self.excel_path_input, 1, 1, 1, 3) self.browse_excel_btn = QPushButton("浏览...") self.browse_excel_btn.clicked.connect(self.browse_excel_file) config_layout.addWidget(self.browse_excel_btn, 1, 4) # 最近Excel文件下拉菜单 self.recent_excel_menu = QMenu(self) self.recent_excel_btn = QPushButton("最近文件") self.recent_excel_btn.setMenu(self.recent_excel_menu) config_layout.addWidget(self.recent_excel_btn, 1, 5) # 文件选择 - 模板文件 config_layout.addWidget(QLabel("期末通知书模板:"), 2, 0) self.template_path_input = QLineEdit() self.template_path_input.setPlaceholderText("选择通知书模板文件") config_layout.addWidget(self.template_path_input, 2, 1, 1, 3) self.browse_template_btn = QPushButton("浏览...") self.browse_template_btn.clicked.connect(self.browse_template_file) config_layout.addWidget(self.browse_template_btn, 2, 4) # 最近模板文件下拉菜单 self.recent_template_menu = QMenu(self) self.recent_template_btn = QPushButton("最近文件") self.recent_template_btn.setMenu(self.recent_template_menu) config_layout.addWidget(self.recent_template_btn, 2, 5) config_group.setLayout(config_layout) main_layout.addWidget(config_group) # 学生数据预览区域 data_group = QGroupBox("学生数据预览") data_layout = QVBoxLayout() self.student_table = QTableWidget() # 初始时不设置列数,加载数据时动态设置 self.student_table.setColumnCount(0) self.student_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) data_layout.addWidget(self.student_table) data_group.setLayout(data_layout) main_layout.addWidget(data_group) # 控制按钮区域 - 居中显示 control_frame = QFrame() control_layout = QHBoxLayout(control_frame) control_layout.setAlignment(Qt.AlignmentFlag.AlignCenter) # 加载学生按钮 self.load_students_btn = QPushButton("加载学生数据") self.load_students_btn.setFixedSize(120, 40) self.load_students_btn.clicked.connect(self.load_students) control_layout.addWidget(self.load_students_btn) # 添加间距 control_layout.addSpacing(20) # 开始生成按钮 self.generate_btn = QPushButton("开始生成通知书") self.generate_btn.setFixedSize(140, 40) self.generate_btn.clicked.connect(self.start_generation) self.generate_btn.setEnabled(False) control_layout.addWidget(self.generate_btn) # 添加间距 control_layout.addSpacing(20) # 停止按钮 self.stop_btn = QPushButton("停止") self.stop_btn.setFixedSize(100, 40) self.stop_btn.clicked.connect(self.stop_generation) self.stop_btn.setEnabled(False) control_layout.addWidget(self.stop_btn) main_layout.addWidget(control_frame) # 状态信息标签 self.status_label = QLabel("就绪") self.status_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.status_label.setStyleSheet("QLabel { padding: 5px; font-weight: bold; }") main_layout.addWidget(self.status_label) # 日志输出区域 log_group = QGroupBox("运行日志") log_layout = QVBoxLayout() self.log_text = QTextEdit() self.log_text.setReadOnly(True) log_layout.addWidget(self.log_text) # 清空日志按钮 - 修改为居中显示 clear_log_frame = QFrame() clear_log_layout = QHBoxLayout(clear_log_frame) clear_log_layout.setAlignment(Qt.AlignmentFlag.AlignCenter) clear_log_btn = QPushButton("清空日志") clear_log_btn.clicked.connect(self.clear_log) clear_log_layout.addWidget(clear_log_btn) log_layout.addWidget(clear_log_frame) log_group.setLayout(log_layout) main_layout.addWidget(log_group) # 连接API密钥输入变化事件 self.api_key_input.textChanged.connect(self.update_generate_button_state) self.template_path_input.textChanged.connect(self.update_generate_button_state) def toggle_password_visibility(self): """切换密码显示/隐藏""" if self.show_password_btn.isChecked(): self.api_key_input.setEchoMode(QLineEdit.EchoMode.Normal) self.show_password_btn.setText("隐藏") else: self.api_key_input.setEchoMode(QLineEdit.EchoMode.Password) self.show_password_btn.setText("显示") def browse_excel_file(self): """浏览Excel文件""" file_path, _ = QFileDialog.getOpenFileName( self, "选择学生成绩Excel文件", "", "Excel文件 (*.xlsx *.xls)" ) if file_path: self.excel_path_input.setText(file_path) def browse_template_file(self): """浏览模板文件""" file_path, _ = QFileDialog.getOpenFileName( self, "选择通知书模板", "", "Word文档 (*.docx *.doc)" ) if file_path: self.template_path_input.setText(file_path) def update_generate_button_state(self): """更新生成按钮状态""" has_api_key = bool(self.api_key_input.text().strip()) has_template = bool(self.template_path_input.text().strip()) self.generate_btn.setEnabled(has_api_key and has_template) def load_students(self): """加载学生数据""" # 此处可以添加实际的学生数据加载逻辑 self.log_message("学生数据加载功能占位") def start_generation(self): """开始生成通知书""" self.log_message("开始生成通知书功能占位") def stop_generation(self): """停止生成过程""" self.log_message("停止生成功能占位") def log_message(self, message): """记录日志信息""" self.log_text.append(f"[系统提示:] {message}") def clear_log(self): """清空日志""" self.log_text.clear()def main(): app = QApplication(sys.argv) app.setStyle('Fusion') window = MainWindow() window.show() sys.exit(app.exec())if __name__ == "__main__": main()
最终将所有的excel成绩表里的成绩填充到对应word通知书里并以来Ai自动生成班主任寄语,完美实现了既定的需求...
通过上面Python自动化脚本,仅用几分钟的时间就完成原需手动操作数小时的工作任务。从最初准备手动人工机械操作的麻木到用python实现高效自动化的畅快,工作效率获得指数级提升,终于实现了不加班熬夜的自由!
大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。
当Python遇见办公,牛马打工人终于笑出了猪叫声
【职场人必看】每天早上一睁眼,想到又要面对:
1.📊 堆积如山的Excel表格
2.📑 机械重复的复制粘贴
3.✍️ 永远改不完的各类文档
4.诸如此类的更多........
是不是连Ctrl+Alt+Delete的心都有了?
别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!
友情提示:考虑到没有python环境的朋友需要打包好的成品exe,摸鱼早已贴心打包好,本篇文章代码打包的exe截图如下:
另外,《码海听潮》公众号所有文章码和exe程序已打包好上传绿联nas私有云,有需要的大佬扫一扫上面博主的个人微信二维码,需要的大佬需支付9.9元永久拥有公众号资源(写原创干货费时费力,属实不易),邀请您进入社区群获取下载链接!!,群内提供python办公自动化交流问题,解决问题,且码海听潮微信公众号文章发布会第一时间会更新到群里,非诚勿扰哈!