溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用Python+Excel制作精美壁紙日歷

發(fā)布時(shí)間:2021-07-28 21:13:36 來(lái)源:億速云 閱讀:152 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“怎么用Python+Excel制作精美壁紙日歷”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、環(huán)境說(shuō)明

開始之前,當(dāng)然要跟小伙伴們交代一下運(yùn)行環(huán)境咯

我們使用的python版本為 Python3.6,需要使用到的包為 openpyxl 及calendar,后者是python自帶的,而前者則需要小伙伴們打開Cmd/Terminal,運(yùn)行以下指令安裝,如果你還沒有安裝python,請(qǐng)看這篇文章:

pip install openpyxl

安裝完成后我們就可以正式開始啦!

二、代碼說(shuō)明

我們會(huì)給大家先講解一些細(xì)節(jié)的東西,等大家都理解明白了原理,最后會(huì)獻(xiàn)上完整的源代碼~

1. 首先,繪制一份日歷,我們得先知道每個(gè)月份有多少天,每天都是星期幾,我們使用calendar包獲得這些信息:

calendar.monthcalendar(2019, i)

通過(guò)這個(gè)函數(shù),我們能得到 2019年i月的日歷,它類似一個(gè)j*k的矩陣,因此我們可以這樣遍歷得到每一個(gè)日期:

    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. 其次,我們?cè)趺礃?strong>繪制得到日歷呢?

openpyxl包給予了我們答案,最方便的做法是我們先將日歷繪制到Excel中,然后再?gòu)腅xcel中提取圖片出來(lái)。openpyxl怎么用?給大家一個(gè)設(shè)置單元格字體的例子:

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

sheet是對(duì)應(yīng)的表格,row和column就是某個(gè)單元格的位置,然后對(duì)font屬性進(jìn)行設(shè)置,調(diào)用Font類并設(shè)置參數(shù),如果大家不知道Font類有什么參數(shù),可以參考o(jì)penpyxl官方文檔:https://openpyxl.readthedocs.io/en/stable/,你可以看到里面大部分單元格的屬性都是這樣設(shè)置的,非常簡(jiǎn)單。

3. 我們的作品是每個(gè)月份都有一個(gè)圖在旁邊做裝飾,其添加方法如下:

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是每個(gè)圖的相對(duì)路徑,如12/1.jpg 是名字為12的文件夾下的1.jpg. 圖像路徑要導(dǎo)入到openpyxl的Image對(duì)象中: img=Image('12/1.jpg'),然后將該變量放置到某個(gè)單元格上:sheet.add_image(img, 'J2).

這樣看你可能會(huì)有點(diǎn)糊涂, i-1是哪里來(lái)的?sheet是哪里來(lái)的?沒關(guān)系,其實(shí)是因?yàn)橹v解的時(shí)候只能給大家獻(xiàn)上部分代碼,看完下面的完整代碼你們就懂啦:

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 用來(lái)設(shè)定單元格背景色,交替進(jìn)行
    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值變?yōu)榭罩?
            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
                # 單元格文字設(shè)置,右對(duì)齊,垂直居中

            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

            # 提取當(dāng)天所有事件
            text = ''
            for t in flex_text:
                if int(t['day']) == value and int(t['month']) == i:
                    print(t)
                    text = text + t['text']+'\n'

            # 設(shè)置事件信息
            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 設(shè)置單元格可包含多行字符
                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):
    # 設(shè)置星期欄
    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
    # 單元格填充色屬性設(shè)置
    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)
        # 設(shè)置列寬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 = 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'
        # 單數(shù)顏色
        d_color = 'A5E1E0'
        # 雙數(shù)顏色
        
        # 單元格的背景色
        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)
        # 設(shè)定月份的值,參數(shù):月份, 表, 邊框顏色

        set_week_line(sheet, BorderCorlor, workday_color, otherday_color, text_color_week)
        # 設(shè)定星期欄

        set_month_year(i, sheet, year_color, month_color)
        # 設(shè)定年份和月份的格式

        # 設(shè)置日歷主體行高
        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']
# 每個(gè)月的圖片

set_information('2019-12-1', '考試')
set_information('2019-12-1', '約會(huì)')
# 需要添加的信息

get_month_xlsx(wb, imgs, flex_text)
# 得到文檔

wb.save('my_calendary.xlsx')
# 保存文檔

4. 我們還有一個(gè)神秘功能

差點(diǎn)忘了告訴大家了,我們的日歷能支持備注哦,在調(diào)用get_month_xlsx得到文檔前,通過(guò)set_information()放入你某一天想做的事情即可。如:

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

怎么用Python+Excel制作精美壁紙日歷

“怎么用Python+Excel制作精美壁紙日歷”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI