記賬程序2.0

程序2.0.jpg

需求背景:

為了更好的解放雙手艇挨,提高記賬效率会烙,本人想要制作一個(gè)基于python的自動(dòng)化記賬程序鞋怀,用于統(tǒng)計(jì)本人每星期、每月持搜、每年,甚至是每日的盈虧記錄焙矛,目前該程序是處于半自動(dòng)化狀態(tài)葫盼,后期會(huì)逐漸更新,爭取全套流程純自動(dòng)化村斟,不需要過多的人工參與贫导,擺脫苦哈哈記賬統(tǒng)計(jì)的耗時(shí)任務(wù)

需求總目標(biāo):

日賬目:連接常用的支付通信軟件,將自己每花費(fèi)一筆蟆盹,就自動(dòng)歸類在一個(gè)臨時(shí)存儲(chǔ)位置孩灯,然后這個(gè)臨時(shí)存儲(chǔ)位置可以用excel格式記錄存儲(chǔ),并將其下載到指定的電腦桌面位置
星期賬目:對一星期的花銷和盈收做出統(tǒng)計(jì)逾滥,并用圖的方式展示各種類花銷情況和收入情況
月賬目:對一個(gè)月(即四個(gè)星期)的花銷和盈收做出統(tǒng)計(jì)峰档,并用圖的方式展示各種類花銷情況和收入情況
年賬目:對一年(即12個(gè)月)的花銷和盈收做出統(tǒng)計(jì),并用圖的方式展示各種類花銷情況和收入情況

嘮嗑本次記賬程序2.0出現(xiàn)背景:

上次寫過一篇記賬程序1.0寨昙,我對其中含有的漏洞進(jìn)行填坑讥巡。這里有傳送門:自動(dòng)化記賬程序1.0,簡短回顧一下舔哪,上次的程序只是對一星期的的總收支和總收入搜集并統(tǒng)計(jì)欢顷,并實(shí)時(shí)計(jì)算出剩余的余額還有多少∽皆椋可是這未免過于單調(diào)抬驴,因?yàn)檫@個(gè)只能是簡單描述炼七,并不能讓人更加清晰知道自己的收入是在哪一塊占據(jù)的多?自己的支出是在哪一塊占據(jù)的多布持?并且純數(shù)字的展示豌拙,會(huì)不會(huì)對數(shù)字不敏感的人不友好呀(比如說本人)

本次記賬程序2.0的目標(biāo):

對上次的記賬程序1.0做出改進(jìn),額外增加對收/支種類的展述和對收/支種類的數(shù)據(jù)統(tǒng)計(jì)鳖链,并疊加對一星期總收入姆蘸、總支出和剩余額的柱狀圖呈現(xiàn),和對收/支出種類的數(shù)據(jù)統(tǒng)計(jì)的餅圖呈現(xiàn)芙委。

具體內(nèi)容

前期準(zhǔn)備工作

這次實(shí)現(xiàn)記賬程序2.0的準(zhǔn)備工作逞敷,是基于上次的記賬程序1.0,這里有傳送門:自動(dòng)化記賬程序1.0灌侣;除此之外推捐,還要額外下載一個(gè)新python庫,名為xlsxwriter庫侧啼,這個(gè)庫秒殺之前我給你們介紹的xlwt庫牛柒,它不僅能寫入數(shù)據(jù),還能繪圖痊乾,也支持xlsx格式的文件皮壁。如何下載,這里我因?yàn)槠蚰纳螅椭粧伋龊诵拇a:pip install xlsxwriter蛾魄,具體如何操作,可以回顧我上一篇文章湿滓,這里有傳送門:自動(dòng)化記賬程序1.0滴须。

編碼思路:

