效果展示:校历日期显示带月份

背景需求: 

     每学期初我们都会使用到网上的校历,便于进行周计划制作、各类安全记录本填写等。

python 自动排课表 python 排班表_python 自动排课表

python 自动排课表 python 排班表_windows_02

 存在问题:

1.全局看日历上,每行每列都是单独的数字(“日”), 在使用时无法马上判定这个数字是几月份的。需要向上查找月份。

2.单独看周次,一行的数字无法判定属于几月份。需要查找1日,才能知道它是几号。

因此,我希望有校历上日期的显示方式不是”D“(7),而是“MM/DD"(11/07)

代码设计:

通过代码拼拼接。我实现了想要的结果。

# 
import datetime
import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook

start=input('本学期开始的日期,输入样例(2022-09-01)\n')
end=input('本学期结束的日期,输入样例(2023-01-17)\n')
begin=int(input('开始日期前空几(周1周2周3 一共3天)\n'))
last=int(input('结束日期后留几天空白(建议7天)\n'))
weeksday=int(input('本学期共有几周(如21周)\n'))


print('------------第1步:生成年月日列表(前后有空日)------------')

def date_generate(start_date, end_date):
    # print(f'Hi, {start_date}, {end_date}')
    start_dt = datetime.datetime.strptime(start_date, "%Y-%m-%d")
    end_dt = datetime.datetime.strptime(end_date, "%Y-%m-%d")
    next_dt = start_dt

    date_list = []
    for x in range(begin):        # 日期开始前加几个空值,替代8月29日8月30日8月31日
        b=''
        date_list.append(b)
    print(date_list)  

    while next_dt <= end_dt:
        # next_dt_str = next_dt.strftime("%Y-%m-%d")
        next_dt_str = next_dt.strftime("%m/%d")
        # print(next_dt_str)
        date_list.append(next_dt_str)
        next_dt = next_dt + datetime.timedelta(days=1)

    print(date_list)
    
    for x in range(last):        # 日期结束后加几个空值,以免重新开始选取
        b=''
        date_list.append(b)
    print(date_list)       #生成全部需要的列表 ['', '', '', '2022-09-01', '2022-09-02', '2022-09-03', '2022-09-04', '2022-09-05', '2022-09-06', '2022-09-07', '2022-09-08', '2022-09-09', '2022-09-10', '2022-09-11', '2022-09-12', '2022-09-13', '2022-09-14', '2022-09-15', '2022-09-16', '2022-09-17', '2022-09-18', '2022-09-19', '2022-09-20', '2022-09-21', '2022-09-22', '2022-09-23', '2022-09-24', '2022-09-25', '2022-09-26', '2022-09-27', '2022-09-28', '2022-09-29', '2022-09-30', '2022-10-01', '2022-10-02', '2022-10-03', '2022-10-04', '2022-10-05', '2022-10-06', '2022-10-07', '2022-10-08', '2022-10-09', '2022-10-10', '2022-10-11', '2022-10-12', '2022-10-13', '2022-10-14', '2022-10-15', '2022-10-16', '2022-10-17', '2022-10-18', '2022-10-19', '2022-10-20', '2022-10-21', '2022-10-22', '2022-10-23', '2022-10-24', '2022-10-25', '2022-10-26', '2022-10-27', '2022-10-28', '2022-10-29', '2022-10-30', '2022-10-31', '2022-11-01', '2022-11-02', '2022-11-03', '2022-11-04', '2022-11-05', '2022-11-06', '2022-11-07', '2022-11-08', '2022-11-09', '2022-11-10', '2022-11-11', '2022-11-12', '2022-11-13', '2022-11-14', '2022-11-15', '2022-11-16', '2022-11-17', '2022-11-18', '2022-11-19', '2022-11-20', '2022-11-21', '2022-11-22', '2022-11-23', '2022-11-24', '2022-11-25', '2022-11-26', '2022-11-27', '2022-11-28', '2022-11-29', '2022-11-30', '2022-12-01', '2022-12-02', '2022-12-03', '2022-12-04', '2022-12-05', '2022-12-06', '2022-12-07', '2022-12-08', '2022-12-09', '2022-12-10', '2022-12-11', '2022-12-12', '2022-12-13', '2022-12-14', '2022-12-15', '2022-12-16', '2022-12-17', '2022-12-18', '2022-12-19', '2022-12-20', '2022-12-21', '2022-12-22', '2022-12-23', '2022-12-24', '2022-12-25', '2022-12-26', '2022-12-27', '2022-12-28', '2022-12-29', '2022-12-30', '2022-12-31', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13', '2023-01-14', '2023-01-15', '2023-01-16', '2023-01-17', '', '', '', '', '', '', '']

 
    print('-----------第2步,每周都抽取7个日期--------')
    list2=[]# 取空列表
    # 第1周
    for i in range(0,1):#共21周这是第1周
            list1=date_list
            print(date_list[0:7]) # 第一周只有4天,周四周五周六周日,但是因为之前添加了3个空格,所以也是取0-7
            list2.append(date_list[0:7]) 
    # 第2-21周
    for i in range(1,weeksday):  #共21周    这是第2-21周  ,如果是21周,把2,21 改成2,22 
            list1=date_list[0] # 
            date_list=date_list[7:]  #  前面第一周已经提取了7个,第二周从第8个元素开始提取
            date_list.append(list1) # 
            print(date_list[0:7]) # 列表里每次提取7个
            list2.append(date_list[0:7])  
    
    print('-----------第3步,保存到excle--------')
    # 以下是xls保存
    arrlan = len(list2)# list2是终端显示的列表值2
    workbook = xlwt.Workbook()# 新建xls工作簿
    sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
    
    # 第0列 写入“第1周、第2周、第3周……第21周    
    dates=[]
    for i in range(1,weeksday+1):
        n="第{}周".format(i)    # 用遍历方法获得“第1周、第2周、第21周”字样,
        dates.append(n)          # 添加到列表    
    print(dates)        
    # print(date)

    row=1
    for d in range(0, len(dates)):
        sheet.write(row, 0, dates[d])         # 这里enumerate不能用,因为只有一列,所以就用
        row += 1    
    
    # 第0行 写入 星期一  '星期二','星期三','星期四','星期五 ,'星期六','星期日'#
    weeks = ['周次','星期一','星期二','星期三','星期四','星期五','星期六','星期日',]
    week = len(weeks) 

    col=0
    for d in range(0, len(weeks)):
        sheet.write(0,col,weeks[d])         # 因为只有一行,所以就用有两种写法(enumerate和这种)
        col+= 1  
    
    # B2 写入 date_list所有7个7个提取的日期
    row = 1
    for i in range(arrlan):
        for col,item in enumerate(list2[i],1):
                sheet.write(row,col,item)  
        row += 2   行等于
                
    try:
        workbook.save(r"D:\test\2022第一学期校历.xls")    # 新建保存 只能xls
        print('计划生成成功')
    except e:
        print('失败...')
        print(e)

