- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 实现自动化Excel报表的步骤由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
好几个月没有写笔记了, 并非没有积累, 而是有点懒了. 想想还是要续上, 作为工作成长的一部分哦. 。
最近有做一些报表, 但一直找不到一个合适的报表工具, 又实在不想写前端, 后端... 思来想去, 感觉 excel 就一定程度上能做可视化的, 除了不能动态交互外, 其他都挺好. 今天分享的就是一个关于如何用 py 来自动化excel 报表, 解放双手, 提高工作效率哦. 。
当然是测试用的假数据啦. 。
基本思路: 1. 准备模板数据需要的 sql 2. 用 pandas 连接 数据库 并执行 sql, 返回 dataframe 3. 用 xlwings 直接打开 excel, 并将这些 dataframe 填充到 写死的 单元格 4. 保存并退出 。
具体代码如下哦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
import
pandas as pd
import
xlwings as xw
import
pymssql
# 各品类月同期
def
get_last_year_sale(start_date, end_date):
"""各品类同期销量, 对比19年"""
sql_01
=
f
"""
select
品类
, sum(数量) as qty
from xxx
where 是否电商 = 1
and 销售时间 between dateadd(year, -2, '{start_date}') and dateadd(year, -2, '{end_date}')
group by 品类
"""
df
=
pd.read_sql(sql_01, con
=
con)
df_xtc
=
df[df[
'品类'
]
=
=
'a品类'
][[
'品类'
,
'qty'
]]
df_bbk
=
df[df[
'品类'
]
=
=
'b品类'
][[
'品类'
,
'qty'
]]
return
df_xtc, df_bbk
def
get_anget_sale(start_date, end_date):
"""返回各品类, 各区域的时间段销量"""
sql
=
f
"""
select
品类
, agent
, sum(数量) as qty
, row_number()over(partition by 品类 order by sum(数量) desc) my_rank
from xxx
where 是否电商 = 1
and 销售时间 between '{start_date}' and '{end_date}'
group by agent, 品类
"""
df
=
pd.read_sql(sql, con
=
con)
df_xtc
=
df[df[
'品类'
]
=
=
'a品类'
][[
'agent'
,
'qty'
]]
df_bbk
=
df[df[
'品类'
]
=
=
'b品类'
][[
'agent'
,
'qty'
]]
df_pad
=
df[df[
'品类'
]
=
=
'c品类'
][[
'agent'
,
'qty'
]]
return
df_xtc, df_bbk, df_pad
def
get_machine_sale(start_date, end_date):
"""返回各品类, 各区域的时间段销量"""
sql
=
f
"""
select
品类
, 机型
, sum(数量) as qty
, row_number()over(partition by 品类 order by sum(数量) desc) my_rank
from v_realsale
where 是否电商 = 1
and 销售时间 between '{start_date}' and '{end_date}'
group by 机型, 品类
"""
df
=
pd.read_sql(sql, con
=
con)
df_xtc
=
df[df[
'品类'
]
=
=
'a品类'
][[
'机型'
,
'qty'
]]
df_bbk
=
df[df[
'品类'
]
=
=
'b品类'
][[
'机型'
,
'qty'
]]
return
df_xtc, df_bbk
# main
con
=
pymssql.connect(
'xxxxx'
,
'sxxx'
,
'xxxxxx'
,
'xxxxx'
)
# 基础配置: 根据用户输入当前日期, 输出当月, 当季度第一天
print
(
"欢迎哦, 此小程序专门为xx看板做数据自动更新呢~"
)
print
()
today
=
input
(
"请输入截止日期(昨天), 形如: 2021/5/20 按回车结束: "
)
if
len
(today.split(
'/'
)) !
=
3
:
raise
"日期格式输入错误!!, 请按照形如 '2021/5/20'的格式重新输入"
else
:
m_cur
=
today.split(
'/'
)[
1
]
m_first_day
=
'2021/'
+
m_cur
+
'/1'
# 季度第一天
if
m_cur
in
(
'1'
,
'01'
,
'2'
,
'02'
,
'3'
,
'03'
):
q_time_start
=
'2021/1/1'
elif
m_cur
in
(
'4'
,
'04'
,
'5'
,
'05'
,
'6'
,
'06'
):
q_time_start
=
'2021/4/1'
elif
m_cur
in
(
'7'
,
'07'
,
'8'
,
'08'
,
'9'
,
'09'
):
q_time_start
=
'2021/7/1'
else
:
q_time_start
=
'2021/10/1'
print
()
print
(
"正在开始更新...."
)
print
(
"提示, 接下看到闪退, 是正常现象, 就程序模拟人去打开文件, 填充数据, 不要紧张哦~~~"
)
# 去年月, 季度同期
df_mm_xtc, df_mm_bbk
=
get_last_year_sale(m_first_day, today)
df_qq_xtc, df_qq_bbk
=
get_last_year_sale(q_time_start, today)
# 当月各地区累积销量
df_m_xtc, df_m_bbk, df_m_pad
=
get_anget_sale(m_first_day, today)
# 各地区当季度销量
df_q_xtc, df_q_bbk, df_q_pad
=
get_anget_sale(q_time_start, today)
# 各机型当季度销量
df_q_type_xtc, df_q_type_bbk
=
get_machine_sale(q_time_start, today)
# 过滤掉 销量为0的型号
df_q_type_xtc
=
df_q_type_xtc[df_q_type_xtc.qty >
0
]
df_q_type_xtc.replace(
'z6áû·å°æ'
,
'z6巅峰版'
, inplace
=
true)
df_q_type_bbk
=
df_q_type_bbk[df_q_type_bbk.qty >
0
]
# 打开excel 模板 等待数据填充
app
=
xw.app(visible
=
true, add_book
=
false)
app.display_alerts
=
false
# 关闭一些提示信息,可以加快运行速度。 默认为 true。
app.screen_updating
=
true
wb
=
app.books.
open
(
"xxx_全品类_看板.xlsx"
)
data_sht
=
wb.sheets[
'数据'
]
# 19年当月同期销量
data_sht.
range
(
'b9'
).value
=
df_mm_xtc.values
data_sht.
range
(
'g9'
).value
=
df_mm_bbk.values
# 当季度同比
data_sht.
range
(
'b10'
).value
=
df_qq_xtc.values
data_sht.
range
(
'g10'
).value
=
df_qq_bbk.values
# 填充各品类当月销量, 注意单元格是写死的哦
data_sht.
range
(
'i72'
).value
=
df_m_xtc.values
data_sht.
range
(
't72'
).value
=
df_m_bbk.values
data_sht.
range
(
'ae72'
).value
=
df_m_pad.values
# 填充当季度销量, 同理是写死的
data_sht.
range
(
'a54'
).value
=
df_q_xtc.values
data_sht.
range
(
'f54'
).value
=
df_q_bbk.values
data_sht.
range
(
'k54'
).value
=
df_q_pad.values
# 填充当季度各型号, 同理是写死的
data_sht.
range
(
'a21'
).value
=
df_q_type_xtc.values
data_sht.
range
(
'f21'
).value
=
df_q_type_bbk.values
wb.save()
app.quit()
print
()
print
(
"~~更新结束了哦~~"
)
print
()
input
(
"请按任意键退出~~"
)
print
()
print
(
'bye~~ 人生若只如初见呢~~'
)
|
最好用一个纯净的 虚拟环境打包. 。
终端命令: python -m venv 虚拟环境名称 。
然后进入脚本目录下, 进行打包哦. 。
pyinstaller main.py -f 。
打包成功后的样子. 。
双击运行即可哦. 。
这时候再重新打开该目录下的 excel 模板, 发现数据已经自动更新了. 。
我现在真的感受到, 用开发的思维做一些脚本工具, 真的会极大提高我现在当文员的很多重复性工作哦.
以上就是python 实现自动化excel报表的步骤的详细内容,更多关于python 自动化excel报表的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/chenjieyouge/p/14604277.html 。
最后此篇关于Python 实现自动化Excel报表的步骤的文章就讲到这里了,如果你想了解更多关于Python 实现自动化Excel报表的步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
背景 我有一个 Azure Runbook(名为 RunStoredProcedure2),定义如下: param( [parameter(Mandatory=$True)] [string] $Sq
我有一个名为“团队”的表,其中包含“非事件”列,另一个表“事件”,其中包含“时间”列。如果任何团队的“事件”中的最新日期发生在 X 时间之前,如何将“非事件”列更新(为 true)? 我知道这可以通过
下面的问题可能有点令人困惑,但我会尽力以最好的方式解释它。 假设我们为一家制造公司工作。它制造然后用于制造产品的组件。在以下示例中,有 3 个组件和 2 个最终产品。 组件和产品的需求如下: comp
我有代码可以让我在一个范围内选择一个项目: COleVariant vItems = cstrAddr; hr = AutoWrap(
我正在开发一个应用程序,该应用程序有 4 种语言的大约 50 个应用内购买,这给了我很多表单和子表单、框和子框,需要使用 iTunesConnect 的令人痛苦且设计糟糕的表单来填充。 我想知道是否有
我想在 Azure 自动化中使用 powershell 脚本来安排打开/关闭资源。 我想在不创建帐户的情况下执行此操作,因为我们的域强制重置密码。我知道自动化帐户会创建一个证书 - 当使用资源管理器(
我尝试从 azure 自动化 run book power shell 自动检索 azure SQL 数据库中的数据。我发现azure自动化帐户的模块中缺少SQL Server模块。我已经导入了该模块
我正在自动化 Outlook,并且需要控制电子邮件的发件人身份。用户将在 Outlook 中设置两个或多个帐户,我需要能够选择从哪个帐户发送电子邮件。有什么想法吗? 需要 Outlook 2003 及
我尝试从 azure 自动化 run book power shell 自动检索 azure SQL 数据库中的数据。我发现azure自动化帐户的模块中缺少SQL Server模块。我已经导入了该模块
假设我有一个网站,我可以(随时)登录并每隔 x 小时提交数据(单击登录后可见的链接),我将如何自动化此过程? 我构建了一个图形用户界面,它为用户(现在是我,为了我自己的方便)提供了一个包含一些信息的界
我正在开发一个程序,它的任务是我们为它定义一些号码(我们的一些手机号码)并且它应该在 Telegram 中注册它们,然后获取发送到该号码的所有消息。如您所知,在 Telegram 中注册需要提供电话号
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
最近我在处理 CSS Sprite 。一切正常。 我创建了一个 sprite、.css 文件和 html 结构。看起来像 .sprites{ background-image:url
我想为一款名为 Dune 2000 的策略游戏创建一个叠加层。令人讨厌的是,要创建 10 个士兵,每次完成一个都必须单击该图标。没有队列。因此,在不干扰游戏运行方式的情况下,我想听听鼠标移动的声音,当
我是 python 的初学者,我想从自动化开始。以下是我正在尝试执行的任务。 ssh -p 2024 root@10.54.3.32 root@10.54.3.32's password: 我尝试通过
当我将一些 urlencoded Javascript 粘贴到 Firefox 和 Chrome 上的 URL 时,我看到了一些奇怪的事情发生。是否可以使用此技术告诉 Chrome 访问 URL,然后
我需要将大量请求自动提交到基于云的数据库接口(interface) (Intelex)。没有任何方法可以批量提交某些操作,但是提交单个请求所必需的只是让经过身份验证的用户尝试打开 Web 链接。因此,
假设我有一个进程的内存转储。我想对其运行报告,所以基本上我想打开 WinDBG,加载 SOS 并运行一个脚本,该脚本运行一些命令,解析输出,然后基于此运行更多命令。 除了像 SendKeys 这样的
我正在使用 ffmpeg 创建视频剪辑。我想自动化该过程并保存剪辑,而无需手动为要保存的每个文件命名。这是我拥有的代码。它将创建并保存剪辑,但只能使用扩展名和不是名字。 @echo off cd /d
我是一名优秀的程序员,十分优秀!