在實(shí)現(xiàn)自動(dòng)化記賬程序時(shí),容我先捋清一下思路:
1.思想認(rèn)識(shí)上叽奥,這個(gè)是基于上一篇文章的思路并進(jìn)行改良扔水,額外新增對一星期收/支類別統(tǒng)計(jì),并以可視化圖形呈現(xiàn)的朝氓,第一次看這篇文章的一定要回顧上一期我寫過的記賬程序1.0呀【重要事情說三遍~】
2.對新增部分首先要對原本excel模板做出改進(jìn)
3.記錄單表情況下魔市,對收/支種類的名稱獲取,并將其中涉及到每個(gè)收/支的金額做統(tǒng)計(jì)
4.然后擴(kuò)大范圍赵哲,從記錄單表到擴(kuò)大到多表(即從2021年5月30號(hào)到2021年6月5號(hào)的記賬表)
5.接下來就是對圖形的繪制了嘹狞,這里包括繪制收入、支出和剩余利潤的柱形圖和收/支的類別數(shù)據(jù)的餅圖
6.并將統(tǒng)計(jì)到的數(shù)據(jù)結(jié)果使用xlsxwriter庫寫入到excel表中誓竿,當(dāng)然磅网,本次不會(huì)再使用xlwt庫,將會(huì)對原本程序1.0的寫入excel代碼做出改變
7.打包成.exe腳本筷屡,這里就不會(huì)詳細(xì)介紹實(shí)現(xiàn)過程涧偷,只拋出核心代碼和結(jié)果簸喂,不懂的可翻閱我寫過的記賬程序1.0【重要事情說四遍~~】

開始編碼:

編碼思路認(rèn)識(shí)清楚后,就愉快編碼了:

excel模板改造

0.png

以上這副圖是程序1.0的excel模板

1.png

以上這幅圖是改良后燎潮,程序2.0的excel模板
這個(gè)在接下來程序定位獲取數(shù)據(jù)的時(shí)候很重要喻鳄,如果是小白,可以對照查看

導(dǎo)入第三方庫

這里要導(dǎo)入三個(gè)python庫确封,分別是xlrd庫除呵、calendar、xlsxwriter
導(dǎo)入庫的源碼如下【含注釋爪喘,最好手動(dòng)敲寫】

import xlrd# 從Excel文件讀取數(shù)據(jù)和格式化信息的庫颜曾,支持.xls以及.xlsx文件
import calendar# 導(dǎo)入日歷庫
import xlsxwriter # 用于將數(shù)據(jù)和格式化信息寫入Excel文件的庫

對收/支出種類描述做單表統(tǒng)計(jì)

要實(shí)現(xiàn)收/支出種類描述做單表統(tǒng)計(jì),可以先從如何實(shí)現(xiàn)支出種類描述的單表統(tǒng)計(jì)開始秉剑,思路是:
打開文件-->選擇要統(tǒng)計(jì)數(shù)據(jù)的表格-->獲取數(shù)據(jù)-->用函數(shù)來進(jìn)行封裝
對單表的支出種類描述統(tǒng)計(jì)的源碼如下【含注釋泛豪,最好手動(dòng)敲寫】:

# 獲取最完整的支出分類字典,其中end_time為結(jié)束時(shí)間:
def get_full_pay_series(end_time):
    # 存儲(chǔ)完整的支出種類名稱
    full_pay_series = {}
    # 確定文件路徑
    excel_url = str(end_time)
    # 打開xlsx的文件
    data = xlrd.open_workbook(excel_url)
    #打開第一張表
    table = data.sheets()[0]
    # 獲取第四行的種類數(shù)據(jù)【從0開始】
    pay_series = table.row_values(3)
    # 去除種類列表里的空值:
    while "" in pay_series:
        pay_series.remove("")
    # 將完整的種類遍歷侦鹏,并存儲(chǔ)到full_series字典中诡曙,并設(shè)置其默認(rèn)值是0
    for single_series in pay_series[1:]:
        full_pay_series.setdefault(single_series,0)
    return full_pay_series

同理,獲取單表收入種類的方法也是類似的略水。
對單表的收入種類描述統(tǒng)計(jì)的源碼如下【含注釋价卤,最好手動(dòng)敲寫】:

