python日历图_Python+Excel制作精美壁纸日历,任意DIY

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

以下文章来源于Python实用宝典 ,作者Python实用宝典

给自己10分钟(滑稽),python回你一个智慧与美貌并存的备忘小神器 相信它会给你带来不少方便(滑稽)

28fc7615-e0ff-470f-b174-f8db661eacd7

一、环境说明

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

我们使用的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 importAlignment, PatternFill, Font, Border, Sidefrom openpyxl.utils importget_column_letterfrom openpyxl.drawing.image importImageimportopenpyxlimportcalendardefset_information(date, text):

t={}

t['month'] = date.split('-')[1]

t['day'] = date.split('-')[2]

t['text'] =text

flex_text.append(t)defset_month_value(i, sheet, border_color, text_color, color_one, color_two):#i: 月份

#sheet: 该月份的excel

#border_color: 边框颜色

count =0#render_color 用来设定单元格背景色,交替进行

render_color_1 = 1render_color_2=0for 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_bdelse:

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 inflex_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+= 1

defset_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 = 27num+= 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)defset_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 = 35

defget_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', '面试')

0b47cc6ccdd449be9bd1aafd6f41385c

三、运行代码

终于到了激动人心的运行代码部分了,运行这份代码,你只需要把你想要的图片变量名改一下即可,即imgs. 然后在本地cmd/terminal运行:

会自动生成一个Excel表格叫my_calendary.xlsx. 怎样从里面把日历提取成图片呢?很简单,复制拉取你想要的部分,粘贴到聊天窗口就能变成一个图片!

7cb83b7f855942769b04987e71a5711b

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值