网友作品 #000226 · 提交于 2026/09/14
笔试成绩整理工具:中式排名与1:3入围名单生成
★★★★☆零基础办公智能体国内其他模型python

作品简介
这是一款面向招考场景的笔试成绩整理工具:导入原始笔试成绩表后,自动完成加分、中式排名与 1:3 入围判定,一键输出「总表 / 进入面试人员 / 缺额岗位汇总」三张表格,并支持生成中文 PDF 汇总文件。
工具提供图形操作界面:选择原始成绩表与保存位置、设置入围比例与民族加分值,点击「开始处理」即可运行,处理过程写入日志区,完成后可直接打开结果文件。
内置规则包括:四少民族(蒙古族、达斡尔族、鄂伦春族、鄂温克族)按 0.25 分加分、缺考不计入排名、末位并列全部入围、入围比例不足的岗位归入缺额表。
核心亮点
- 三表一键输出:总表、进入面试人员名单、缺额岗位汇总一次生成,另附中文 PDF 汇总
- 规则可配置:入围比例(默认 1:3)、民族加分分值(默认 0.25)均可在界面调整,四少民族名单用正则匹配
- 可配置列名机制:「最大招聘人数」在不同单位的 Excel 里叫法不一,工具用「精确匹配 + 忽略空格模糊匹配」两级解析,默认支持 14 个别名,还可通过 config.json 或命令行参数指定,改列名无需动核心逻辑
- GUI 与核心逻辑解耦:代码分 7 层组织(配置、日志、读取、计算、导出、编排、界面),界面层与业务计算完全分离,便于维护扩展
- 双入口:图形界面与命令行共用同一编排入口,带日志出口与文件占用检测(Excel 被占用时自动提示)
技术与工具
- 开发语言:Python,界面层基于 tkinter,导出 xlsx 三张表与中文 PDF 汇总
- 架构设计:GUI 与核心业务逻辑完全解耦,各层只通过函数参数、返回值与共享常量耦合
- 开发方式:零基础借助办公智能体类 AI 工具完成,配置读取、列名归一化、异常兜底等细节均有交代
适用场景
- 机关事业单位招考、公务员考试的笔试成绩中式排名与 1:3 入围名单批量生成
- 企业校园招聘笔试成绩的筛选汇总
- 需要按民族加分、末位并列等规则反复核算成绩的日常办公场景
原始提交内容(点开查看,可复制全文去问 AI)
笔试成绩整理工具 · 逻辑说明 用途:将原始笔试成绩表整理为「总表 / 进入面试人员 / 缺额岗位汇总」三张表, 支持四少民族加分、1:3 入围、缺额汇总,并提供图形界面与中文 PDF 汇总。
- 整体结构(分层) 代码自上而下分为 7 层,各层只通过「函数参数 / 返回值 / 共享常量」耦合, GUI 层与核心业务逻辑完全解耦 —— 这是本程序最重要的设计约束。 层关键对象职责 配置与常量load_config、MAX_RECRUITS_NAME、DEFAULT_MAX_RECRUITS_ALIASES、resolve_max_recruits、normalize_max_col、SOURCE_SHEET/TARGET_COLS/REQUIRED_COLS/STR_COLS/GROUP_KEYS/DISPLAY_COLS/DEFAULT_SELECTED_COLS/COMPUTED_COLS把易变列名抽成可配置变量;定义列集合与分组键 日志与异常set_log_sink、log、_gui_excepthook、is_excel_open统一日志出口(控制台 + GUI);无控制台模式致命错误弹窗;文件占用检测 数据读取read_source读全部列、归一化列名、必需列校验、类型规整、记录原始列名 计算calc_scores、build_shortlist、build_gap_table加分 / 排名 / 入围判定;抽面试表;汇总缺额岗位 导出_beautify、export、preview_positions、export_pdf写三张 xlsx、处理前岗位预览、生成中文 PDF 编排run串起 ,CLI 与 GUI 共用同一入口,返回统计 dict 界面与入口build_gui、maintkinter 交互;main 按有无命令行参数分流到 GUI / CLI
- 可配置列名机制(核心设计点) 「最大招聘人数」在不同单位 Excel 里叫法不一(招聘上限 / 最大招人数 / 计划招聘总数…), 用三级解析 + 一处归一化解决,改列名只需调变量、不动核心逻辑: 配置加载(启动一次):load_config() 读同目录 config.json,失败返回 {} 不影响运行, 得到 MAX_RECRUITS_NAME 与 MAX_RECRUITS_ALIASES。 优先级:命令行/界面 –max-col > config.json > 默认「最大招聘人数」+ 14 个别名。 定位(resolve_max_recruits):先「精确(去空格)匹配」,再「忽略空格模糊匹配」,命中返回真实列名;都失败返回 None。 归一化(normalize_max_col / read_source 内):把真实列重命名为规范名 “最大招聘人数”,下游永远只认规范名。 回写原始名(df.attrs[“max_recruits_col”]):记录真实列名,供 run 把用户选中的「原始叫法」映射回规范名, 避免 CLI 用别名选列时该列被丢。