基于Python实现自动化生成数据报表
前言
不要在用手敲生成Excel数据报表了,用Python自动生成Excel数据报表!废话不多说
让我们愉快地开始吧~
开发工具
Python版本: 3.6.4
相关模块:
pandasxlwingsmatplotlib模块;
xlwingsmatplotlib模块;
matplotlib模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原始数据如下,主要有水果蔬菜名称、销售日期、销售数量、平均价格、平均成本、总收入、总成本、总利润等。
主要代码
先导入相关库,使用pandas读取原始数据。
import pandas as pd import xlwings as xw import matplotlib.pyplot as plt # 对齐数据 pd.set_option('display.unicode.ambiguous_as_wide', True) pd.set_option('display.unicode.east_asian_width', True) # 读取数据 df = pd.read_csv(r"fruit_and_veg_sales.csv") print(df)
结果如下
一共是有1000行的销售数据。
使用xlwings库创建一个Excel工作簿,在工作簿中创建一个表,表名为fruit_and_veg_sales,然后将原始数据复制进去。
# 创建原始数据表并复制数据 wb = xw.Book() sht = wb.sheets["Sheet1"] sht.name = "fruit_and_veg_sales" sht.range("A1").options(index=False).value = d
将原始数据取过来后,再在工作簿中创建一个可视化表,即Dashboard表。
# 创建表 wb.sheets.add('Dashboard') sht_dashboard = wb.sheets('Dashboard')
现在,我们有了一个包含两个工作表的Excel工作簿。fruit_and_veg_sales表有我们的数据,Dashboard表则是空白的。
下面使用pandas来处理数据,生成Dashboard表的数据信息。
DashBoard表的头两个表格,一个是产品的利润表格,一个是产品的销售数量表格。
使用到了pandas的数据透视表函数。
# 销售数量透视表 pv_quantity_sold = pd.pivot_table(df, index='类别', values='销售数量', aggfunc='sum') print(pv_quantity_sold)
得到数据如下
这里先对数据进行了查询,发现日期列为object,是不能进行分组汇总的。
所以使用了pd.to_datetime()对其进行了格式转换,而后根据时间进行分组汇总,得到每个月的数据情况。
最后一个groupby将为Dashboard表提供第四个数据信息
# 总收入前8的日期数据 gb_top_revenue = (df.groupby(df["销售日期"]) .sum() .sort_values('总收入(美元)', ascending=False) .head(8) )[["销售数量", '总收入(美元)', '总成本(美元)', "总利润(美元)"]] print(gb_top_revenue)
总收入前8的日期,得到结果如下
现在我们有了4份数据,可以将其附加到Excel中
# 设置背景颜色, 从A1单元格到Z1000单元格的矩形区域 sht_dashboard.range('A1:Z1000').color = (198, 224, 180) # A、B列的列宽 sht_dashboard.range('A:B').column_width = 2.22 print(sht_dashboard.range('B2').api.font_object.properties.get()) # B2单元格, 文字内容、字体、字号、粗体、颜色、行高(主标题) sht_dashboard.range('B2').value = '销售数据报表' sht_dashboard.range('B2').api.font_object.name.set('黑体') sht_dashboard.range('B2').api.font_object.font_size.set(48) sht_dashboard.range('B2').api.font_object.bold.set(True) sht_dashboard.range('B2').api.font_object.color.set([0, 0, 0]) sht_dashboard.range('B2').row_height = 61.2 # B2单元格到W2单元格的矩形区域, 下边框的粗细及颜色 sht_dashboard.range('B2:W2').api.get_border(which_border=9).weight.set(4) sht_dashboard.range('B2:W2').api.get_border(which_border=9).color.set([0, 176, 80]) # 不同产品总的收益情况图表名称、字体、字号、粗体、颜色(副标题) sht_dashboard.range('M2').value = '每种产品的收益情况' sht_dashboard.range('M2').api.font_object.name.set('黑体') sht_dashboard.range('M2').api.font_object.font_size.set(20) sht_dashboard.range('M2').api.font_object.bold.set(True) sht_dashboard.range('M2').api.font_object.color.set([0, 0, 0]) # 主标题和副标题的分割线, 粗细、颜色、线型 sht_dashboard.range('L2').api.get_border(which_border=7).weight.set(3) sht_dashboard.range('L2').api.get_border(which_border=7).color.set([0, 176, 80]) sht_dashboard.range('L2').api.get_border(which_border=7).line_style.set(-4115)
先配置一些基本内容,比如文字,颜色背景,边框线等,如下图
使用函数,批量生成四个表格的格式
# 表格生成函数. def create_formatted_summary(header_cell, title, df_summary, color): """ Parameters ---------- header_cell : Str 左上角单元格位置, 放置数据 title : Str 当前表格的标题 df_summary : DataFrame 表格的数据 color : Str 表格填充色 """ # 可选择的表格填充色 colors = {"purple": [(112, 48, 160), (161, 98, 208)], "blue": [(0, 112, 192), (155, 194, 230)], "green": [(0, 176, 80), (169, 208, 142)], "yellow": [(255, 192, 0), (255, 217, 102)]} # 设置表格标题的列宽 sht_dashboard.range(header_cell).column_width = 1.5 # 获取单元格的行列数 row, col = sht_dashboard.range(header_cell).row, sht_dashboard.range(header_cell).column # 设置表格的标题及相关信息, 如:字号、行高、向左居中对齐、颜色、粗体、表格的背景颜色等 summary_title_range = sht_dashboard.range((row, col)) summary_title_range.value = title summary_title_range.api.font_object.font_size.set(14) summary_title_range.row_height = 32.5 # 垂直对齐方式 summary_title_range.api.verticalalignment = xw.constants.HAlign.xlHAlignCenter summary_title_range.api.font_object.color.set([255, 255, 255]) summary_title_range.api.font_object.bold.set(True) sht_dashboard.range((row, col), (row, col + len(df_summary.columns) + 1)).color = colors[color][0] # Darker color # 设置表格内容、起始单元格、数据填充、字体大小、粗体、颜色填充 summary_header_range = sht_dashboard.range((row + 1, col + 1)) summary_header_range.value = df_summary summary_header_range = summary_header_range.expand('right') summary_header_range.api.font_object.font_size.set(11) summary_header_range.api.font_object.bold.set(True) sht_dashboard.range((row + 1, col), (row + 1, col + len(df_summary.columns) + 1)).color = colors[color][1] # Darker color sht_dashboard.range((row + 1, col + 1), (row + len(df_summary), col + len(df_summary.columns) + 1)).autofit() for num in range(1, len(df_summary) + 2, 2): sht_dashboard.range((row + num, col), (row + num, col + len(df_summary.columns) + 1)).color = colors[color][1] # 找到表格的最后一行 last_row = sht_dashboard.range((row + 1, col + 1)).expand('down').last_cell.row side_border_range = sht_dashboard.range((row + 1, col), (last_row, col)) # 给表格左边添加带颜色的边框 side_border_range.api.get_border(which_border=7).weight.set(3) side_border_range.api.get_border(which_border=7).color.set(colors[color][1]) side_border_range.api.get_border(which_border=7).line_style.set(-4115) # 生成4个表格 create_formatted_summary('B5', '每种产品的收益情况', pv_total_profit, 'green') create_formatted_summary('B17', '每种产品的售出情况', pv_quantity_sold, 'purple') create_formatted_summary('F17', '每月的销售情况', gb_date_sold, 'blue') create_formatted_summary('F5', '每日总收入排名Top8 ', gb_top_revenue, 'yellow')
得到结果如下
可以看到,一行行的数据经过Python的处理,变为一目了然的表格。
最后再绘制一个matplotlib图表,添加一张logo图片,并保存Excel文件
# 中文显示 plt.rcParams['font.sans-serif']=['Songti SC'] # 使用Matplotlib绘制可视化图表, 饼图 fig, ax = plt.subplots(figsize=(6, 3)) pv_total_profit.plot(color='g', kind='bar', ax=ax) # 添加图表到Excel sht_dashboard.pictures.add(fig, name='ItemsChart', left=sht_dashboard.range("M5").left, top=sht_dashboard.range("M5").top, update=True) # 添加logo到Excel logo = sht_dashboard.pictures.add(image="pie_logo.png", name='PC_3', left=sht_dashboard.range("J2").left, top=sht_dashboard.range("J2").top+5, update=True) # 设置logo的大小 logo.width = 54 logo.height = 54 # 保存Excel文件 wb.save(rf"水果蔬菜销售报表.xlsx")
此处需设置一下中文显示,否则会显示不了中文,只有一个个方框。
得到最终的水果蔬菜销售报表
以上就是基于Python实现自动化生成数据报表的详细内容,更多关于Python数据报表的资料请关注猪先飞其它相关文章!
原文出处:https://juejin.cn/post/7054473611444240392
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
- 这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 这篇文章主要介绍了python进行相关性分析并绘制散点图,具有一定借鉴价值,需要的朋友可以参考下,希望能够给你带来帮助...2021-09-18