python实现报表自动化2

简介: python实现报表自动化2

python实现报表自动化2


此报表展示直连家数的直连情况以及购进金额情况,涉及到的明细数据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()     # 保存文件
相关文章
|
29天前
|
搜索推荐 Python
使用Python自动化生成物业通知单
本文介绍如何使用Python结合Pandas和python-docx库自动化生成物业通知单。通过读取Excel数据并填充至Word模板,实现高效准确的通知单批量制作。包括环境准备、代码解析及效果展示,适用于物业管理场景。
62 14
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
101 10
|
7天前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
106 60
|
2月前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
19天前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
50 7
|
1月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
51 7
|
1月前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
35 4
|
1月前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
2月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
5月前
|
测试技术 索引 Python
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
本文提供了Python接口自动化测试中的编程练习,包括计算器、猜数字、猜拳和九九乘法表等经典问题,涵盖了数据类型、运算、循环、条件控制等基础知识的综合应用。
55 1