此报表展示直连家数的直连情况以及购进金额情况,涉及到的明细数据60万+,所用到的辅助名单也较多,制作过程比较繁琐;自动化代码如下:
import pandas as pd
import numpy as np
# 忽略warning警告
import warnings
warnings.filterwarnings('ignore')
#赋值
file_zl = '拜耳九州通名单直连情况表-20220801.xlsx'
lie_f = '7月流向购进金额'
lie_g = '(扣除T1-T2-T3)7月流向购进金额'
lie_h = 'DDI7月流向直连家数'
lie_i = '(扣除T1-T2-T3)DDI直连购进金额'
#读取报表
zl_1 = pd.read_excel(file_zl, sheet_name='拜耳&九州通名单-直连情况')
jf = pd.read_excel('22年X月流向购进金额与直连占比-测试.xlsx')
# 交付表中使用上面的值填充下边空白单元格
jf['百强'] = jf['百强'].fillna(method='ffill').iloc[0:10]
# 对齐参数
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
'''-----------------------------左半部分---------------------------'''
#家数、直连家数、占比赋值
# 用坐标给家数赋值
jf.iloc[0, 2] = zl_1.iloc[0,1]
jf.iloc[1, 2] = zl_1.iloc[4,1]
jf.iloc[2, 2] = zl_1.iloc[5,1]
jf.iloc[3, 2] = zl_1.iloc[9,1]
jf.iloc[4, 2] = zl_1.iloc[10,1]
jf.iloc[5, 2] = zl_1.iloc[11,1]
jf.iloc[7, 2] = zl_1.iloc[20,1]
# 用坐标给直连家数赋值
jf.iloc[0, 3] = zl_1.iloc[0,2]
jf.iloc[1, 3] = zl_1.iloc[4,2]
jf.iloc[2, 3] = zl_1.iloc[5,2]
jf.iloc[3, 3] = zl_1.iloc[9,2]
jf.iloc[4, 3] = zl_1.iloc[10,2]
jf.iloc[5, 3] = zl_1.iloc[11,2]
jf.iloc[7, 3] = zl_1.iloc[20,2]
# 用坐标给直连占比赋值
jf.iloc[0, 4] = zl_1.iloc[0,3]
jf.iloc[1, 4] = zl_1.iloc[4,3]
jf.iloc[2, 4] = zl_1.iloc[5,3]
jf.iloc[3, 4] = zl_1.iloc[9,3]
jf.iloc[4, 4] = zl_1.iloc[10,3]
jf.iloc[5, 4] = zl_1.iloc[11,3]
jf.iloc[7, 4] = zl_1.iloc[20,3]
''' ----------------------------- 右半部分 ------------------------ '''
#7月流向购进金额
# 读取百强sheet 需要在百强sheet中加一列“客户属性”,值全为“百强”
zl_baiqiang = pd.read_excel(file_zl, sheet_name='百强')
baiqiang = zl_baiqiang[['标准名称','客户属性','是否直连']]
baiqiang.to_excel('0百强名单.xlsx')
# 读取非百强sheet
zl_feibaiqiang = pd.read_excel(file_zl, sheet_name='非百强')
feibaiqiang = zl_feibaiqiang[['标准名称','客户属性','是否直连']]
# 替换列值,将‘备案连锁’替换为‘非百强-备案连锁’,将‘协议连锁’替换为‘非百强-协议连锁’
feibaiqiang.replace({"客户属性":{'备案连锁':'非百强-备案连锁','协议连锁':'非百强-协议连锁'}},inplace=True)
#将非百强sheet中的空值删掉
feibaiqiang = feibaiqiang.dropna(axis=0,subset = ['标准名称'])
feibaiqiang.to_excel('0非百强名单.xlsx')
# 读取商业sheet
zl_shangye = pd.read_excel(file_zl, sheet_name='商业')
shangye = zl_shangye[['标准名称','客户属性','是否直连']]
# 将“2022年属性”替换为“客户属性”
# shangye.rename(columns={'2022属性':'客户属性'}, inplace = True)
shangye.to_excel('0商业名单.xlsx')
#汇总百强-非百强-商业名单
heji = pd.merge(baiqiang,feibaiqiang,on=['标准名称','客户属性','是否直连'],how='outer') #百强与非百强合集
heji_1 = pd.merge(heji,shangye,on=['标准名称','客户属性','是否直连'],how='outer') #合集1与商业合集——百强-非百强-商业合集
heji_1.to_excel('1百强-非百强-商业名单汇总.xlsx')
#汇总直连商业名单
heji_2 = heji_1[heji_1['是否直连']=='是']
heji_2.to_excel('1直连名单汇总.xlsx')
# 读取流向明细
mx = pd.read_excel('流向明细.xlsx')
# 只筛选明细表中“卖方名称”“买方名称”“金额”三列
mx = mx[['卖方名称','买方名称','金额']]
mx.to_excel('2使用流向明细.xlsx')
## 6月流向购进金额F列
# 用买方名称V百强-非百强-商业汇总名单的客户属性
mx_1 = pd.merge(mx, heji_1, left_on='买方名称',right_on = '标准名称',how='left') #相当于V客户属性,没有指定how,默认保留都存在的
#删除多余的“标准名称”列
mx_1 = mx_1.drop(labels='标准名称',axis=1)
#将客户属性为空白的替换为“其他”
mx_1.loc[mx_1['客户属性'].isnull(),'客户属性']='其他'
mx_1.loc[mx_1['是否直连'].isnull(),'是否直连']='否'
mx_1.to_excel('2明细1-属性.xlsx')
#用属性透视金额
df_1 = mx_1.groupby(['客户属性'])['金额'].sum().reset_index()
df_1.rename(columns={'客户属性':'百强类型'}, inplace = True)
df_1.to_excel('df_1.xlsx')
#赋值
jf_1 = pd.merge(jf,df_1,on=['百强类型'],how='left')
#修改表头,将金额替换为”7月流向购进金额“
jf_1.rename(columns={'金额':lie_f},inplace=True)
#计算合计
jf_1.iloc[7,5] = df_1['金额'].sum()
#空值替换为0
jf_1[lie_f].fillna(0,inplace=True)
jf_1.to_excel('jf_1.xlsx')
## (扣除T1-T2-T3)7月流向购进金额
#整理扣除上游是T1T2T3的流向
#用卖方名称VT1T2T3名单
#读取t1t2t3名单
t1t2t3 = pd.read_excel('T1T2T3.xlsx')
t1t2t3_1 = t1t2t3[['标准客户名称']]
t1t2t3_1.to_excel('1t1t2t3名单.xlsx')
#用卖方名称VT1T2T3名单
mx_2 = pd.merge(mx_1,t1t2t3_1,left_on='卖方名称',right_on='标准客户名称',how='left')
mx_2.loc[mx_2['标准客户名称'].isnull(),'标准客户名称']='否'
#筛选扣除T1T2T3的流向明细
mx_kouchu = mx_2[mx_2['标准客户名称']=='否']
mx_kouchu.to_excel('2明细-扣除t1t2t3.xlsx')
#对扣除t1t2t3的明细进行透视
df_2 = mx_kouchu.groupby(['客户属性'])['金额'].sum().reset_index()
df_2.rename(columns={'客户属性':'百强类型'},inplace=True)
df_2.to_excel('df_2.xlsx')
#赋值
jf_2 = pd.merge(jf_1,df_2,on=['百强类型'],how='left')
jf_2.rename(columns={'金额':lie_g},inplace=True)
jf_2.iloc[7,6] = df_2['金额'].sum()
#空值替换为0
jf_2[lie_g].fillna(0,inplace=True)
jf_2.to_excel('jf_2.xlsx')
## DDI7月流向直连家数
#链接直连名单与明细表
a1 = pd.merge(heji_2,mx_1,left_on='标准名称',right_on='买方名称',how='left')
#删除空白值
a1.dropna(axis=0,subset = ["买方名称"],inplace=True)
#按照 标准名称 去重
a1.drop_duplicates(subset=['标准名称'],inplace=True)
#按照客户属性透视计数
df_3 = a1.groupby(['客户属性_x'])['标准名称'].count().reset_index()
df_3.rename(columns={'客户属性_x':'百强类型'},inplace=True) #替换列名
df_3.to_excel('df_3.xlsx')
#赋值
jf_3 = pd.merge(jf_2,df_3,on=['百强类型'],how='left')
jf_3.rename(columns={'标准名称':lie_h},inplace=True) #替换列名
jf_3.iloc[7,7] = df_3['标准名称'].sum()
#空值替换为0
jf_3[lie_h].fillna(0,inplace=True)
jf_3.to_excel('jf_3.xlsx')
## (扣除T1-T2-T3)DDI直连购进金额
#筛选出扣除T1T2T3中,直连为“是”的流向明细
mx_zl_kouchut1t2t3 = mx_kouchu[mx_kouchu['是否直连']=='是']
# mx_zl_kouchut1t2t3.to_excel('00.xlsx')
#透视金额
df_4 = mx_zl_kouchut1t2t3.groupby(['客户属性'])['金额'].sum().reset_index()
df_4.rename(columns={'客户属性':'百强类型'},inplace=True) #替换列名
df_4.to_excel('df_4.xlsx')
# #赋值
jf_4 = pd.merge(jf_3,df_4,on=['百强类型'],how='left')
jf_4.rename(columns={'金额':lie_i},inplace=True) #替换列名
jf_4.iloc[7,8] = df_4['金额'].sum()
#空值替换为0
jf_4[lie_i].fillna(0,inplace=True)
# jf_4.to_excel('jf_4.xlsx')
'''----------------------------------输出文件-------------------------------'''
# 输出交付文件
jf_4.to_excel('22年7月流向购进金额与直连占比-Report.xlsx',index=None)
# 修改列宽
file_path = './22年7月流向购进金额与直连占比-Report.xlsx' ####################修改文件名
sheet_name = 'Sheet1'
with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer:
# 数据传给Excel的writer
jf_4.to_excel(writer, index=False, sheet_name=sheet_name)
# 再从writer加载回该sheet
worksheet = writer.sheets[sheet_name]
# 循环每一列的列序号,设置列宽为20个单位(指Excel中的列宽单位)
# for idx in range(df_jf_res.shape[1]):
# print(df_jf_res.shape[1])
worksheet.set_column(0,4,12)
worksheet.set_column(5,5,20) # .set_column(a,b,c)函数三个参数,a代表起始列,b代表终止列,c为列宽
worksheet.set_column(5, 5, 20)
worksheet.set_column(6, 6, 35)
worksheet.set_column(7, 7, 22)
worksheet.set_column(8, 8, 36)
# worksheet.set_column(6, 6, 15)
writer.save() # 保存文件