原文
A Simple Guide to Automate Your Excel Reporting with Python
Use openpyxl to automate your Excel reporting with Python
作者
Frank Andrade

原文链接
https://towardsdatascience.com/a-simple-guide-to-automate-your-excel-reporting-with-python-9d35f143ef7

面对现实吧,无论我们的工作是什么,迟早我们都将不得不处理重复性任务,例如在 Excel 中更新每日报告。如果您在一家不使用 Python 的公司工作,情况可能会变得更糟,因为您无法通过 Python 来解决此问题。

但不用担心,你仍然可以使用你的Python技能自动处理您的Excel报表,而不必说服你的老板要迁移到Python!你只需要使用 Python 模块openpyxl 告诉 Excel 你想通过 Python 做什么。与我之前写的一篇鼓励您从 Excel 迁移到 Python 的文章不同,使用 openpyxl,您可以在使用 Python 创建报告的同时坚持使用 Excel。

数据集

在本指南中,我们将使用带有销售数据的 Excel 文件,该文件类似于您在工作中制作报告需要输入的那些文件。你可以在Kaggle上下载这个文件;但是,它是 .csv 格式的,因此您应该将扩展名更改为 .xlsx 或从此 Google Drive 链接下载(我已经将文件名更改为 supersor_sales.xlsx)

在编写任何代码之前,请查看 Google Drive 上的文件并熟悉它。我们将使用该文件通过 Python 创建如下报表。

现在让我们制作该报告并使用 Python 使其自动化!

用 Pandas 制作数据透视表

导入库

现在您下载了 Excel 文件,让我们导入我们将在本指南中使用的库。

import pandas as pd
import openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.chart import BarChart, Reference
import string

我们将使用 Pandas 读取 Excel 文件、创建数据透视表并将其导出到 Excel。然后我们将使用 Openpyxl 库通过 Python 编写 Excel 公式、制作图表和格式化电子表格。最后,我们将创建一个 Python 函数来自动化这个过程。

注意:如果您没有在 Python 中安装这些库,您可以通过在终端或命令提示符下输入 pip install pandas 和 pip install openpyxl 来安装它们。

读取 Excel 文件

在我们读取 Excel 文件之前,请确保该文件与您的 Python 脚本所在的位置相同。然后,使用 pd.read_excel() 读取 Excel 文件,代码如下。

excel_file = pd.read_excel('supermarket_sales.xlsx')
excel_file[['Gender', 'Product line', 'Total']]

该文件有很多列,但我们将只使用 Gender、Product line 和 Total 列来创建报表。为了向您展示它们的外观,我使用双括号选择了它们。如果我们在 Jupyter Notebooks 上打印它,您将看到以下看起来像 Excel 电子表格的数据框。

制作数据透视表

我们可以从上面的 excel_file 数据框 (dataframe) 轻松创建数据透视表。我们只需要使用(dataframe 的) .pivot_table() 方法。假设我们要创建一个数据透视表,显示男性和女性在不同产品线上花费的总金额。为此,我们编写了以下代码。

report_table = excel_file.pivot_table(index='Gender', columns='Product line', values='Total', aggfunc='sum').round(0)

report_table 应该是下面这个样子。

将数据透视表导出到 Excel 文件

要导出之前创建的数据透视表,我们使用 .to_excel()方法。在括号内,我们必须写出输出 Excel 文件的名称。在这种情况下,我将这个文件命名为report_2021.xlsx

我们还可以指定要创建的工作表的名称以及数据透视表应位于哪个单元格中。

report_table.to_excel('report_2021.xlsx', sheet_name='Report', startrow=4)

现在 Excel 文件导出到 Python 脚本所在的同一文件夹中。

使用 Openpyxl 制作报表

每次我们想要访问工作簿时,我们都会使用从 openpyxl 导入的 load_workbook,然后使用 .save() 方法保存它。在接下来的部分中,我将在每次修改工作簿时加载和保存工作簿;但是,您只需执行一次(如本指南末尾显示的完整代码)

创建行和列引用