# 獲取最完整的收入分類字典,其中end_time為結(jié)束時(shí)間:
def get_full_income_series(end_time):
    # 存儲(chǔ)完整的收入種類名稱
    full_income_series = {}
    # 確定文件路徑
    excel_url = str(end_time)
    # 打開xlsx的文件
    data = xlrd.open_workbook(excel_url)
    #打開第一張表
    table = data.sheets()[0]
    # 獲取第八行的種類數(shù)據(jù)【從0開始】
    income_series = table.row_values(7)
    # 去除種類列表里的空值:
    while "" in income_series:
        income_series.remove("")
    # 將完整的種類遍歷渊涝,并存儲(chǔ)到full_series字典中荠雕,并設(shè)置其默認(rèn)值是0
    for single_series in income_series[1:]:
        full_income_series.setdefault(single_series,0)
    return full_income_series

對收/支出種類金額做單表統(tǒng)計(jì)

這個(gè)問題和剛才講述如何對收/支出種類描述做單表統(tǒng)計(jì)的問題有異曲同工支出,處理的方式依舊是:
打開文件-->選擇要統(tǒng)計(jì)數(shù)據(jù)的表格-->獲取數(shù)據(jù)-->用函數(shù)來進(jìn)行封裝

對單表的支出種類金額統(tǒng)計(jì)的源碼如下【含注釋驶赏,最好手動(dòng)敲寫】:

# 獲取單張表的支出金額
def get_single_pay_series(pay_url):# pay_url為支出表的路徑
    # 確定文件路徑
    excel_url = str(pay_url)
    # 打開xlsx的文件
    data = xlrd.open_workbook(excel_url)
    #打開第一張表
    table = data.sheets()[0]
    # 獲取第四行的種類數(shù)據(jù)【從0開始】
    pay_series = table.row_values(3)
    # 去除種類列表里的空值:
    while "" in pay_series:
        pay_series.remove("")
    # 獲取第六行的種類支出金額數(shù)據(jù)【從0開始】
    pay_series_val = table.row_values(5)
    # 去除種類列表里的空值:
    while "" in pay_series_val:
        pay_series_val.remove("")
    # 將支出種類和支出種類金額,用字典存儲(chǔ)起來
    pay_series_dict = dict(zip(pay_series[1:],pay_series_val[1:]))
    return pay_series_dict

對單表的收入種類金額統(tǒng)計(jì)的源碼如下【含注釋既鞠,最好手動(dòng)敲寫】:

# 獲取單張表的收入金額
def get_single_income_series(income_url):# income_url為收入表的路徑
    # 確定文件路徑
    excel_url = str(income_url)
    # 打開xlsx的文件
    data = xlrd.open_workbook(excel_url)
    #打開第一張表
    table = data.sheets()[0]
    # 獲取第八行的種類數(shù)據(jù)【從0開始】
    income_series = table.row_values(7)
    # 去除種類列表里的空值:
    while "" in income_series:
        income_series.remove("")
    # 獲取第十行的種類支出金額數(shù)據(jù)【從0開始】
    income_series_val = table.row_values(9)
    # 去除種類列表里的空值:
    while "" in income_series_val:
        income_series_val.remove("")
    # 將支出種類和支出種類金額煤傍,用字典存儲(chǔ)起來
    income_series_dict = dict(zip(income_series[1:],income_series_val[1:]))
    return income_series_dict

獲取一星期的表的收入和支出種類數(shù)據(jù)統(tǒng)計(jì)

從單表到對表,獲取的思路大概類似嘱蛋,唯一不同是對多個(gè)文件進(jìn)去的處理蚯姆,因?yàn)槲乙琅f是遵照用時(shí)間來定義每天的記賬記錄,因此要對時(shí)間做處理洒敏,不懂的可翻閱我寫過的記賬程序1.0【重要事情說五遍~】龄恋,并且要用字典或者列表裝載結(jié)果,這里我兩種都有使用凶伙。

獲取一星期的表的收入和支出種類數(shù)據(jù)統(tǒng)計(jì)的源碼如下【含注釋郭毕,最好手動(dòng)敲寫】:

# 獲取一星期的表的收入和支出種類數(shù)據(jù)統(tǒng)計(jì)

