效果展示:校历日期显示带月份
背景需求:
每学期初我们都会使用到网上的校历,便于进行周计划制作、各类安全记录本填写等。
存在问题:
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”
显示样式2——“YY-MM-DD”
显示样式3——“MM-DD”
用同样的方法,可以制作2022学年下学期的日历表(带月份)
基本信息设置
把周次里的”星期日“放到最前面,这样能和上表的排序一样
20222年第二学期的校历效果
20221010优化——周与周之间空一行,看起来不那么拥挤(代码已经调整)