当前位置:首页>python>【Python办公】一键导出节假日标记工具

【Python办公】一键导出节假日标记工具

  • 2026-10-11 08:33:25
【Python办公】一键导出节假日标记工具

用 Python + PyQt5 打造一键导出节假日标记工具

前言

每到年初,很多做人事、行政、排班或项目管理的朋友都会需要一份当年的节假日清单——哪些天是法定假日?哪些周末因为调休需要上班?手动查日历再一个个标记,不仅繁琐还容易出错。

今天我们就用 Python + PyQt5 + chinese-calendar 库,打造一个带图形界面的「节假日标记工具」,选好年份点一下就能生成全年数据,还能一键导出 CSV 文件。

欢迎大家关注此公众号,后台留言"python书籍"可免费获取【Python办公自动化高清PDF】电子书一本

此外小庄推荐一本适合于新手\小白入手一本 Python基础书籍,欢迎大家订阅


一、效果预览

工具启动后的界面包含:

  • • 操作面板:年份下拉选择 + 生成按钮 + 导出按钮 + 进度条
  • • 数据表格:按颜色区分工作日、周末、法定假日、调休上班
  • • 运行日志:记录每次操作的时间戳和统计信息

点击「生成节假日数据」后,全年 365 天的数据秒级呈现,不同类型用不同颜色标记:

颜色
类型
浅红
法定节假日(春节、国庆等)
浅绿
周末休息
浅黄
调休上班(因假日需补班的周末)
白色
正常工作日

二、核心思路

2.1 chinese-calendar 库

chinese-calendar 是一个专门处理中国法定节假日的 Python 库,核心 API:

from chinese_calendar import is_workday, is_holiday, get_holiday_detail

# 判断某天是否为工作日(考虑调休)
is_workday(date(2026, 1, 1))  # False(元旦假期)

# 获取节假日详情,返回 (是否节假日, 节日名称)
get_holiday_detail(date(2026, 1, 1))  # (True, Holiday.new_years_day)

它已经内置了历年的调休安排,所以我们不需要手动维护数据。

2.2 日期分类逻辑

对于全年的每一天,我们按以下优先级判断类型:

不是工作日?
├─ 有节日名称 → 法定节假日
├─ 周六/周日 → 周末休息
└─ 其他 → 节假日

是工作日?
├─ 周六/周日 → 调休上班 ⚠️
└─ 周一~周五 → 正常工作日

关键点在于「调休上班」的判断:如果某天是周六或周日,但 is_workday() 返回 True,说明这天是因为法定节假日而需要补班的调休日。


三、完整代码解析

3.1 项目结构

节假日标记.py   # 全部代码在一个文件中,方便分发

依赖只有两个:

pip install PyQt5 chinese-calendar

3.2 界面样式(QSS)

我们使用 Qt 样式表(QSS)来美化界面,类似 CSS 的写法:

STYLE_SHEET = """
QPushButton {
    background-color: 
#1890ff;
    color: white;
    border: none;
    border-radius: 6px;
    padding: 8px 20px;
    font-weight: bold;
}
QPushButton:hover {
    background-color: #40a9ff;
}
QGroupBox {
    border: 1px solid #d9d9d9;
    border-radius: 8px;
    background-color: #ffffff;
}
/* ... 更多样式 */
"""

通过 app.setStyleSheet(STYLE_SHEET) 全局应用,让整个界面呈现 Ant Design 风格的蓝色主题。

3.3 后台线程(QThread)

遍历 365 天并调用 chinese_calendar API 虽然很快,但为了良好的用户体验(界面不卡顿 + 进度条反馈),我们用 QThread 放到后台执行:

classHolidayWorker(QThread):
    progress = pyqtSignal(int)       # 进度信号
    log = pyqtSignal(str)            # 日志信号
    finished_data = pyqtSignal(list) # 完成信号,传回数据

def__init__(self, year: int):
super().__init__()
self.year = year

defrun(self):
        results = []
        start = date(self.year, 1, 1)
        end = date(self.year, 12, 31)
        total_days = (end - start).days + 1

for i inrange(total_days):
            d = start + timedelta(days=i)
# ... 判断日期类型,收集到 results 中

# 每 30 天更新一次进度
if (i + 1) % 30 == 0:
self.progress.emit(int((i + 1) / total_days * 100))

self.finished_data.emit(results)

主线程只需要连接信号即可:

self.worker = HolidayWorker(year)
self.worker.progress.connect(self.progress.setValue)
self.worker.log.connect(self._log)
self.worker.finished_data.connect(self._on_data_ready)
self.worker.start()

3.4 表格渲染

数据生成后,通过 QTableWidget 展示,并对不同类型的行设置不同的背景色和文字色:

color_map = {
"法定节假日": QColor("#fff1f0"),  # 浅红
"周末休息":   QColor("#f6ffed"),  # 浅绿
"调休上班":   QColor("#fffbe6"),  # 浅黄
"正常工作日": QColor("#ffffff"),  # 白色
}

for row, item inenumerate(data):
    bg = color_map.get(item["类型"])
for col, key inenumerate(["日期", "星期", "类型", "备注"]):
        cell = QTableWidgetItem(item[key])
        cell.setBackground(bg)
self.table.setItem(row, col, cell)

3.5 CSV 导出

导出使用 csv.DictWriter,编码选 utf-8-sig 以确保 Excel 打开时中文不乱码:

withopen(path, "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.DictWriter(f, fieldnames=["日期", "星期", "类型", "备注"])
    writer.writeheader()
    writer.writerows(self.data)

四、运行方式

# 1. 安装依赖
pip install PyQt5 chinese-calendar

# 2. 运行程序
python 节假日标记.py

操作步骤

  1. 1. 启动程序后,默认选中当前年份
  2. 2. 点击「🚀 生成节假日数据」按钮
  3. 3. 等待进度条走完(通常 1-2 秒)
  4. 4. 表格中查看全年数据,不同类型有不同颜色
  5. 5. 点击「📥 导出为 CSV」按钮,选择保存路径
  6. 6. 用 Excel 打开 CSV 文件即可使用

五、扩展思路

这个工具还可以继续扩展:

  1. 1. 支持多年份批量导出:循环多个年份一次性生成
  2. 2. 导出 Excel 格式:使用 openpyxl 直接输出带颜色的 .xlsx 文件
  3. 3. 日历视图:用月历方式展示,更直观
  4. 4. 自定义假日:支持手动添加企业自定义假日(如公司年假、纪念日等)
  5. 5. 系统托盘:最小化到托盘,快速查询某天是否为假日

六、总结

本文通过一个实用的节假日标记工具,展示了以下技术要点:

技术点
用途
PyQt5
构建跨平台桌面 GUI
QSS 样式表
美化界面,类似 CSS
QThread + 信号槽
后台处理不阻塞 UI
QTableWidget
表格展示 + 颜色标记
chinese-calendar
自动判断中国节假日和调休
csv 模块
导出标准 CSV 文件

整个程序只有一个文件、两个依赖,非常适合作为日常办公小工具使用。如果你的工作中需要频繁查询节假日信息,不妨试试这个工具!

最新文章

随机文章