千家信息网

怎么用Python+Excel制作精美壁纸日历

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"怎么用Python+Excel制作精美壁纸日历"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学
千家信息网最后更新 2026年11月02日怎么用Python+Excel制作精美壁纸日历

本篇内容介绍了"怎么用Python+Excel制作精美壁纸日历"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、环境说明

开始之前,当然要跟小伙伴们交代一下运行环境咯

我们使用的python版本为 Python3.6,需要使用到的包为 openpyxl 及calendar,后者是python自带的,而前者则需要小伙伴们打开Cmd/Terminal,运行以下指令安装,如果你还没有安装python,请看这篇文章:

pip install openpyxl

安装完成后我们就可以正式开始啦!

二、代码说明

我们会给大家先讲解一些细节的东西,等大家都理解明白了原理,最后会献上完整的源代码~

1. 首先,绘制一份日历,我们得先知道每个月份有多少天,每天都是星期几,我们使用calendar包获得这些信息:

calendar.monthcalendar(2019, i)

通过这个函数,我们能得到 2019年i月的日历,它类似一个j*k的矩阵,因此我们可以这样遍历得到每一个日期:

    for j in range(len(calendar.monthcalendar(2019, i))):        for k in range(len(calendar.monthcalendar(2019, i)[j])):            value = calendar.monthcalendar(2019, i)[j][k]

2. 其次,我们怎么样绘制得到日历呢?

openpyxl包给予了我们答案,最方便的做法是我们先将日历绘制到Excel中,然后再从Excel中提取图片出来。openpyxl怎么用?给大家一个设置单元格字体的例子:

sheet.cell(row=j + 4 + count, column=k + 2).font = Font(u'微软雅黑', color=text_color , size=14)

sheet是对应的表格,row和column就是某个单元格的位置,然后对font属性进行设置,调用Font类并设置参数,如果大家不知道Font类有什么参数,可以参考openpyxl官方文档:https://openpyxl.readthedocs.io/en/stable/,你可以看到里面大部分单元格的属性都是这样设置的,非常简单。

3. 我们的作品是每个月份都有一个图在旁边做装饰,其添加方法如下:

imgs = ['12/1.jpg','12/2.jpg','12/3.jpg','12/4.jpg','12/5.jpg','12/6.jpg','12/7.jpg','12/8.jpg','12/9.jpg','12/10.jpg','12/11.jpg','12/12.jpg']img = Image(imgs[i-1])        sheet.add_image(img, 'J2')

