用 Python 生成 Excel 报表。

2021-11-16 15:25:56 浏览数 (1)

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

原始数据:

目的数据:

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

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

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

先来进行透视表转换

代码语言:javascript复制
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

代码语言:javascript复制
table.xs('Debra Henley', level=0)

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

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

代码语言:javascript复制
table.xs(('Debra Henley','Craig Booker'), level=0)

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

代码语言:javascript复制
table.index.get_level_values(0)
table.index.get_level_values(1)
table.index.get_level_values(0).unique()

Output:

代码语言:javascript复制
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')
代码语言:javascript复制
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')
代码语言:javascript复制
Index(['Debra Henley', 'Fred Anderson'], dtype='object', name='Manager')

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

代码语言:javascript复制
for manager in table.index.get_level_values(0).unique():
    print(table.xs(manager, level=0))

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

代码语言:javascript复制
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 当中进行的,下面我们把相关代码封装下,通过命令行来执行

代码语言:javascript复制
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)

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

0 人点赞