为了自动化报告,我们需要获取最小和最大活动列/行,因此即使我们添加更多数据,我们要编写的代码也能继续工作。
要获取工作簿中的引用,我们首先加载工作簿 load_workbook() 并定位我们要使用的工作表 wb[‘name_of_sheet’]。然后我们使用 .active 访问活动单元格

wb = load_workbook('report_2021.xlsx')
sheet = wb['Report']
# 单元格引用(当前工作表)
min_column = wb.active.min_column
max_column = wb.active.max_column
min_row = wb.active.min_row
max_row = wb.active.max_row

您可以打印创建的变量以了解它们的含义。对于这个例子,我们得到这些数字。

Min Columns: 1
Max Columns: 7
Min Rows: 5
Max Rows: 7

打开 report_2021.xlsx,以验证这一点。

如上图所示,最小行为 5,最大行为 7。此外,最小列为 A (1),最大列为 G (7)。这些参考信息非常有用。

通过Python添加Excel图表

要从我们创建的数据透视表创建 Excel 图表,我们需要使用之前导入的模块 Barchart。为了识别数据和类别值的位置,我们使用 openpyxl的 Reference模块(Reference 在本文开头导入)

wb = load_workbook('report_2021.xlsx')
sheet = wb['Report']
# barchart
barchart = BarChart()
# 定位数据和类别
data = Reference(sheet, min_col=min_column+1, max_col=max_column, min_row=min_row, max_row=max_row) #包括标题
categories = Reference(sheet, min_col=min_column, max_col=min_column, min_row=min_row+ 1, max_row=max_row) #不包括标题# 添加数据和类别
barchart.add_data(data, titles_from_data=True)
barchart.set_categories(categories)# 定位图表
sheet.add_chart(barchart, "B12")barchart.title = 'Sales by Product line'
barchart.style = 5 #选择图表样式wb.save('report_2021.xlsx')

编写该代码后,report_2021.xlsx文件应如下所示。

分解代码:

  • barchart = BarChart() 从Barchart 类初始化一个变量 barchart
  • data 和 categories 是代表信息所在位置的变量。我们使用上面定义的列和行引用来自动执行此操作。另外,请记住,我将标题包含在data 但不包含在 categories
  • 我们使用 add_data 和 set_categories 将必要的数据添加到 barchart. 在 add_data 我添加了titles_from_data=True 因为我包含了标题
  • 我们使用 sheet.add_chart 来指定我们想要添加到“报表”的内容以及我们想要添加的单元格
  • 我们可以使用 barchart.title 和 barchart.style 修改默认标题和图表样式
  • 使用 wb.save() 保存所有更改

通过 Python 应用 Excel 公式

您可以通过 Python 编写 Excel 公式,就像在 Excel 工作表中编写一样。例如,假设我们希望对单元格 B5 和 B6 中的数据求和,并以货币样式将其显示在单元格 B7 中。

sheet['B7'] = '=SUM(B5:B6)'
sheet['B7'].style = 'Currency'

这很简单,对吧?我们可以从 B 列到 G 重复,或者使用 for 循环来自动化它。但首先,我们需要获取字母表,以将其作为 Excel 中列名称的引用(A、B、C……)。为此,我们使用 string 库并编写以下代码。

import string
alphabet = list(string.ascii_uppercase)
excel_alphabet = alphabet[0:max_column]
print(excel_alphabet)

如果我们打印这个,我们将获得从 A 到 G 的列表。

发生这种情况是因为,首先,我们创建了一个从 A 到 Z的列表,然后我们取了一个切片[0:max_column]来匹配这个列表的长度 (7) 与字母表的前 7 个字母 (A-G)。

注意:Python 列表从 0 开始,因此 A=0、B=1、C=2,依此类推。此外,[a:b] 切片符号采用 ba 元素(以“a”开头并以“b-1”结尾)

在此之后,我们可以对列进行循环并应用求和公式,但现在使用列引用,而不是这样写,

sheet['B7'] = '=SUM(B5:B6)'
sheet['B7'].style = 'Currency'

