我幫公司財務寫了個「羣發工資條」的Python指令碼

2020-08-12 18:59:20

作者 | 黃偉呢

來源 | 數據分析與統計學之美

介紹

這是一個很好的Python自動化的案例。對於小公司,採用手動方式一個個發送郵件還是可以的。如果一個上百號,上千號,或者更大規模的公司,我們再一個個發送工資條郵件,就太浪費時間了。鑑於此,我寫了一個這樣的程式,實現Python自動化羣發工資條的功能。

原始數據源如下:

最終效果如下:

看到這裏,你肯定也覺得很好玩兒吧?那麼這樣一個自動化程式,應該怎麼做呢?接着往下看。


流程分析

其實這樣一個程式碼,總結下來,就只有如下5步:
① 匯入相關模組;
② 讀取Excel表格;
③ 登錄郵箱;
④ 準備要發送的郵件正文;
⑤ 發送郵件;

1)匯入相關模組

from openpyxl import load_workbook    # 用於操作Excel的模組
import yagmail   # 用於儲存郵箱地址和密碼的模組
import keyring   # 用於記錄你郵箱地址和密碼的模組
from datetime import *   # 用於獲取當前系統時間的模組

2)讀取Excel表格

# 載入Excel檔案
wb = load_workbook("羣發工資條.xlsx",data_only=True)
sheet = wb.active
print(sheet)
-------------------------------------------------------
for row in sheet:
    row_text = ""
    for cell in row:
        if cell.column == "B":
            continue
        row_text += f"{cell.value},"
    print(row_text)
------------------------------------------------------
print("年:", date.today().year)
print("月:", date.today().month)
print(f"{date.today().year}-{date.today().month}月")

結果如下:

3)登錄郵箱

yagmail.register("[email protected]","flmyucvntuvbjbcb")
pwd = keyring.get_password("yagmail","[email protected]")
yag = yagmail.SMTP(user="[email protected]",host="smtp.qq.com",password=pwd)

需要注意的是:第一行程式碼是用於儲存你的郵件地址和密碼。第二行程式碼使用keyring是爲了記錄你的郵件地址和密碼。第三行程式碼直接登錄郵箱。

關於Python怎麼發送郵件,我之前寫了一篇文章,進行了詳細的介紹,下方是這篇文章的鏈接,大家可以參考。

Python發郵件:http://suo.im/60ylZ1

4)準備要發送的正文

由於發送的正文裏面,需要我們發送一個帶表格的郵件,這就有必要我們瞭解一點前端知識。因此,我在最後面花一個章節爲大家講解。

5)發送郵件

yag.send(f"{email}",f"數據分析與統計學之美有限公司{date.today().year}-{date.today().month}月工資情況",contents)

上述程式碼共有3個參數:第一個參數是收件人的郵箱;第二個參數是郵件的標題;第三個參數是發送的內容。


關於html程式碼的特別說明

會用Python發送郵件的人都知道,郵件正文內容可以寫html程式碼。你可能覺得自己啥也不會,但是不用擔心,我們不需要學習太高深的前端程式碼,做過爬蟲的人耳濡目染,都能夠看懂一些。

1)自己寫一個簡單的前端程式碼

我們可以直接用Pycharm建立一個新的html檔案,裏面會顯示初始的前端程式碼,我們進行簡單的新增,就可以獲得一個表格啦!

最終在瀏覽器中顯示效果如下:

從上圖中根本看不出這是一個表格,那是因爲我們沒有爲它設定一個樣式,下面 下麪要做的就是爲表格設定樣式

最終在瀏覽器中顯示效果如下:

2)在Python中怎麼寫前端程式碼

從上圖可以看出,整個前端程式碼就是用一些列的標籤組成,同時標籤都是成對出現的。因此,在Python中寫前端程式碼時,只需要在對應位置新增對應的標籤即可。

for row in sheet:
    row_text = "<tr>"
    for cell in row:
        if cell.column == "B":
            continue
        row_text += f"<td>{cell.value}</td>"
    row_text += "</tr>"
    print("\n")
    print(row_text)

結果如下:

完整程式碼

完整程式碼獲取:https://pan.baidu.com/s/1oE18u7deeztHCGPIApaVkA

提取碼:3wd1




推薦閱讀