# start取記賬的開始日期,如2021-5-23
# end取記賬的結(jié)束日期函荣,如2021-5-29
def get_pay_and_income_series(start,end):
    # 存儲(chǔ)所有支出和收入的種類和值
    all_series_and_value = []
    
    # 分隔開始時(shí)間显押,分成年月日
    start_split = str(start).split("-")
    # 分隔結(jié)束時(shí)間扳肛,分成年月日
    end_split = str(end).split("-")
    # 確定結(jié)束文件的路徑
    end_excel_url = "../1日賬單/{}-{}-{}.xlsx".format(end_split[0],end_split[1],end_split[2])
    # 完整的支出種類名稱【以最后的結(jié)束文件為主】
    full_pay_series = get_full_pay_series(end_excel_url)
    # 完整的收入種類名稱【以最后的結(jié)束文件為主】
    full_income_series = get_full_income_series(end_excel_url)
    
    # 判斷開始和結(jié)束的月份是否一致
    if int(start_split[1]) == int(end_split[1]):
        # 獲取指定這個(gè)月的開始 到 結(jié)束的賬單名
        for this_day in range(int(start_split[2]),int(end_split[2])+1):#【this_day指的是月的天數(shù)】
            # 確定文件路徑
            this_excel_url = "../1日賬單/{}-{}-{}.xlsx".format(start_split[0],start_split[1],this_day)
            # 獲取單張表的支出種類和金額【索引從0開始】
            pay = get_single_pay_series(this_excel_url)
            # 遍歷單張表的支出種類名稱和金額
            for key,value in pay.items():
                # 如果支出種類名稱在完整的支出種類名稱中
                if key in full_pay_series:
                    # 則取出他的值進(jìn)行累計(jì)
                    full_pay_series[key] += value
                else:
                    # 否則保持不變
                    full_pay_series[key]
            # 獲取單張表的收入種類和金額【索引從0開始】
            income = get_single_income_series(this_excel_url)
            # 遍歷單張表的支出種類名稱和金額
            for key,value in income.items():
                # 如果支出種類名稱在完整的支出種類名稱中
                if key in full_income_series:
                    # 則取出他的值進(jìn)行累計(jì)
                    full_income_series[key] += value
                else:
                    # 否則保持不變
                    full_income_series[key]
            
    else:
        # 獲取這月的總天數(shù)
        this_month_day = calendar.monthlen(int(start_split[0]),int(start_split[1]))
        # 前部分:獲取指定月的開始 到 這月結(jié)束的賬單名
        for pre_day in range(int(start_split[2]),this_month_day+1):#【pre_day指的是這個(gè)月/年的天數(shù)】
            # 確定文件路徑
            pre_excel_url = "../1日賬單/{}-{}-{}.xlsx".format(start_split[0],start_split[1],pre_day)
            # 獲取單張表的支出種類和金額【索引從0開始】
            pay = get_single_pay_series(pre_excel_url)
            # 遍歷單張表的支出種類名稱和金額
            for key,value in pay.items():
                # 如果支出種類名稱在完整的支出種類名稱中
                if key in full_pay_series:
                    # 則取出他的值進(jìn)行累計(jì)
                    full_pay_series[key] += value
                else:
                    # 否則保持不變
                    full_pay_series[key]
            # 獲取單張表的收入種類和金額【索引從0開始】
            income = get_single_income_series(pre_excel_url)
            # 遍歷單張表的支出種類名稱和金額
            for key,value in income.items():
                # 如果支出種類名稱在完整的支出種類名稱中
                if key in full_income_series:
                    # 則取出他的值進(jìn)行累計(jì)
                    full_income_series[key] += value
                else:
                    # 否則保持不變
                    full_income_series[key]
        # 后部分:獲取新月的開始 到 指定月結(jié)束的賬單名
        for after_day in range(1,int(end_split[2])+1):#【after_day指的是新月/新年的天數(shù)】
            # 確定文件路徑
            after_excel_url = "../1日賬單/{}-{}-{}.xlsx".format(end_split[0],end_split[1],after_day)
            # 獲取單張表的支出種類和金額【索引從0開始】
            pay = get_single_pay_series(after_excel_url)
            # 遍歷單張表的支出種類名稱和金額
            for key,value in pay.items():
                # 如果支出種類名稱在完整的支出種類名稱中
                if key in full_pay_series:
                    # 則取出他的值進(jìn)行累計(jì)
                    full_pay_series[key] += value
                else:
                    # 否則保持不變
                    full_pay_series[key]
            # 獲取單張表的收入種類和金額【索引從0開始】
            income = get_single_income_series(after_excel_url)
            # 遍歷單張表的支出種類名稱和金額
            for key,value in income.items():
                # 如果支出種類名稱在完整的支出種類名稱中
                if key in full_income_series:
                    # 則取出他的值進(jìn)行累計(jì)
                    full_income_series[key] += value
                else:
                    # 否則保持不變
                    full_income_series[key]
    # 將一星期支出的種類和金額加入all_series_and_value列表中
    all_series_and_value.append(full_pay_series)
    # 將一星期收入的種類和金額加入all_series_and_value列表中
    all_series_and_value.append(full_income_series)
    return all_series_and_value

