导读:
在日常工作中,可能会有一些重复无聊的任务,比如说,从 Excel 或数据库中收集一些数据,设置相应的数据格式并做成报表。
类似这种重复无聊的任务,我们完全可以交给 Python 去自动完成,只要第一次把 Python 代码写好,以后就可以一键完成,省时省力,还不容易出错,这是提升工作质量和工作效率的利器,让我们能够腾出时间和精力,去做更有价值的事情。
作者 / 来源:林骥(ID:linjiwx)
01 安装和导入模块
以 Python 中的 openpyxl 模块为例,它能够读取和修改 Excel 文件,如果你还没有安装,可以通过以下命令进行安装:
pip install openpyxl
要测试 openpyxl 是否正确安装,可以在 Jupyter Lab 中运行以下代码:
# 导入库
import
openpyxl
# 查看版本
openpyxl.__version__
如果该模块正确安装,那么会输出版本号,假如你在使用过程中遇到问题,可以查阅官方文档。
02 读取和处理数据
为了演示用 Python 自动生成 Excel 报表,我从网上找了一个数据集,是一家跨国公司的 54 万多行在线零售业务的交易数据,你可以进入公众号「林骥」的后台,回复「零售」两个字,获取该数据集的完整下载链接。
把这个数据文件保存到代码上级目录的 data 文件夹,然后用 Pandas 读取它:
# 读取数据
import
pandas
as
pd
df = pd.read_excel(
'../data/Online Retail.xlsx'
)
其中每一列代表的含义如下:
InvoiceNo:发票编号
StockCode:产品代码
Deion:产品名称
Quantity:产品数量
InvoiceDate:开票时间
UnitPrice:产品单价
CustomerID:客户编号
Country:国家名称
为了统计每天的销售额,我们先在数据中增加两列:日期和销售额,然后用函数实现汇总:
# 从时间列中提取日期
df[
'日期'
] = df.InvoiceDate.dt.to_period(
'D'
).astype(str)
# 计算销售额
df[
'销售额'
] = df.Quantity * df.UnitPrice
# 汇总每天的销售额
df_daily = pd.DataFrame(df.groupby(
'日期'
)[
'销售额'
].agg(
'sum'
)).reset_index
df_daily
03 设置和保存报表
接下来,我们对表格进行相应的设置,包括:重命名工作表、把数据写入工作表、自定义标题和表格边框样式、设置行高和列宽、不显示网格线、冻结窗格、自动筛选、设置日期和数字格式等等。
from
openpyxl.utils.dataframe
import
dataframe_to_rows
from
openpyxl.styles
import
Font, Color, NamedStyle, Border, Side, PatternFill, Alignment, numbers
# 创建工作簿
wb = openpyxl.Workbook
# 激活工作表
ws = wb.active
# 重命名工作表
ws.title =
'每日销售额'
# 把数据写入工作表
for
row
in
dataframe_to_rows(df_daily, index=
False
, header=
True
):
ws.append(row)
# 创建自定义的标题样式
mytitle = NamedStyle(name=
'mytitle'
)
mytitle.font = Font(bold=
True
, size=
11
, color=
'FFFFFF'
)
bd = Side(style=
'thin'
, color=
'A6A6A6'
)
mytitle.border = Border(left=bd, top=bd, right=bd, bottom=bd)
mytitle.fill = PatternFill(
'solid'
, fgColor=
'00589F'
)
mytitle.alignment = Alignment(horizontal=
'left'
, vertical=
'center'
)
wb.add_named_style(mytitle)
# 创建自定义表格边框样式
myborder = NamedStyle(name=
'myborder'
)
myborder.font = Font(bold=
False
, size=
11
, color=
'000000'
)
bd = Side(style=
'thin'
, color=
'A6A6A6'
)
myborder.border = Border(left=bd, top=bd, right=bd, bottom=bd)
myborder.alignment = Alignment(vertical=
'center'
)
wb.add_named_style(myborder)
# 应用标题样式
for
cell
in
ws[
1
]:
cell.style = mytitle
# 对表格区域加边框
from
openpyxl.utils
import
get_column_letter, column_index_from_string
table_range = ws[
'A2:'
+ get_column_letter(ws.max_column) + str(ws.max_row)]
for
row
in
table_range:
for
cell
in
row:
cell.style = myborder
# 设置行高和列宽
ws.row_dimensions[
1
].height =
26
ws.column_dimensions[
'A'
].width =
15
ws.column_dimensions[
'B'
].width =
12
# 设置不显示网格线
ws.views.sheetView[
0
].showGridLines =
False
# 冻结窗格
ws.freeze_panes =
'A3'
# 自动筛选
ws.auto_filter.ref =
'A1:'
+ get_column_letter(ws.max_column) + str(ws.max_row)
# 设置对齐格式
for
cell
in
ws[
'A'
]:
cell.alignment = Alignment(horizontal=
'center'
, vertical=
'center'
)
# 设置日期格式
for
cell
in
ws[
'A'
]:
cell.number_format = numbers.FORMAT_DATE_YYYYMMDD2
# 设置数字格式
for
cell
in
ws[
'B'
]:
cell.number_format = numbers.BUILTIN_FORMATS[
3
]
最后,保存自动生成的 Excel 报表文件:
# 保存为新的表格
wb.save(
'../data/每日销售报表.xlsx'
)
打开这个新生成的 Excel 报表文件,其中的内容如下:
本文介绍了用 Python 自动生成 Excel 报表的一种方法,从 openpyxl 模块的安装和导入,到读取和处理数据,再到设置和保存报表,只要你把数据源放在合适的位置,就能在 Jupyter Lab 中一键运行,自动生成相应的报表。
你完全可以根据自己的实际情况,修改数据源和报表格式等设置,充分发挥自己的创意,生成个性化定制的报表。
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。