【Python】用 Python 帮财务小妹生成 Excel 报表,小妹直说一辈子。。。

共 2683字,需浏览 6分钟

 ·

2021-12-09 15:37

财务小妹

萝卜哥,求助!

人有三急,回见~

萝卜


财务小妹

别啊,不能去!

这,到底啥事啊

萝卜

财务小妹

有一个超级繁琐的事情,不过感觉你和Python能帮我

那你学Python吧,毕竟我也不能帮你一辈子

萝卜

财务小妹

不一定哦,先帮我把这次搞定,也许能一辈子呢

当真?我来看看

萝卜

财务小妹的需求


有一个Excel数据,需要根据一定规则重新组合数据,并把不同的数据发给不同的人


原始数据:



目的数据:



每一个tab页的数据,直接发给对应的人即可!


对于上面的数据格式转化,我们可以很自然的想到使用透视表,pivot table


然后为了达到更好的效果,我们还使用了 Pandas 当中的 DataFrame.xs 函数


先来进行透视表转换

df = pd.read_excel("sales-funnel.xlsx")table = pd.pivot_table(df,index=["Manager","Rep","Product"],               values=["Price","Quantity"],               aggfunc=[np.sum,np.mean],fill_value=0) table


接下来应用 xs

table.xs('Debra Henley', level=0)


可以看到很轻松的就拿到了 Debra Henley 对应的数据


我们还可以继续向下钻取数据

table.xs(('Debra Henley','Craig Booker'), level=0)


接下来我们还需要用到 get_level_values 函数

table.index.get_level_values(0)table.index.get_level_values(1)table.index.get_level_values(0).unique()

Output:

Index(['Debra Henley', 'Debra Henley', 'Debra Henley', 'Debra Henley',       'Debra Henley', 'Debra Henley', 'Debra Henley', 'Fred Anderson',       'Fred Anderson', 'Fred Anderson', 'Fred Anderson', 'Fred Anderson',       'Fred Anderson'],      dtype='object', name='Manager')
Index(['Craig Booker', 'Craig Booker', 'Craig Booker', 'Daniel Hilton',       'Daniel Hilton', 'John Smith', 'John Smith', 'Cedric Moss',       'Cedric Moss', 'Cedric Moss', 'Wendy Yule', 'Wendy Yule', 'Wendy Yule'],      dtype='object', name='Rep')
Index(['Debra Henley', 'Fred Anderson'], dtype='object', name='Manager')


下面我们就可以写一个循环,依次获取到 manager 所需要的数据

for manager in table.index.get_level_values(0).unique():    print(table.xs(manager, level=0))


最后把数据保存到新的 Excel 当中

writer = pd.ExcelWriter('output.xlsx')
for manager in table.index.get_level_values(0).unique(): temp_df = table.xs(manager, level=0) temp_df.to_excel(writer,manager)
writer.save()


由于上述操作都是在 Jupyter Notebook 当中进行的,下面我们把相关代码封装下,通过命令行来执行

if __name__ == "__main__":    parser = argparse.ArgumentParser(description='Script to generate sales report')    parser.add_argument('infile', type=argparse.FileType('r'),                        help="report source file in Excel")    parser.add_argument('outfile', type=argparse.FileType('w'),                        help="output file in Excel")    args = parser.parse_args()    # We need to pass the full file name instead of the file object    sales_report = create_pivot(args.infile.name)    save_report(sales_report, args.outfile.name)


至此,上述需求全部完成!


财务小妹

哇,好棒哦~

嘿嘿,一般一般

萝卜


财务小妹

嗯嗯,那我先下班喽

好呀,话说咱们什么时候说说一辈子的事情

萝卜


财务小妹

没问题啊,咱们要做一辈子的同事

。。。

萝卜


好了,今天就到这里了,为了帮忙抚平萝卜哥受伤的小心灵,点个再走吧


往期精彩回顾




站qq群955171419,加入微信群请扫码:
浏览 37
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报