注:如果想要檢測一下自己寫的方法是否可行,可以做一個(gè)局部測試乘碑,就是調(diào)用自己寫的函數(shù)來查看自己有沒有成功獲取自己想要的數(shù)據(jù)

# 簡單局部測試自己有無獲取到數(shù)據(jù)
result2 = get_pay_and_income_series("2021-5-30","2021-6-5")
print(result2)

以上是本人自己測試的代碼挖息,僅作為參考,得到的效果圖如下:

2.png

繪制柱狀圖兽肤,用作對“支出-收入-利潤”的可視化呈現(xiàn)
這里是新增部分套腹,繪圖主要抓住獲取繪圖的數(shù)據(jù),繪圖的系列數(shù)據(jù)(包含繪圖的x/y位置)资铡、圖表的頭部標(biāo)題和x/y軸的標(biāo)題电禀、圖表的風(fēng)格和樣式(這個(gè)看個(gè)人需要,都是修飾和美化的)害驹。
這部分鞭呕,本人建議小白最好嘗試先用xlsxwriter庫繪制一個(gè)柱狀圖,懂其中的使用方法宛官,再根據(jù)業(yè)務(wù)需要寫個(gè)函數(shù)封裝起來葫松,方便直接使用。

“支出-收入-利潤”的柱形圖繪制的源碼如下【含注釋底洗,最好手動(dòng)敲寫】:

# 繪制柱狀圖
'''
參數(shù)講解:
    sheet_name:為工作表名
    x_start_cell:為x軸的數(shù)據(jù)開始
    x_end_cell:為x軸的數(shù)據(jù)結(jié)束
    y_start_cell:為y軸的數(shù)據(jù)開始
    y_end_cell:為y軸的數(shù)據(jù)結(jié)束
    out_line_color:為柱狀圖的外框線【默認(rèn)是yellow】
    bar_title:為設(shè)置柱狀圖的標(biāo)題
    bar_x_axis:為設(shè)置X軸的名稱
    bar_y_axis:為設(shè)置Y軸的名稱
    tar_set_cell:為圖表安放的位置
    x_offset:設(shè)置X軸的偏移量【默認(rèn)是25】
    y_offset:設(shè)置Y軸的偏移量【默認(rèn)是10】
'''
def char_bar(sheet_name,x_start_cell,x_end_cell,
             y_start_cell,y_end_cell,bar_title,bar_x_axis,
             bar_y_axis,tar_set_cell,out_line_color="yellow",x_offset=25,y_offset=10):
    # 將其所有輸入的參數(shù)集合在同一個(gè)列表中腋么,統(tǒng)統(tǒng)轉(zhuǎn)換成字符型數(shù)據(jù)
    origin_data = [sheet_name,x_start_cell,x_end_cell,y_start_cell,y_end_cell,out_line_color,bar_title,bar_x_axis,bar_y_axis,tar_set_cell]
    ## 將列表里的數(shù)據(jù)統(tǒng)統(tǒng)轉(zhuǎn)換成字符型數(shù)據(jù)
    str_data = list(map(str,origin_data))
    
    ## 創(chuàng)建一個(gè)柱狀圖(column chart)
    chart = workbook.add_chart({"type":"column"})
    ## 配置第一個(gè)系列數(shù)據(jù)
    chart.add_series({
#         "name":"={}!${}${}".format(str_data[0],str_data[1][0],str_data[1][1]),# 設(shè)置目標(biāo)頭部屬性數(shù)據(jù)
        "categories":"={}!${}${}:${}${}".format(str_data[0],str_data[1][0],str_data[1][1],str_data[2][0],str_data[2][1]),# 設(shè)置x軸的數(shù)據(jù)
        "values":"={}!${}${}:${}${}".format(str_data[0],str_data[3][0],str_data[3][1],str_data[4][0],str_data[4][1]),# 設(shè)置y軸的數(shù)據(jù)
        "line":{"color":str_data[5]},# 設(shè)置柱狀圖的外框線
    })
    # 設(shè)置圖表的標(biāo)題、X軸亥揖、Y軸的信息
    chart.set_title({"name":str_data[6]})
    chart.set_x_axis({"name":str_data[7]})
    chart.set_y_axis({"name":str_data[8]})

    ## 設(shè)置圖表風(fēng)格
    chart.set_style(1)
    
    # 把圖表插入到工作表珊擂,以及設(shè)置其偏移
    worksheet.insert_chart(str_data[9],chart,{"x_offset":x_offset,"y_offset":y_offset})

繪制餅圖,用作對"支出的種類和金額"和"收入的種類和金額"的可視化呈現(xiàn)

餅圖和柱形圖繪制的思路是一致的费变,只不過選用的圖類型不一樣而已摧扇。

"支出的種類和金額"和"收入的種類和金額"的餅圖繪制的源碼如下【含注釋,最好手動(dòng)敲寫】:

# 繪制餅圖
'''
參數(shù)講解:
    sheet_name:為工作表名
    series_start_cell:為種類的數(shù)據(jù)開始
    series_end_cell:為種類的數(shù)據(jù)結(jié)束
    value_start_cell:為種類的數(shù)據(jù)體開始
    value_end_cell:為種類的數(shù)據(jù)體結(jié)束
    bar_title:為設(shè)置餅圖的標(biāo)題
    tar_set_cell:為圖表安放的位置
    x_offset:設(shè)置X軸的偏移量【默認(rèn)是25】
    y_offset:設(shè)置Y軸的偏移量【默認(rèn)是10】
'''
def chart_pie(sheet_name,series_start_cell,series_end_cell,
              value_start_cell,value_end_cell,bar_title,tar_set_cell,x_offset=25,y_offset=10):
    
    # 將其所有輸入的參數(shù)集合在同一個(gè)列表中挚歧,統(tǒng)統(tǒng)轉(zhuǎn)換成字符型數(shù)據(jù)
    origin_data = [sheet_name,series_start_cell,series_end_cell,value_start_cell,value_end_cell,bar_title,tar_set_cell]
    ## 將列表里的數(shù)據(jù)統(tǒng)統(tǒng)轉(zhuǎn)換成字符型數(shù)據(jù)
    str_data = list(map(str,origin_data))
    
    ## 創(chuàng)建一個(gè)餅圖(pie chart)
    chart = workbook.add_chart({"type":"pie"})
    
    ## 配置第一個(gè)系列數(shù)據(jù)
    chart.add_series({
        "categories":"={}!${}${}:${}${}".format(str_data[0],str_data[1][0],str_data[1][1],str_data[2][0],str_data[2][1]),# 獲取目標(biāo)頭部屬性
        "values":"={}!${}${}:${}${}".format(str_data[0],str_data[3][0],str_data[3][1],str_data[4][0],str_data[4][1]),# 獲取里面的數(shù)據(jù)體
    })
    
    ## 設(shè)置圖表的標(biāo)題的信息
    chart.set_title({"name":str_data[5]})
    
    ## 設(shè)置圖表的風(fēng)格
    chart.set_style(10)
    ## 把圖表插入到工作表扛稽,以及設(shè)置其偏移
    worksheet.insert_chart(str_data[6],chart,{"x_offset":x_offset,"y_offset":y_offset})