现在我们包含引用并将其放入 for 循环中。

wb = load_workbook('report_2021.xlsx')
sheet = wb['Report']
# sum in columns B-G
for i in excel_alphabet:if i!='A':sheet[f'{i}{max_row+1}'] = f'=SUM({i}{min_row+1}:{i}{max_row})'sheet[f'{i}{max_row+1}'].style = 'Currency'# adding total label
sheet[f'{excel_alphabet[0]}{max_row+1}'] = 'Total'
wb.save('report_2021.xlsx')

运行代码后,我们在 B 到 G 之间的列的“总计”行中得到 =SUM 公式。

分解代码:
for i in excel_alphabet 循环遍历所有活动列,但随后我们排除了 A 列,if i!=‘A’ 因为 A 列不包含数字数据
sheet[f’{i}{max_row+1}’] = f’=SUM({i}{min_row+1}:{i}{max_row}’ 与写入相同,sheet[‘B7’] = ‘=SUM(B5:B6)’ 但现在我们对 A 到 G 列执行此操作
sheet[f’{i}{max_row+1}’].style = ‘Currency’ 为最大行以下的单元格提供货币样式。
我们将“总计”标签添加到最大行下方的 A 列中sheet[f’{excel_alphabet[0]}{max_row+1}’] = ‘Total’

格式化报告表

为了完成报告,我们可以添加标题、副标题并自定义其字体。

wb = load_workbook('report_2021.xlsx')
sheet = wb['Report']
sheet['A1'] = 'Sales Report'
sheet['A2'] = '2021'
sheet['A1'].font = Font('Arial', bold=True, size=20)
sheet['A2'].font = Font('Arial', bold=True, size=10)
wb.save('report_2021.xlsx')

你可以在 Font() 里面添加其他参数。在此网站上,您可以找到可用样式列表。

最终报告应如下图所示。

使用 Python 函数自动化报表

现在报告已经准备好了,我们可以把到目前为止编写的所有代码放在一个自动化报告的函数中,所以下次我们要制作这个报告时,我们只需要引入文件名并运行它。
注意:为了让这个函数起作用,文件名应该具有“sales_month.xlsx”结构另外,我添加了几行代码,使用销售文件的月份/年份名称作为变量,所以我们可以重用它在报告的输出文件和副标题中。
下面的代码可能看起来很吓人,但这只是我们迄今为止编写的代码以及新变量file_name, month_name, 和 month_and_extension.

import pandas as pd
import openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.chart import BarChart, Reference
import stringdef automate_excel(file_name):"""The file name should have the following structure: sales_month.xlsx"""# read excel fileexcel_file = pd.read_excel(file_name)# make pivot tablereport_table = excel_file.pivot_table(index='Gender', columns='Product line', values='Total', aggfunc='sum').round(0)# splitting the month and extension from the file namemonth_and_extension = file_name.split('_')[1]# send the report table to excel filereport_table.to_excel(f'report_{month_and_extension}', sheet_name='Report', startrow=4)# loading workbook and selecting sheetwb = load_workbook(f'report_{month_and_extension}')sheet = wb['Report']# cell references (original spreadsheet)min_column = wb.active.min_columnmax_column = wb.active.max_columnmin_row = wb.active.min_rowmax_row = wb.active.max_row# adding a chartbarchart = BarChart()data = Reference(sheet, min_col=min_column+1, max_col=max_column, min_row=min_row, max_row=max_row) #including headerscategories = Reference(sheet, min_col=min_column, max_col=min_column, min_row=min_row+1, max_row=max_row) #not including headersbarchart.add_data(data, titles_from_data=True)barchart.set_categories(categories)sheet.add_chart(barchart, "B12") #location chartbarchart.title = 'Sales by Product line'barchart.style = 2 #choose the chart style# applying formulas# first create alphabet list as references for cellsalphabet = list(string.ascii_uppercase)excel_alphabet = alphabet[0:max_column] #note: Python lists start on 0 -> A=0, B=1, C=2. #note2 the [a:b] takes b-a elements# sum in columns B-Gfor i in excel_alphabet:if i!='A':sheet[f'{i}{max_row+1}'] = f'=SUM({i}{min_row+1}:{i}{max_row})'sheet[f'{i}{max_row+1}'].style = 'Currency'sheet[f'{excel_alphabet[0]}{max_row+1}'] = 'Total'# getting month namemonth_name = month_and_extension.split('.')[0]# formatting the reportsheet['A1'] = 'Sales Report'sheet['A2'] = month_name.title()sheet['A1'].font = Font('Arial', bold=True, size=20)sheet['A2'].font = Font('Arial', bold=True, size=10)wb.save(f'report_{month_and_extension}')return

将该函数应用于单个 Excel 文件

假设我们下载的原始文件名为“sales_2021.xlsx”,而不是“supermarket_sales.xlsx”,这样我们就可以将公式应用到报告中,如下所示

automatic_excel('sales_2021.xlsx')

运行此代码后,您将在 Python 脚本所在的文件夹中看到一个名为“report_2021.xlsx”的 Excel 文件。

将该函数应用于多个 Excel 文件

假设现在我们只有每月的 Excel 文件“sales_january.xlsx”、“sales_february.xlsx”和“sales_march.xlsx”(你可以在我的Github上找到这些文件来测试它们)

您可以一一应用公式以获得3份报告

automate_excel('sales_january.xlsx')
automate_excel('sales_february.xlsx')
automate_excel('sales_march.xlsx')

或者您可以先使用连接它们pd.concat(),然后只应用一次该函数。

# read excel files
excel_file_1 = pd.read_excel('sales_january.xlsx')
excel_file_2 = pd.read_excel('sales_february.xlsx')
excel_file_3 = pd.read_excel('sales_march.xlsx')
# concatenate files
new_file = pd.concat([excel_file_1,excel_file_2,excel_file_3], ignore_index=True)
# export file
new_file.to_excel('sales_2021.xlsx')
# apply function
automate_excel('sales_2021.xlsx')

安排 Python 脚本每月、每周或每天运行

您可以安排我们在本指南中编写的 Python 脚本随时在您的计算机上运行。您只需要分别在 Windows 和 Mac 上使用任务计划程序或 crontab。

如果您不知道如何安排工作,请单击下面的指南以了解如何进行。

https://towardsdatascience.com/how-to-easily-automate-your-python-scripts-on-mac-and-windows-459388c9cc94

就是这样!在本文中,您学习了如何自动化基本 Excel 报告;但是,一旦您掌握了 Pandas 库,您就可以自己做更多事情。在下面的链接中,您可以找到我专门为 Excel 用户编写的 Pandas 的完整指南。

https://towardsdatascience.com/a-complete-yet-simple-guide-to-move-from-excel-to-python-d664e5683039

我还制作了一份指南,帮助您使用 Python 构建您的第一个机器学习模型。

https://towardsdatascience.com/a-beginners-guide-to-text-classification-with-scikit-learn-632357e16f3a

你可以在我的Github上找到这个分析背后的代码。

[译] Python 自动处理 Excel 报表相关推荐

  1. pandas如何保存在excel里面_省时省力!教你如何用Python将Excel报表自动化

    全文共2391字,预计学习时长14分钟 图源:morioh 工作中,无穷无尽的表格有时会令人抓狂.Excel无处不在,即便有着像Python这样的强大工具任你使用,你也难以从中逃脱. 也许你的老板和同 ...

  2. python自动化表格处理软件_Python自动化处理Excel报表,我的工作更轻松了!

    没有转义的Excel! Excel无处不在,即使我们使用了Python之类强大的辅助工具,依然无法摆脱Excel. 因为你的老板和同事仍然需要方便的方法来访问重要数据. 但是,这并不意味着你不能通过使 ...

  3. python excelwriter保存路径_Python自动化处理Excel报表,我的工作更轻松了!

    没有转义的Excel! Excel无处不在,即使我们使用了Python之类强大的辅助工具,依然无法摆脱Excel.因为你的老板和同事仍然需要方便的方法来访问重要数据.但是,这并不意味着你不能通过使用P ...

  4. 工作表格excel用python_Python自动化处理Excel报表,工作更轻松

    没有转义的Excel! Excel无处不在,即使我们使用了Python之类强大的辅助工具,依然无法摆脱Excel. 因为你的老板和同事仍然需要方便的方法来访问重要数据. 但是,这并不意味着你不能通过使 ...

  5. 常见python操作excel库比较

    1. 常见工具 根据python读写excel等数据文件方法汇总,其实有很多可以读写excel文件的python库. 例如: xlrd库: 从excel中读取数据,支持xls.xlsx xlwt库: ...

  6. python自动生成excel报表

    1.将SQL语句查询的内容,直接写入到excel报表中,以下为全部脚本.要求:此版本必须运维在windows平台,并且安装了excel程序,excel版本不限. python版本为2.7 if b 判 ...

  7. Python 每日定时查询数据库生成Excel报表,并群发邮件

    最近在做游戏打点数据的一些统计处理,写了个Python脚本完成每日定时自动查询生成Excel报表并群发邮件的小功能. 拆解几个需求点: 一.连接数据库并查询 以下是一个查询总注册人数的示例代码,hos ...

  8. python自动汇总表格_用Python自动生成Excel报表

    作者 / 来源:林骥(ID:linjiwx) 01 安装和导入模块 以 Python 中的 openpyxl 模块为例,它能够读取和修改 Excel 文件,如果你还没有安装,可以通过以下命令进行安装: ...

  9. 利用Python自动生成及发送Excel报表

    [需求] 日常工作中,经常需要制作excel报表,并通过邮件发送出去. [设计思路] 1.利用Python生成excel及发送邮件: 2.建立一张邮件发送配置表,用来配置所有需要发送的邮件基本信息:再 ...

最新文章

  1. 跨服务器post数据失败:验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 machineKey 配置指定了相同的 validationKey 和验证算法。的解决办法
  2. #pragma与__pragma的区别与联系2009-01-19 15:47__pragma与#pragma的功能相同,所不同的是:
  3. 安装 | R2021a链接及Matlab运行图
  4. ZOJ 1970 All in All
  5. ORACLE 普通表转换成分区表(在线重定义)
  6. 光纤收发器一定要成对使用吗?
  7. python RandomTrees特征编码
  8. 微信小程序登录流程总结 目录 1.1. 前端调用wx.login 。。给后端传递一个code 1 1.2. 开发者需要在开发者服务器后台调用 auth.code2Session,使用 code 换取
  9. C语言库函数WindowsSDK...
  10. WPF使用PictureBox
  11. 计算机的超级终端程序无法使用,超级终端怎么用?
  12. MT2503芯片平台方案开发项目资料介绍
  13. XGBOOST_航班延误预测
  14. 电脑系统故障维修,系统C盘满了怎么办?教你c盘清理方法
  15. ZK实现SASL认证+Kafka连接ZK
  16. Java实现XML格式化输出
  17. 选择一款对的固定资产管理系统让固定资产管理轻松无比
  18. React 超详细入门教程
  19. 分页计算总页数算法:总页数=(总数-1)/每页数量+1----总页数=(总数+每页数量-1)/每页数量
  20. 生物虹膜识别技术开发者Iris ID使用CodeSonar实现DevSecOps

热门文章

  1. 如何使用Elasticsearch构建强大的搜索和分析应用程序(2023年最新ES新手教程)
  2. FPGA学习思维导图
  3. [css] css 3d 动画,跟随鼠标移动做球形旋转
  4. 数据库设置定期删除14天前的数据
  5. 面对众多云数据库,应该使用哪个云数据库好?
  6. 程序员薪酬,未来的薪酬趋势
  7. 捷联惯导知识点之非直角坐标系到直角坐标系
  8. wps无法打印_WPS+云办公如何进行文档加密
  9. 使用画图工具draw.io的嵌入模式实现uml图绘制功能的尝试(1)
  10. 帆软 大屏BI模板(含报表滚动,图表联动等)下载