本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
以下文章來源于Python實用寶典 ,作者Python實用寶典
給自己10分鐘(滑稽),python回你一個智慧與美貌并存的備忘小神器 相信它會給你帶來不少方便(滑稽)
一、環境說明
開始之前,當然要跟小伙伴們交代一下運行環境咯
我們使用的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, Side from openpyxl.utils import get_column_letter from openpyxl.drawing.image import Image import openpyxl import calendar def 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 =https://www.cnblogs.com/hhh188764/p/= 0: value = '' sheet.cell(row=j + 4 + count, column=k + 2).value =https://www.cnblogs.com/hhh188764/p/ 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 =https://www.cnblogs.com/hhh188764/p/ 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 =https://www.cnblogs.com/hhh188764/p/ 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 def 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 =https://www.cnblogs.com/hhh188764/p/ 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 = https://www.cnblogs.com/hhh188764/p/'2019' sheet.cell(row=2, column=8).font = Font(u'微軟雅黑', size=30, color=year_color) sheet.cell(row=2, column=2).value = https://www.cnblogs.com/hhh188764/p/str(i) + '月' sheet.cell(row=2, column=2).font = Font(u'微軟雅黑', size=25, color=month_color) sheet.row_dimensions[2].height = 35 def 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', '面試')
三、運行代碼
終于到了激動人心的運行代碼部分了,運行這份代碼,你只需要把你想要的圖片變數名改一下即可,即imgs. 然后在本地cmd/terminal運行:
會自動生成一個Excel表格叫my_calendary.xlsx. 怎樣從里面把日歷提取成圖片呢?很簡單,復制拉取你想要的部分,粘貼到聊天視窗就能變成一個圖片!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39736.html
標籤:Python
