本文来自Python实战集:Excel+Python=精美壁纸日历任意DIY广东的太阳还是那么大,隔着玻璃都能感受到热浪。刚刚不久前的立夏(已经三个月了!!)时间不多了,行程很赶。昨天又迎来了立秋,放暑假的童靴们都忘记时间了~什么?真的忘记了吗?没关系,今天给大家带来一个简单的ExcelDIY小日历10分钟(搞笑),python还给大家一个智美兼备的备忘录神器。相信会给大家带来很多方便(滑稽)1、环境描述开始之前,当然要先给小伙伴们解释一下运行环境。我们使用的python版本是Python3.6,需要用到的包是openpyxl和calendar。后者是自带python的,而前者需要小伙伴们打开Cmd/Terminal,运行如下命令安装,如果你还没有安装python,请看这篇文章:pipinstallopenpyxl安装完成后,我们就可以正式开始了!2.代码说明我们先给大家解释一些细节。待大家明白原理后,我们将给出完整的源码~1.首先,要绘制日历,首先要知道每个月有多少天,每一天都是星期几,我们使用日历包来获取这些信息:calendar.monthcalendar(2019,i)通过这个函数,我们可以得到2019年第i个月的日历,它类似于一个j*k矩阵,所以我们可以这样遍历得到每个日期:forjinrange(len(calendar.monthcalendar(2019,i))):对于范围内的k(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'MicrosoftYahei',color=text_color,size=14)sheetis对应的table,row,column是一个单元格的位置,然后设置font属性,调用Font类并设置参数,如果不知道Font类有哪些参数,可以参考openpyxl官方文档:https://openpyxl.readthedocs.io/en/stable/,可以看到大部分cell的属性都是这样设置的,非常简单。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从哪里来?床单从哪里来?没关系,其实是因为我解释的时候只能给你部分代码。看完下面完整的代码,你就会明白:fromopenpyxl.stylesimportAlignment,PatternFill,Font,Border,Sidefromopenpyxl.utilsimportget_column_letterfromopenpyxl.drawing。图片导入Imageimportopenpyxlimportcalendardefset_information(date,text):t={}t['month']=date.split('-')[1]t['day']=date.split('-')[2]t['text']=textflex_text.append(t)defset_month_value(i,sheet,border_color,text_color,color_one,color_two):#i:month#sheet:excelofthemonth#border_color:边框颜色计数=0#render_color用于设置cell的背景色,交替渲染r_color_1=1render_color_2=0forjinrange(len(calendar.monthcalendar(2019,i))):forkinrange(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'))如果值==0:value=''sheet.cell(row=j+4+count,column=k+2).value=valuesheet.cell(row=j+4+count,column=k+2).border=bdsheet.cell(row=j+5+count,column=k+2).border=right_bd否则:sheet.cell(row=j+4+count,column=k+2).value=valuesheet.cell(row=j+4+count,column=k+2).border=bdsheet.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#设置单元字符,右匹配,垂直ifrender_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+=1else:sheet.cell(row=j+4+count,列=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=''fortinflex_text:ifint(t['day'])==valueandint(t['month'])==i:print(t)text=text+t['text']+'\\n'#设置事件信息iftext!='':sheet.cell(row=j+5+count,column=k+2).value=textsheet.cell(row=j+5+count,column=k+2).font=Font(u'宋体',color=text_color,size=13)align=Alignment(horizo??ntal='right',vertical='center',wrapText=True)#wrapText设置单元格即可包含多行字符sheet.cell(row=j+5+count,column=k+2).alignment=aligncount+=1defset_week_line(sheet,border_color,workday_color,otherday_color,text_color):#设置周列align=Alignment(horizo??ntal='center',vertical='center')days=['周日','周一','周二','周三','周四','周五','周六']bd_day=Border(right=Side(color=border_color,style='粗'),top=Side(color=border_color,style='thick'),left=Side(color=border_color,style='thick'))num=0#单元格填充颜色属性设置fordayinrange(2,9):sheet.cell(row=3、column=day).value=days[num]sheet.cell(row=3,column=day).alignment=alignsheet.cell(row=3,column=day).border=bd_daysheet.cell(row=3,column=day).font=Font(u'微软雅黑',color=text_color,bold=True,size=12)#设置列宽12c_char=get_column_letter(day)sheet.column_dimensions[get_column_letter(day).width=12#行高27sheet.row_dimensions[day].height=27num+=1ifday==2orday==8:forrinrange(3,14):sheet.cell(row=r,column=day).fill=PatternFill("solid",fgColor=otherday_color)其他: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)+'month'sheet.cell(row=2,column=2).font=Font(u'微软雅黑',size=25,color=month_color)sheet.row_dimensions[2].height=35defget_month_xlsx(wb,imgs,flex_text):foriinrange(1,13):sheet=wb.create_sheet(index=0,title=str(i)+'month')#添加工作表text_color='000000'#日历文本颜色text_color_week='000000'#周栏文本颜色BorderCorlor='B7E0E8'#边框颜色backgroundColor='FFFFFF'#背景颜色workday_color='CBEEEE'#工作日背景颜色otherday_color='7FD4D2'#其他daybackgroundcoloryear_color='000000'#Yearcolormonth_color='000000'#Monthcolors_color='CBEEEE'#Singularcolord_color='A5E1E0'#Evencolor#cellbackgroundcolorfork1inrange(1,15):对于k2在范围(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)#设置月份的值,参数:月份,Table,bordercolorset_week_line(sheet,BorderCorlor,workday_color,otherday_color,text_color_week)#设置星期列set_month_year(i,sheet,year_color,month_color)#设置年月的格式#设置行的日历主体行高inrange(3,19):ifrow%2==0orrow==3:sheet.row_dimensions[row].height=28else: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']#每个月图片集_信息('2019-12-1','Exam')set_information('2019-12-1','Appointment')#需要添加的信息get_month_xlsx(wb,imgs,flex_text)#获取文档wb.save('my_calendary.xlsx')#保存文档4.我们还有一个神秘的功能,我差点忘了告诉你。我们的日历可以支持笔记。在调用get_month_xlsx获取文档之前,通过set_information()放入你想在某一天做的事情可以如下:set_information('2019-12-5','interview')3.运行代码终于来了到运行代码的激动人心的部分。运行这段代码,你只需要把你想要的图片的变量名改一下就行了,也就是imgs。然后在本地cmd/terminal运行:python这段代码的文件名(funny.py会自动生成一个Excel表格,名字叫my_calendary.xlsx。如何从里面把日历提取成图片?很简单,复制拉取部分想要的话,粘贴到聊天窗口里就变成图片了!源码里有12张图片,希望大家喜欢!下载地址:https://pythondict.com/wp-content/uploads/2019/08/2019080909262065.zip可以根据自己的喜好自行设置背景色、边框色、交替色和图片,去掉这个烦人又漂亮的二维码,如果你看过评论或者没看懂,欢迎关注在下方留言区讨论,我们会抽空回复~Python实战宝典(pythondict.com)不只是收藏,欢迎关注公众号:Python实战宝典
