当前位置:   article > 正文

用 Python 自动生成 Excel 数据报表~

数据报表是自己创建还是用已有的数据生成

大家好,我是小z

今天给大家来一波实战,使用Python自动化生成数据报表!

从一条条的数据中,创建出一张数据报表,得出你想要的东西,提高效率。

主要使用到pandas、xlwings以及matplotlib这几个库。

先来看一下动态的GIF,都是程序自动生成。

下面我们就来看看这个案例吧,水果蔬菜销售报表。

原始数据如下,主要有水果蔬菜名称、销售日期、销售数量、平均价格、平均成本、总收入、总成本、总利润等。

先导入相关库,使用pandas读取原始数据。

  1. import pandas as pd
  2. import xlwings as xw
  3. import matplotlib.pyplot as plt
  4. # 对齐数据
  5. pd.set_option('display.unicode.ambiguous_as_wide', True)
  6. pd.set_option('display.unicode.east_asian_width', True)
  7. # 读取数据
  8. df = pd.read_csv(r"fruit_and_veg_sales.csv")
  9. print(df)

结果如下。

一共是有1000行的销售数据。

使用xlwings库创建一个Excel工作簿,在工作簿中创建一个表,表名为fruit_and_veg_sales,然后将原始数据复制进去。

  1. # 创建原始数据表并复制数据
  2. wb = xw.Book()
  3. sht = wb.sheets["Sheet1"]
  4. sht.name = "fruit_and_veg_sales"
  5. sht.range("A1").options(index=False).value = d

关于xlwings库的使用,推荐两个文档地址

中文版:

https://www.kancloud.cn/gnefnuy/xlwings-docs/1127455

英文版:

https://docs.xlwings.org/en/stable/index.html

推荐使用中文版,可以降低学习难度...

当然关于Excel的VBA操作,也可以看看微软的文档。

地址:

https://docs.microsoft.com/zh-cn/office/vba/api/overview/excel

将原始数据取过来后,再在工作簿中创建一个可视化表,即Dashboard表。

  1. # 创建表
  2. wb.sheets.add('Dashboard')
  3. sht_dashboard = wb.sheets('Dashboard')

现在,我们有了一个包含两个工作表的Excel工作簿。fruit_and_veg_sales表有我们的数据,Dashboard表则是空白的。

下面使用pandas来处理数据,生成Dashboard表的数据信息。

DashBoard表的头两个表格,一个是产品的利润表格,一个是产品的销售数量表格。

使用到了pandas的数据透视表函数。

  1. # 总利润透视表
  2. pv_total_profit = pd.pivot_table(df, index='类别', values='总利润(美元)', aggfunc='sum')
  3. print(pv_total_profit)
  4. # 销售数量透视表
  5. pv_quantity_sold = pd.pivot_table(df, index='类别', values='销售数量', aggfunc='sum')
  6. print(pv_quantity_sold)

得到数据如下。

稍后会将数据放置到Excel的表中去。

下面对月份进行分组汇总,得出每个月的销售情况。

  1. # 查看每列的数据类型
  2. print(df.dtypes)
  3. df["销售日期"] = pd.to_datetime(df["销售日期"])
  4. # 每日的数据情况
  5. gb_date_sold = df.groupby(df["销售日期"].dt.to_period('m')).sum()[["销售数量"'总收入(美元)''总成本(美元)'"总利润(美元)"]]
  6. gb_date_sold.index = gb_date_sold.index.to_series().astype(str)
  7. print(gb_date_sold)

得到结果如下。

这里先对数据进行了查询,发现日期列为object,是不能进行分组汇总的。

所以使用了pd.to_datetime()对其进行了格式转换,而后根据时间进行分组汇总,得到每个月的数据情况。

最后一个groupby将为Dashboard表提供第四个数据信息。

  1. # 总收入前8的日期数据
  2. gb_top_revenue = (df.groupby(df["销售日期"])
  3.     .sum()
  4.     .sort_values('总收入(美元)', ascending=False)
  5.     .head(8)
  6.     )[["销售数量"'总收入(美元)''总成本(美元)'"总利润(美元)"]]
  7. print(gb_top_revenue)

