使用python读取EXCEL放假日历并制作订阅文件

文章介绍了如何使用Python读取Excel中的节假日信息,自动生成ICS格式的日历订阅文件,供用户在iOS或其他设备上添加到日历。作者分享了源代码和示例文件,提供了一种简便的方法来管理个人节日提醒。
摘要由CSDN通过智能技术生成

前言

        不想升级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打开地址,右上角“添加全部”可以添加到日历中,就成功啦!

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值