Python生成日历导出Excel

python 复制代码
import openpyxl
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill, NamedStyle
from openpyxl.utils import get_column_letter
from datetime import datetime, date, timedelta
from calendar import monthcalendar, month_abbr
import holidays
import os
# 创建中国节假日对象
cn_holidays = holidays.CN(years=2025)

# 创建工作簿
wb = openpyxl.Workbook()
wb.remove(wb.active)  # 删除默认sheet

# 定义样式
header_style = NamedStyle(name="header_style")
header_style.font = Font(bold=True, color="FFFFFF", size=12)
header_style.fill = PatternFill(start_color="4472C4", fill_type="solid")
header_style.alignment = Alignment(horizontal="center", vertical="center")
header_style.border = Border(left=Side(style='thin'), right=Side(style='thin'),
                             top=Side(style='thin'), bottom=Side(style='thin'))

weekend_style = NamedStyle(name="weekend_style")
weekend_style.font = Font(color="FF0000", bold=True)
weekend_style.fill = PatternFill(start_color="F2F2F2", fill_type="solid")

holiday_style = NamedStyle(name="holiday_style")
holiday_style.font = Font(color="FF0000", bold=True)
holiday_style.fill = PatternFill(start_color="FFF2CC", fill_type="solid")

normal_day_style = NamedStyle(name="normal_day_style")
normal_day_style.alignment = Alignment(horizontal="center", vertical="center")
normal_day_style.border = Border(left=Side(style='thin'), right=Side(style='thin'),
                                 top=Side(style='thin'), bottom=Side(style='thin'))

# 添加样式到工作簿
wb.add_named_style(header_style)
wb.add_named_style(weekend_style)
wb.add_named_style(holiday_style)
wb.add_named_style(normal_day_style)

# 为每个月创建日历
for month in range(1, 13):
    month_title = f"{month_abbr[month]}"
    ws = wb.create_sheet(title=month_title)

    # 设置月份标题
    ws.merge_cells('A1:G1')
    ws['A1'] = f"{month_title}"
    ws['A1'].style = header_style

    # 设置星期标题
    weekdays = ["一", "二", "三", "四", "五", "六", "日"]
    for col, day in enumerate(weekdays, start=1):
        cell = ws.cell(row=3, column=col, value=day)
        cell.style = header_style
        ws.column_dimensions[get_column_letter(col)].width = 12

    # 获取当月日历
    cal = monthcalendar(2025, month)

    # 填充日期
    for week_num, week in enumerate(cal, start=4):
        for day_num, day in enumerate(week, start=1):
            if day != 0:
                current_date = date(2025, month, day)
                cell = ws.cell(row=week_num, column=day_num, value=day)

                # 判断是否是周末
                if day_num in [6, 7]:  # 星期六、星期日
                    cell.style = weekend_style
                else:
                    cell.style = normal_day_style

                # 判断是否是节假日
                if current_date in cn_holidays:
                    cell.style = holiday_style
                    holiday_name = cn_holidays.get(current_date)
                    ws.cell(row=week_num, column=day_num, value=f"{day}\n{holiday_name}").alignment = Alignment(
                        horizontal="center", vertical="center", wrap_text=True)

    # 添加备注说明
    ws['A10'] = "图例说明:"
    ws['A11'] = "红色: 周末"
    ws['A11'].style = weekend_style
    ws['A12'] = "黄色: 法定节假日"
    ws['A12'].style = holiday_style



# 创建目标目录(如果不存在)
os.makedirs("../file", exist_ok=True)

# 保存文件到指定路径
filename = "../file/2025年日历.xlsx"
wb.save(filename)
print(f"2025年日历已生成,文件名: {filename}")
相关推荐
顾安r15 小时前
10.25 脚本 整理2024全年 GITHUB每周热门项目
linux·c语言·python·github·bash
fruge15 小时前
前端工程化流程搭建与配置优化指南
前端
CodeAmaz15 小时前
annotation-logging-guide
java·spring·log4j
毕设源码-邱学长15 小时前
【开题答辩全过程】以 二手车交易系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
东芃939416 小时前
uniapp上传blob对象到后台
前端·javascript·uni-app
梵得儿SHI16 小时前
Java IO 流深度解析:对象流与序列化机制(ObjectInputStream/ObjectOutputStream)
java·开发语言·rpc·序列化·对象流·对象与字节流的转换·java对象流
百炼成神 LV@菜哥16 小时前
记类成员变量 vs 方法中的变量
java·开发语言
新子y16 小时前
【小白笔记】 while 与 for + break 的比较分析
笔记·python
coding随想16 小时前
救命!网页还在偷偷耗电?浏览器Battery API事件教你精准控电,这5个场景用了都说香
前端
せいしゅん青春之我16 小时前
【JavaEE初阶】网络经典面试题小小结
java·网络·笔记·网络协议·tcp/ip·java-ee