Python 实现自动化 Excel 报表
Py 实现自动化Excel报表
好几个月没有写笔记了, 并非没有积累, 而是有点懒了. 想想还是要续上, 作为工作成长的一部分哦.
最近有做一些报表, 但一直找不到一个合适的报表工具, 又实在不想写前端, 后端... 思来想去, 感觉 Excel 就一定程度上能做可视化的, 除了不能动态交互外, 其他都挺好. 今天分享的就是一个关于如何用 Py 来自动化Excel 报表, 解放双手, 提高工作效率哦.
总体解决方案

输出报表
当然是测试用的假数据啦.

自动化Py脚本
基本思路:
1. 准备模板数据需要的 SQL
2. 用 Pandas 连接 数据库 并执行 SQL, 返回 DataFrame
3. 用 Xlwings 直接打开 Excel, 并将这些 DataFrame 填充到 写死的 单元格
4. 保存并退出
具体代码如下哦:
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('172.28.1.158', 'sa', 'dwbbkkzw168', 'biee')
# 基础配置: 根据用户输入当前日期, 输出当月, 当季度第一天
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~~ 人生若只如初见呢~~')
打包 EXE 桌面小程序
最好用一个纯净的 虚拟环境打包.
终端命令: python -m venv 虚拟环境名称
然后进入脚本目录下, 进行打包哦.
pyinstaller main.py -F

打包成功后的样子.

双击运行即可哦.

这时候再重新打开该目录下的 Excel 模板, 发现数据已经自动更新了.
我现在真的感受到, 用开发的思维做一些脚本工具, 真的会极大提高我现在当文员的很多重复性工作哦!
Python 实现自动化 Excel 报表的更多相关文章
- python自动生成excel报表
1.将SQL语句查询的内容,直接写入到excel报表中,以下为全部脚本.要求:此版本必须运维在windows平台,并且安装了excel程序,excel版本不限. python版本为2.7 if b 判 ...
- python接口自动化--Excel
1.操作步骤: (1)安装python官方Excel库-->xlrd (2)获取Excel文件位置并读取 (3)读取sheet (4)读取指定rows和cols内容 2.示例代码 # -*- c ...
- python接口自动化21-下载excel文件(Content-Type:octets/stream)
前言 Content-Type类型为octets/stream,这种一般是文件类型了,比如有时候需要导出excel数据,下载excel这种场景如何用python来实现呢? 抓下载接口 1.下载的场景如 ...
- python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图
python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...
- python制作简单excel统计报表2之操作excel的模块openpyxl简单用法
python制作简单excel统计报表2之操作excel的模块openpyxl简单用法 # coding=utf-8 from openpyxl import Workbook, load_workb ...
- 【python接口自动化】- openpyxl读取excel数据
前言:目前我们进行测试时用于存储测试数据的软件几乎都是excel,excel方便存储和管理数据,读取数据时也比较清晰,测试时我们需要从excel从读取测试数据,结束后还需把测试结果写入到excel中, ...
- Python+reuqests自动化接口测试
1.最近自己在摸索Python+reuqests自动化接口测试,要实现某个功能,首先自己得有清晰的逻辑思路!这样效率才会很快! 思路--1.通过python读取Excel中的接口用例,2.通过pyth ...
- 数据测试001:利用python连接数据库插入excel数据
数据测试001:利用python连接数据库插入excel数据 最近在做数据测试,主要是做报表系统,需要往数据库插入数据验证服务逻辑,本次介绍如何利用python脚本插入Oracle和Mysql库中: ...
- 最全总结 | 聊聊 Python 办公自动化之 Excel(中)
1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) 本篇文章将继续聊另外一 ...
随机推荐
- Self-publishing 自出版
Self-publishing 自出版 出书 传统出版 在过去的几十年中,发布意味着要经过代理商和发布者. 自出版 如今,自助出版允许作者绕过出版商和书店,直接向公众出售. refs https:// ...
- img & srcset
img & srcset 性能优化 <img class="fn tj s t u fa ai ht" width="3700" height=& ...
- Web Share API
Web Share API https://w3c.github.io/web-share/ Web Share API, W3C Editor's Draft 15 April 2020 https ...
- Micro Frontends & microservices
Micro Frontends & microservices https://micro-frontends.org/ https://github.com/neuland/micro-fr ...
- 这一篇TCP总结请收下
前言 很高兴遇见你~ TCP这些东西,基本每个程序猿都或多或少是掌握的了.虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊 而最近大家伙过完年,也都在准备春招,我也一样.阅读了一些okHttp源 ...
- 搭建Elasticsearch可视化界面 Kibana
前言 每一个版本的es都有一个对应的Kibana版本,建议和es相同版本,官网地址: 点击进入下载地址 步骤 1.解压 tar -zxvf kibana-7.2.0-linux-x86_64 2.修改 ...
- Java基本概念:异常
一.简介 描述: 异常(Exception)指不期而至的各种状况,异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 异常 ...
- 剑指 Offer 17. 打印从1到最大的n位数
剑指 Offer 17. 打印从1到最大的n位数 Offer 17 题目解析: 暴力解法 package com.walegarrett.offer; /** * @Author WaleGarret ...
- CCF(公共钥匙盒):思维+模拟
公共钥匙盒 201709-2 这题的思路一开始不是很清晰,一开始想用贪心去做.但是发现按照题目的思路不对.所以这里采用的是类似于多项式的加减的处理. #include<iostream> ...
- js浅拷贝(地址引用)和深拷贝(克隆)
浅拷贝和深拷贝相对于引用类型而言的. js有两大类型值类型(基本数据类型)和引用类型(object,function,array): 值类型保存在栈上,引用类型保存在堆上. 浅拷贝只是单纯的拷贝对象的 ...