吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 513|回复: 10
收起左侧

[资源求助] 大佬帮忙找个值班表生成工具或者excel

[复制链接]
gqc58 发表于 2024-9-10 15:50
40吾爱币
我们单位的工作性质是一年365天天都有人要值班,目前我们值班是9个人,后续可能增加或者减少
目前我们是按照周内,周末,和节假日三种循环方式9人进行值班,这样算是比较公平吧!
一般情况下一天都是指定一人,偶尔因为特殊活动周内,周末,节假日可能需要两个人,如果两个人后面就整体向前移


有没有相关的工具或者excel表格类型的,直接生成值班表?

最佳答案

查看完整内容

脚本已经写好了[mw_shl_code=python,true]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() # 创建 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

liming2333 发表于 2024-9-10 15:50
gqc58 发表于 2024-9-18 08:18
法定节假日,比如9个人值班,国庆节7天,需要7个人值班,前7个人值完,下一个法定节假日到了元旦,第八人 ...

脚本已经写好了
[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()
cayuer 发表于 2024-9-10 15:56
 楼主| gqc58 发表于 2024-9-10 16:02
cayuer 发表于 2024-9-10 15:56
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1957787&highlight=%C5%C5%B0%E0
楼主可以看看吾友 ...

这个我都下下来试过了,实现不了
liming2333 发表于 2024-9-11 01:21
值班的轮换逻辑是什么
dazuyishi1314 发表于 2024-9-11 12:40
得一个个排吧
 楼主| gqc58 发表于 2024-9-11 14:47
liming2333 发表于 2024-9-11 01:21
值班的轮换逻辑是什么

就3个大循环值班,周内一个循环,周末一个循环,法定节假日一个循环,来回就是这几个人值班,这样没个人一年内周末和节假日大家值班数量就基本一致,相对比较公平
liming2333 发表于 2024-9-12 09:36
gqc58 发表于 2024-9-11 14:47
就3个大循环值班,周内一个循环,周末一个循环,法定节假日一个循环,来回就是这几个人值班,这样没个人 ...

法定节假日怎么循环,另外轮换逻辑说具体一点,几个人值多少天班。
如果不太麻烦的话我可以写一个小脚本直接生成值班表。
Cristy 发表于 2024-9-12 12:04
值班表生成器
试试
https://www.123pan.com/s/XxfSVv-3oF4?提取码:pk4M
 楼主| gqc58 发表于 2024-9-18 08:18
liming2333 发表于 2024-9-12 09:36
法定节假日怎么循环,另外轮换逻辑说具体一点,几个人值多少天班。
如果不太麻烦的话我可以写一个小脚本 ...

法定节假日,比如9个人值班,国庆节7天,需要7个人值班,前7个人值完,下一个法定节假日到了元旦,第八人开始值元旦第一天,第九个人开始元旦第二天,第一个人值元旦第三天,大概就是这个样子,这样不管是周内,星期,还是法定,大家值班数量是一致的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 21:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表