數(shù)據(jù)寫入

恭喜你,直到這里滑负,對前期的數(shù)據(jù)統(tǒng)計(jì)和數(shù)據(jù)繪圖就結(jié)束了在张,現(xiàn)在是直接將整理好的數(shù)據(jù)寫入并繪圖了
但是要注意,這里的數(shù)據(jù)寫入是用xlsxwriter庫編寫的矮慕,切記不可使用xlwt庫哦~

數(shù)據(jù)寫入的源碼如下【含注釋帮匾,最好手動(dòng)敲寫】:

# 一星期內(nèi)容匯總

# start取記賬的開始日期,如2021-5-23
# end取記賬的結(jié)束日期痴鳄,如2021-5-29
def write_pay_and_income(start,end):

    
    # 準(zhǔn)備要寫入的數(shù)據(jù)
    ## “支出-收入-利潤”的表頭
    headings1 = ["總支出","總收入","剩余利潤"]
    ## 獲取一星期表的收入和支出的數(shù)據(jù)
    accounts_value = get_pay_and_income(start,end)
    ## “支出-收入-利潤”的表體
    data1 = [accounts_value[0],accounts_value[1],accounts_value[1]-accounts_value[0]]
    
    ## "支出的種類和金額"的表頭
    headings2 = ["支出種類","支出金額"]
    ## "支出的種類和金額"的表體
    data2 = [
        list(get_pay_and_income_series(start,end)[0].keys()),
        list(get_pay_and_income_series(start,end)[0].values()),
    ]
    
    ## "收入的種類和金額"的表頭
    headings3 = ["收入種類","收入金額"]
    ## "收入的種類和金額"的表體
    data3 = [
        list(get_pay_and_income_series(start,end)[1].keys()),
        list(get_pay_and_income_series(start,end)[1].values()),
    ]
    
    # 段落樣式設(shè)計(jì)
    ## 表頭
    header_style = {
        'bold':True,
        'font_name':"微軟雅黑",
        'border':True,
        'align':'center',
        'valign':'vcenter',
        'bg_color':'yellow'
    }
    header_style_set = workbook.add_format(header_style)# 樣式添加
    ## 表體
    text_style = {
        'font_name':"微軟雅黑",
        'border':True,
        'align':'center',
        'valign':'vcenter'
    }
    text_style_set = workbook.add_format(text_style)# 樣式添加
    # 設(shè)置H列的寬度為14
    worksheet.set_column("H:H",14)
    
    # 數(shù)據(jù)寫入
    ## 單數(shù)據(jù)寫入
    worksheet.write(0,0,"一星期的收支情況分析")
    worksheet.write(0,4,"一星期的收/支出種類分析")
    worksheet.write(2,4,"支出種類",header_style_set)
    worksheet.write(3,4,"支出金額",header_style_set)
    worksheet.write(5,4,"收入種類",header_style_set)
    worksheet.write(6,4,"收入金額",header_style_set)
    
    ## 多數(shù)據(jù)寫入
    ### 寫入“支出-收入-利潤”的表頭
    worksheet.write_row("A3",headings1,header_style_set)
    ### 寫入“支出-收入-利潤”的表體
    worksheet.write_row("A4",data1,text_style_set)
    
    ### 寫入"支出的種類和金額"的表頭
    worksheet.write_row("F3",data2[0],text_style_set)
    ### 寫入"支出的種類和金額"的表體
    worksheet.write_row("F4",data2[1],text_style_set)

    ### 寫入"收入的種類和金額"的表頭
    worksheet.write_row("F6",data3[0],text_style_set)
    ### 寫入"收入的種類和金額"的表體
    worksheet.write_row("F7",data3[1],text_style_set)
    
    # 繪圖
    ## “支出-收入-利潤”的柱狀圖
    char_bar(sheet_name = "七天匯總",x_start_cell = "A3",
        x_end_cell="C3",y_start_cell = "A4",y_end_cell = "C4",out_line_color = "red",
        bar_title = "收支情況圖",bar_x_axis = "屬性",bar_y_axis = "數(shù)值",tar_set_cell="A10")

    ## "支出的種類和金額"的餅圖
    chart_pie(sheet_name = "七天匯總",series_start_cell = "F3 ",series_end_cell = "L3",
              value_start_cell = "F4",value_end_cell = "L4",bar_title = "支出種類分析",tar_set_cell="I10")

    ## "收入的種類和金額"的餅圖
    chart_pie(sheet_name = "七天匯總",series_start_cell = "F6 ",series_end_cell = "L6",
              value_start_cell = "F7",value_end_cell = "I7",bar_title = "收入種類分析",tar_set_cell="Q10")

    # 關(guān)閉文件
    workbook.close()

