Python自动化生成Excel数据报表:从原始数据到可视化Dashboard
本文详细介绍如何利用Python的pandas、xlwings和matplotlib库,自动化处理原始销售数据并生成包含数据表与可视化图表的Excel报表。通过读取CSV数据,使用xlwings创建Excel工作簿及Dashboard工作表,利用pandas进行数据透视与分组汇总,最后通过matplotlib绘制图表并嵌入Excel,实现从数据清洗到报表输出的全流程自动化,显著提升数据处理效率。
前言
告别手动敲击键盘生成Excel数据报表的低效方式,转而采用Python实现自动化生成。本文将直接展示核心实现过程,省略冗余铺垫。
接下来,让我们愉快地开启这一自动化流程吧。
开发工具
Python版本: 3.6.4
相关模块:
pandas、xlwings以及matplotlib模块;
xlwings与matplotlib模块;
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的数据透视表(pivot_table)函数。
# 销售数量透视表
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数据报表的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