总收入前8的日期,得到结果如下。

现在我们有了4份数据,可以将其附加到Excel中。

  1. # 设置背景颜色, 从A1单元格到Z1000单元格的矩形区域
  2. sht_dashboard.range('A1:Z1000').color = (198224180)
  3. # A、B列的列宽
  4. sht_dashboard.range('A:B').column_width = 2.22
  5. print(sht_dashboard.range('B2').api.font_object.properties.get())
  6. # B2单元格, 文字内容、字体、字号、粗体、颜色、行高(主标题)
  7. sht_dashboard.range('B2').value = '销售数据报表'
  8. sht_dashboard.range('B2').api.font_object.name.set('黑体')
  9. sht_dashboard.range('B2').api.font_object.font_size.set(48)
  10. sht_dashboard.range('B2').api.font_object.bold.set(True)
  11. sht_dashboard.range('B2').api.font_object.color.set([000])
  12. sht_dashboard.range('B2').row_height = 61.2
  13. # B2单元格到W2单元格的矩形区域, 下边框的粗细及颜色
  14. sht_dashboard.range('B2:W2').api.get_border(which_border=9).weight.set(4)
  15. sht_dashboard.range('B2:W2').api.get_border(which_border=9).color.set([017680])
  16. # 不同产品总的收益情况图表名称、字体、字号、粗体、颜色(副标题)
  17. sht_dashboard.range('M2').value = '每种产品的收益情况'
  18. sht_dashboard.range('M2').api.font_object.name.set('黑体')
  19. sht_dashboard.range('M2').api.font_object.font_size.set(20)
  20. sht_dashboard.range('M2').api.font_object.bold.set(True)
  21. sht_dashboard.range('M2').api.font_object.color.set([000])
  22. # 主标题和副标题的分割线, 粗细、颜色、线型
  23. sht_dashboard.range('L2').api.get_border(which_border=7).weight.set(3)
  24. sht_dashboard.range('L2').api.get_border(which_border=7).color.set([017680])
  25. sht_dashboard.range('L2').api.get_border(which_border=7).line_style.set(-4115)

先配置一些基本内容,比如文字,颜色背景,边框线等,如下图。

