使用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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。