自定義交互

當(dāng)然以上這些都是用函數(shù)封裝好了的瘟斜,如果要使用,必須要調(diào)用其中的函數(shù)才可以哦~

自定義交互的源碼如下【含注釋,最好手動(dòng)敲寫】:

start_time = input("開始時(shí)間:")# 設(shè)定賬單統(tǒng)計(jì)開始時(shí)間哼转,這里輸入"2021-5-30"
end_time = input("結(jié)束時(shí)間:")# 設(shè)定賬單統(tǒng)計(jì)開始時(shí)間明未,這里輸入"2021-6-5"
# 確定保存文件的路徑
save_url = "./{}到{}的匯總表.xlsx".format(start_time,end_time)
# 準(zhǔn)備工作薄
workbook = xlsxwriter.Workbook(save_url)
# 創(chuàng)建sheet工作表【表名可寫可不寫,不寫默認(rèn)是sheet1】
worksheet = workbook.add_worksheet("七天匯總")
write_pay_and_income(start_time,end_time)

生成.exe程序

到這里壹蔓,你已經(jīng)完成了核心的編碼過程趟妥,現(xiàn)在正是將你寫好的程序做成.exe程序吧。思路是:將.ipynb轉(zhuǎn)換成.py文件?將.py程序生成.exe文件佣蓉,不懂的可翻閱我寫過的記賬程序1.0【重要事情不知說了幾遍了~~】

這里拋出的是將.py程序生成.exe的核心代碼披摄,如下圖

3.png

結(jié)語

記賬系統(tǒng)2.0就算完成了,就終結(jié)了……嗎勇凭?嘻嘻疚膊,留個(gè)懸念,看自己能不能憋個(gè)大招虾标,讓各位看官耳目一新~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寓盗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子璧函,更是在濱河造成了極大的恐慌傀蚌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蘸吓,死亡現(xiàn)場離奇詭異善炫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)库继,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門箩艺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宪萄,你說我怎么就攤上這事艺谆。” “怎么了拜英?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵静汤,是天一觀的道長。 經(jīng)常有香客問我聊记,道長,這世上最難降的妖魔是什么恢暖? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任排监,我火速辦了婚禮,結(jié)果婚禮上杰捂,老公的妹妹穿的比我還像新娘舆床。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布挨队。 她就那樣靜靜地躺著谷暮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盛垦。 梳的紋絲不亂的頭發(fā)上湿弦,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音腾夯,去河邊找鬼颊埃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝶俱,可吹牛的內(nèi)容都是我干的班利。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼榨呆,長吁一口氣:“原來是場噩夢啊……” “哼罗标!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起积蜻,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闯割,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浅侨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纽谒,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年如输,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼓黔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡不见,死狀恐怖澳化,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稳吮,我是刑警寧澤缎谷,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站灶似,受9級特大地震影響列林,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酪惭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一希痴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧春感,春花似錦砌创、人聲如沸虏缸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刽辙。三九已至,卻和暖如春甲献,著一層夾襖步出監(jiān)牢的瞬間宰缤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工竟纳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撵溃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓锥累,卻偏偏與公主長得像缘挑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子桶略,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容