使用函数,批量生成四个表格的格式。

  1. # 表格生成函数.
  2. def create_formatted_summary(header_cell, title, df_summary, color):
  3.     """
  4.     Parameters
  5.     ----------
  6.     header_cell : Str
  7.         左上角单元格位置, 放置数据
  8.     title : Str
  9.         当前表格的标题
  10.     df_summary : DataFrame
  11.         表格的数据
  12.     color : Str
  13.         表格填充色
  14.     """
  15.     # 可选择的表格填充色
  16.     colors = {"purple": [(11248160), (16198208)],
  17.               "blue": [(0112192), (155194230)],
  18.               "green": [(017680), (169208142)],
  19.               "yellow": [(2551920), (255217102)]}
  20.     # 设置表格标题的列宽
  21.     sht_dashboard.range(header_cell).column_width = 1.5
  22.     # 获取单元格的行列数
  23.     row, col = sht_dashboard.range(header_cell).row, sht_dashboard.range(header_cell).column
  24.     # 设置表格的标题及相关信息, 如:字号、行高、向左居中对齐、颜色、粗体、表格的背景颜色等
  25.     summary_title_range = sht_dashboard.range((row, col))
  26.     summary_title_range.value = title
  27.     summary_title_range.api.font_object.font_size.set(14)
  28.     summary_title_range.row_height = 32.5
  29.     # 垂直对齐方式
  30.     summary_title_range.api.verticalalignment = xw.constants.HAlign.xlHAlignCenter
  31.     summary_title_range.api.font_object.color.set([255255255])
  32.     summary_title_range.api.font_object.bold.set(True)
  33.     sht_dashboard.range((row, col),
  34.                         (row, col + len(df_summary.columns) + 1)).color = colors[color][0]  # Darker color
  35.     # 设置表格内容、起始单元格、数据填充、字体大小、粗体、颜色填充
  36.     summary_header_range = sht_dashboard.range((row + 1, col + 1))
  37.     summary_header_range.value = df_summary
  38.     summary_header_range = summary_header_range.expand('right')
  39.     summary_header_range.api.font_object.font_size.set(11)
  40.     summary_header_range.api.font_object.bold.set(True)
  41.     sht_dashboard.range((row + 1, col),
  42.                         (row + 1, col + len(df_summary.columns) + 1)).color = colors[color][1]  # Darker color
  43.     sht_dashboard.range((row + 1, col + 1),
  44.                         (row + len(df_summary), col + len(df_summary.columns) + 1)).autofit()
  45.     for num in range(1len(df_summary) + 22):
  46.         sht_dashboard.range((row + num, col),
  47.                             (row + num, col + len(df_summary.columns) + 1)).color = colors[color][1]
  48.     # 找到表格的最后一行
  49.     last_row = sht_dashboard.range((row + 1, col + 1)).expand('down').last_cell.row
  50.     side_border_range = sht_dashboard.range((row + 1, col), (last_row, col))
  51.     # 给表格左边添加带颜色的边框
  52.     side_border_range.api.get_border(which_border=7).weight.set(3)
  53.     side_border_range.api.get_border(which_border=7).color.set(colors[color][1])
  54.     side_border_range.api.get_border(which_border=7).line_style.set(-4115)
  55. # 生成4个表格
  56. create_formatted_summary('B5''每种产品的收益情况', pv_total_profit, 'green')
  57. create_formatted_summary('B17''每种产品的售出情况', pv_quantity_sold, 'purple')
  58. create_formatted_summary('F17''每月的销售情况', gb_date_sold, 'blue')
  59. create_formatted_summary('F5''每日总收入排名Top8 ', gb_top_revenue, 'yellow')

得到结果如下。

可以看到,一行行的数据经过Python的处理,变为一目了然的表格。

最后再绘制一个matplotlib图表,添加一张logo图片,并保存Excel文件。

  1. # 中文显示
  2. plt.rcParams['font.sans-serif']=['Songti SC']
  3. # 使用Matplotlib绘制可视化图表, 饼图
  4. fig, ax = plt.subplots(figsize=(63))
  5. pv_total_profit.plot(color='g', kind='bar', ax=ax)
  6. # 添加图表到Excel
  7. sht_dashboard.pictures.add(fig, name='ItemsChart',
  8.                            left=sht_dashboard.range("M5").left,
  9.                            top=sht_dashboard.range("M5").top,
  10.                            update=True)
  11. # 添加logo到Excel
  12. logo = sht_dashboard.pictures.add(image="pie_logo.png",
  13.                            name='PC_3',
  14.                            left=sht_dashboard.range("J2").left,
  15.                            top=sht_dashboard.range("J2").top+5,
  16.                            update=True)
  17. # 设置logo的大小
  18. logo.width = 54
  19. logo.height = 54
  20. # 保存Excel文件
  21. wb.save(rf"水果蔬菜销售报表.xlsx")

此处需设置一下中文显示,否则会显示不了中文,只有一个个方框。

得到最终的水果蔬菜销售报表。

本文的示例代码,可以在Mac+Excel2016中运行的,与Windows还是会有一些区别,API函数的调用(pywin32 or appscript)。

比如表格文字的字体设置。

  1. # Windows
  2. sht_dashboard.range('B2').api.font.name = '黑体'
  3. # Mac
  4. sht_dashboard.range('B2').api.font_object.name.set('黑体')

文中代码和数据源已经打包好了,具体的地址:

链接:https://pan.baidu.com/s/11aUOqbnoY6PDpGXrzbzxDw

提取码:niub

详解用户流失原因分析该如何入手?

12000+字超详细 SQL 语法速成!

后台回复“入群”即可加入小z干货交流群
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/466368
推荐阅读
相关标签
  

闽ICP备14008679号