# Press the green button in the gutter to run the script.
# 定义起始日期和结束日期
if __name__ == '__main__':
    start_date = "{}".format(str(start))
    end_date = "{}".format(str(end))
    date_generate(start_date, end_date)

运行后需要填写输入的值(以2022学年第1学期为例*上学期9月1日周四开学)

显示样式1——“MM/DD”

 

python 自动排课表 python 排班表_java_03

python 自动排课表 python 排班表_python 自动排课表_04

显示样式2——“YY-MM-DD”

 

python 自动排课表 python 排班表_代码设计_05

 

python 自动排课表 python 排班表_python 自动排课表_06

显示样式3——“MM-DD”

 

python 自动排课表 python 排班表_前端_07

 用同样的方法,可以制作2022学年下学期的日历表(带月份)

基本信息设置

python 自动排课表 python 排班表_代码设计_08

把周次里的”星期日“放到最前面,这样能和上表的排序一样

python 自动排课表 python 排班表_java_09

 

python 自动排课表 python 排班表_python 自动排课表_10

 20222年第二学期的校历效果

python 自动排课表 python 排班表_代码设计_11

 

 

20221010优化——周与周之间空一行,看起来不那么拥挤(代码已经调整)

python 自动排课表 python 排班表_前端_12

 

python 自动排课表 python 排班表_java_13

 感悟:

这下再也不用手动填写”志愿者安排表”、”早值班安排表”里的日期了。✌