脚本已经写好了[Python] 纯文本查看 复制代码 import calendar
import json
from openpyxl import Workbook
# 加载JSON数据的辅助函数
def load_json_data(json_file_name):
with open(json_file_name, 'r', encoding='utf-8') as f:
data = json.load(f)
return data
# 创建一个日历,每个月一个sheet,并生成对应的排班表
def create_calendar(holidays, names, year):
wb = Workbook() # 创建一个新的工作簿
cal = calendar.Calendar(firstweekday=calendar.SUNDAY) # 设置日历每周第一天为周日
workday_pb = 1 # 工作日排班计数器
weekendday_pb = 1 # 周末排班计数器
holiday_pb = 1 # 节假日排班计数器
name_num = len(names) # 排班名单人数,用于循环分配
# 遍历12个月份
for month in range(1, 13):
ws = wb.create_sheet(f"{year}年 {month}月") # 创建该月的日历sheet
wspb = wb.create_sheet(f"{year}年 {month}月排班") # 创建对应月份的排班sheet
# 设置表头(周一到周日)
ws.append(['日', '一', '二', '三', '四', '五', '六'])
wspb.append(['日', '一', '二', '三', '四', '五', '六'])
# 获取当前月份的所有天数,包括前后的空白
month_days = cal.monthdays2calendar(year, month)
for week in month_days:
# 每周的数据初始化
row_data = []
pbrow_data = []
for day in week:
day_date = day[0] if day[0] else '' # 当日日期,若为0则为空白
key = f"{month}-{day_date}" # 生成日期键
cell_text = str(day_date) # 设置默认单元格文本
pbcell_text = '' # 排班单元格文本初始化
# 如果是节假日
if key in holidays:
cell_text += f"*{holidays[key]}" # 修改日历单元格文本
# 节假日排班,循环使用名单,如果到达名单末尾,重新开始
holiday_pb = holiday_pb % name_num
if holiday_pb == 0:
holiday_pb += name_num
pbcell_text = names[str(holiday_pb)]
holiday_pb += 1
# 如果是工作日
elif day[0] != 0 and day[1] < 5: # 周一至周五
workday_pb = workday_pb % name_num
if workday_pb == 0:
workday_pb += name_num
pbcell_text = names[str(workday_pb)]
workday_pb += 1
# 如果是周末
elif day[0] != 0 and day[1] >= 5: # 周六至周日
weekendday_pb = weekendday_pb % name_num
if weekendday_pb == 0:
weekendday_pb += name_num
pbcell_text = names[str(weekendday_pb)]
weekendday_pb += 1
row_data.append(cell_text) # 添加到日历行数据
pbrow_data.append(pbcell_text) # 添加到排班行数据
ws.append(row_data) # 向日历sheet中添加一周的数据
wspb.append(pbrow_data) # 向排班sheet中添加一周的数据
# 删除默认生成的Sheet
if 'Sheet' in wb.sheetnames:
wb.remove(wb['Sheet'])
return wb
# 主函数
def main():
holidays = load_json_data("holidays.json") # 加载节假日数据
names = load_json_data("names.json") # 加载排班名单数据
try:
year = int(input("请输入年份:")) # 读取用户输入的年份
wb = create_calendar(holidays, names, year) # 创建对应年份的日历和排班
# 保存到Excel文件
wb.save(f"{year}年排班表.xlsx")
except ValueError:
print("输入错误:请输入有效的年份。")
if __name__ == "__main__":
main() |