imgs是每个图的相对路径,如12/1.jpg 是名字为12的文件夹下的1.jpg. 图像路径要导入到openpyxl的Image对象中: img=Image('12/1.jpg'),然后将该变量放置到某个单元格上:sheet.add_image(img, 'J2).

这样看你可能会有点糊涂, i-1是哪里来的?sheet是哪里来的?没关系,其实是因为讲解的时候只能给大家献上部分代码,看完下面的完整代码你们就懂啦:

from openpyxl.styles import Alignment, PatternFill, Font, Border, Sidefrom openpyxl.utils import get_column_letterfrom openpyxl.drawing.image import Imageimport openpyxlimport calendardef set_information(date, text):    t = {}    t['month'] = date.split('-')[1]    t['day'] = date.split('-')[2]    t['text'] = text    flex_text.append(t)def set_month_value(i, sheet, border_color, text_color, color_one, color_two):    # i: 月份    # sheet: 该月份的excel    # border_color: 边框颜色    count = 0    # render_color 用来设定单元格背景色,交替进行    render_color_1 = 1    render_color_2 = 0    for j in range(len(calendar.monthcalendar(2019, i))):        for k in range(len(calendar.monthcalendar(2019, i)[j])):            value = calendar.monthcalendar(2019, i)[j][k]            # 将0值变为空值            bd = Border(right=Side(color=border_color, style='thick'),                        top=Side(color=border_color, style='thick'),                        left=Side(color=border_color, style='thick'))            right_bd = Border(right=Side(color=border_color, style='thick'),                              left=Side(color=border_color, style='thick'),                              bottom=Side(color=border_color, style='thick'))                        if value == 0:                value = ''                sheet.cell(row=j + 4 + count, column=k + 2).value = value                sheet.cell(row=j + 4 + count, column=k + 2).border = bd                sheet.cell(row=j + 5 + count, column=k + 2).border = right_bd            else:                sheet.cell(row=j + 4 + count, column=k + 2).value = value                sheet.cell(row=j + 4 + count, column=k + 2).border = bd                sheet.cell(row=j + 4 + count, column=k + 2).font = Font(u'微软雅黑', color=text_color , size=14)                sheet.cell(row=j + 5 + count, column=k + 2).border = right_bd                # 单元格文字设置,右对齐,垂直居中            if render_color_1 > render_color_2:                sheet.cell(row=j + 4 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_one)                sheet.cell(row=j + 5 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_one)                render_color_2 += 1            else:                sheet.cell(row=j + 4 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_two)                sheet.cell(row=j + 5 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_two)                render_color_1 += 1            # 提取当天所有事件            text = ''            for t in flex_text:                if int(t['day']) == value and int(t['month']) == i:                    print(t)                    text = text + t['text']+'\n'            # 设置事件信息            if text != '':                sheet.cell(row=j + 5 + count, column=k + 2).value = text                sheet.cell(row=j + 5 + count, column=k + 2).font = Font(u'宋体',color=text_color, size=13)                align = Alignment(horizontal='right', vertical='center', wrapText=True)                # wrapText 设置单元格可包含多行字符                sheet.cell(row=j + 5 + count, column=k + 2).alignment = align        count += 1def set_week_line(sheet, border_color, workday_color, otherday_color, text_color):    # 设置星期栏    align = Alignment(horizontal='center', vertical='center')    days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']    bd_day = Border(right=Side(color=border_color, style='thick'),                       top=Side(color=border_color, style='thick'),                      left=Side(color=border_color, style='thick'))    num = 0    # 单元格填充色属性设置    for day in range(2, 9):        sheet.cell(row=3, column=day).value = days[num]        sheet.cell(row=3, column=day).alignment = align        sheet.cell(row=3, column=day).border = bd_day        sheet.cell(row=3, column=day).font = Font(u'微软雅黑', color=text_color, bold=True , size=12)        # 设置列宽12        c_char = get_column_letter(day)        sheet.column_dimensions[get_column_letter(day)].width = 12        # 行高27        sheet.row_dimensions[day].height = 27        num += 1        if day == 2 or day == 8:            for r in range(3, 14):                sheet.cell(row=r, column=day).fill = PatternFill("solid", fgColor=otherday_color)        else:            sheet.cell(row=3, column=day).fill = PatternFill("solid", fgColor=workday_color)def set_month_year(i, sheet, year_color, month_color):    # 添加年份及月份    sheet.cell(row=2, column=8).value = '2019'    sheet.cell(row=2, column=8).font = Font(u'微软雅黑', size=30, color=year_color)    sheet.cell(row=2, column=2).value = str(i) + '月'    sheet.cell(row=2, column=2).font = Font(u'微软雅黑', size=25, color=month_color)    sheet.row_dimensions[2].height = 35def get_month_xlsx(wb, imgs, flex_text):    for i in range(1, 13):        sheet = wb.create_sheet(index=0, title=str(i) + '月')        # 添加工作表        text_color = '000000'        # 日历文字颜色        text_color_week = '000000'        # 星期栏文字颜色        BorderCorlor = 'B7E0E8'        # 边框颜色        backgroundColor = 'FFFFFF'        # 背景颜色        workday_color = 'CBEEEE'        # 工作日背景颜色        otherday_color = '7FD4D2'        # 其他日背景颜色        year_color = '000000'        # 年份颜色        month_color = '000000'        # 月份颜色        s_color = 'CBEEEE'        # 单数颜色        d_color = 'A5E1E0'        # 双数颜色                # 单元格的背景色        for k1 in range(1, 15):            for k2 in range(1, 16):                sheet.cell(row=k1, column=k2).fill = PatternFill("solid", fgColor=backgroundColor)        set_month_value(i, sheet, BorderCorlor, text_color, s_color, d_color)        # 设定月份的值,参数:月份, 表, 边框颜色        set_week_line(sheet, BorderCorlor, workday_color, otherday_color, text_color_week)        # 设定星期栏        set_month_year(i, sheet, year_color, month_color)        # 设定年份和月份的格式        # 设置日历主体行高        for row in range(3, 19):            if row % 2 == 0 or row == 3:                sheet.row_dimensions[row].height = 28            else:                sheet.row_dimensions[row].height = 56        # 合并单元格        sheet.merge_cells('I1:P14')        # 添加图片        img = Image(imgs[i-1])        sheet.add_image(img, 'J2')        # 添加二维码        img = Image('2.png')        sheet.add_image(img, 'O2')calendar.setfirstweekday(firstweekday=6)wb = openpyxl.Workbook()flex_text = []imgs = ['12/1.jpg','12/2.jpg','12/3.jpg','12/4.jpg','12/5.jpg','12/6.jpg','12/7.jpg','12/8.jpg','12/9.jpg','12/10.jpg','12/11.jpg','12/12.jpg']# 每个月的图片set_information('2019-12-1', '考试')set_information('2019-12-1', '约会')# 需要添加的信息get_month_xlsx(wb, imgs, flex_text)# 得到文档wb.save('my_calendary.xlsx')# 保存文档

4. 我们还有一个神秘功能

差点忘了告诉大家了,我们的日历能支持备注哦,在调用get_month_xlsx得到文档前,通过set_information()放入你某一天想做的事情即可。如:

set_information('2019-12-5', '面试')

"怎么用Python+Excel制作精美壁纸日历"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

颜色 星期 单元 日历 月份 背景 微软 文档 代码 信息 参数 图片 属性 年份 文字 边框 精美 壁纸 精美壁纸 制作 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 西安纸贵互联网科技有限公司 中关村互联网科技集团 广州百单互联网科技有限公司 科技互联网公司装修 互联网科技金融 金融科技 互联网金融 广州宏创互联网科技 唐信互联网科技 大连 大白互联网科技 卓越科技互联网 招聘 互联网公司会议桌创意科技软装饰 南山科技园互联网公司有哪些 湖南诚度互联网科技有限公司 互联网校园科技培训 黑云互联网科技有限公司 35岁以上互联网科技行业 抖集互联网科技技术咨询 中国科技和美国互联网 张家口科技产业互联网平台 求路客互联网科技电话 互联网是第几次科技革命的成果 互联网科技工作委员会主任 互联网科技公司官网 易通互联网络科技有限公司 银川新华互联网科技学校地址 互联网公司科技股 崇明区互联网教育科技售后服务 高科技互联网发展前景如何 珠海东科互联网科技有限公司 上海万顺科技互联网有限公司招聘
0