使用python读取EXCEL放假日历并制作订阅文件
2023-12-20 16:46:19
    		前言
? ? ? ? 不想升级IOS,苦于找不到新的日历订阅url,小菜鸡百度来百度去发现ics这东西可以自己做一个,惊喜于看到了这篇文章--使用python获取日历信息并制作订阅文件_https: //github.com/lk-itween/calendar-CSDN博客
感谢作者大大。就想自己写一个,但是发现到网上去找日历也挺麻烦,然后就参照写了一个比较简单的,通过读取EXCEL节假日信息来生成ics,目前已亲测成功。
准备工作
? ? ? ? 制作一个EXCEL,记录节假日、补班和日期,内容设置纯文本格式

日历订阅文件生成
解析excel,拼接ics,生成文件,源码贴图如下。多个sheet根据sheet名生成多种日历。
#!/usr/bin/python
from datetime import datetime
import xlrd
now = datetime.now().strftime('%Y%m%dT%H:%M:%S')
# name 日历名称
def set_ics_header(name):
    return "BEGIN:VCALENDAR\n" \
           + "PRODID:NULL\n" \
           + "VERSION:2.0\n" \
           + "CALSCALE:GREGORIAN\n" \
           + "METHOD:PUBLISH\n" \
           + f"X-WR-CALNAME:{name}\n" \
           + "X-WR-TIMEZONE:Asia/Shanghai\n" \
           + f"X-WR-CALDESC:{name}\n" \
           + "BEGIN:VTIMEZONE\n" \
           + "TZID:Asia/Shanghai\n" \
           + "X-LIC-LOCATION:Asia/Shanghai\n" \
           + "BEGIN:STANDARD\n" \
           + "TZOFFSETFROM:+0800\n" \
           + "TZOFFSETTO:+0800\n" \
           + "TZNAME:CST\n" \
           + "DTSTART:19700101T000000\n" \
           + "END:STANDARD\n" \
           + "END:VTIMEZONE\n"
def set_jr_ics(jr, date, uid):  # jr: 节日,date:日期,uid:编序
    return "BEGIN:VEVENT\n" \
           + f"DTSTART;VALUE=DATE:{date}\n" \
           + f"DTEND;VALUE=DATE:{date}\n" \
           + f"DTSTAMP:{date}T000001\n" \
           + f"UID:{date}T{uid:0>6}_jr\n" \
           + f"CREATED:{date}T000001\n" \
           + f"DESCRIPTION:{jr}\n" \
           + f"LAST-MODIFIED:{now}\n" \
           + "SEQUENCE:0\n" \
           + "STATUS:CONFIRMED\n" \
           + f"SUMMARY:{jr}\n" \
           + "TRANSP:TRANSPARENT\n" \
           + "END:VEVENT\n"
def concat_ics(year, jjr_list,rq_list):  # 返回一个完整的ics文件内容
       header = set_ics_header(year)
       # 将节日进行编号,生成list转成字符串
       jr_ics=''.join(list(map(set_jr_ics, jjr_list, rq_list,list(range(len(jjr_list))))))
       return header + jr_ics + 'END:VCALENDAR'
# 保存文件
def save_ics(fname, text):
       with open(fname, 'w', encoding='utf-8') as f:
              f.write(text)
#获取excel内容和sheet
def get_xlsfile(path):
    readfile=xlrd.open_workbook(path)
    num = readfile.nsheets
    return readfile,num
def parse_jjr(table):
    name=table.name
    jjr=list(table.col_values(0))
    rq=list(map(dataformat,table.col_values(1)))
    return name,jjr,rq
def dataformat(date):
      return datetime.strptime(date, '%Y/%m/%d').strftime('%Y%m%d')
if __name__ == '__main__':
    readfile,num = get_xlsfile('F:/ICS/calendar.xls')
    for i in range(num):
        name,jjr_list,rq_list=parse_jjr(readfile.sheets()[i])
        jr_ics = concat_ics(name,jjr_list,rq_list)
        filename = f'calendar_{name}.ics'
        save_ics(filename, jr_ics)订阅日历信息
? ? ? ? 参照原文大大,把代码和ics文件上传到gitee仓库:
源码:https://gitee.com/szjungle/calendar/blob/main/calendar.py
ics:https://gitee.com/szjungle/calendar/raw/main/calendar_2024year.ics
? ? ? ? 直接到日历里添加日历订阅总是验证失败,可以换个方式,用safari打开地址,右上角“添加全部”可以添加到日历中,就成功啦!

    			文章来源:https://blog.csdn.net/zjungle/article/details/135103354
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!