Py 实现自动化Excel报表

好几个月没有写笔记了, 并非没有积累, 而是有点懒了. 想想还是要续上, 作为工作成长的一部分哦.

最近有做一些报表, 但一直找不到一个合适的报表工具, 又实在不想写前端, 后端... 思来想去, 感觉 Excel 就一定程度上能做可视化的, 除了不能动态交互外, 其他都挺好. 今天分享的就是一个关于如何用 Py 来自动化Excel 报表, 解放双手, 提高工作效率哦.

总体解决方案

输出报表

当然是测试用的假数据啦.

自动化Py脚本

  1. 基本思路:
  2. 1. 准备模板数据需要的 SQL
  3. 2. Pandas 连接 数据库 并执行 SQL, 返回 DataFrame
  4. 3. Xlwings 直接打开 Excel, 并将这些 DataFrame 填充到 写死的 单元格
  5. 4. 保存并退出

具体代码如下哦:

  1. import pandas as pd
  2. import xlwings as xw
  3. import pymssql
  4. # 各品类月同期
  5. def get_last_year_sale(start_date, end_date):
  6. """各品类同期销量, 对比19年"""
  7. sql_01 = f"""
  8. SELECT
  9. 品类
  10. , SUM(数量) AS QTY
  11. FROM XXX
  12. WHERE 是否电商 = 1
  13. AND 销售时间 BETWEEN DATEADD(YEAR, -2, '{start_date}') AND DATEADD(YEAR, -2, '{end_date}')
  14. GROUP BY 品类
  15. """
  16. df = pd.read_sql(sql_01, con=con)
  17. df_xtc = df[df['品类'] == 'A品类'][['品类', 'QTY']]
  18. df_bbk = df[df['品类'] == 'B品类'][['品类', 'QTY']]
  19. return df_xtc, df_bbk
  20. def get_anget_sale(start_date, end_date):
  21. """返回各品类, 各区域的时间段销量"""
  22. sql = f"""
  23. SELECT
  24. 品类
  25. , AGENT
  26. , SUM(数量) AS QTY
  27. , ROW_NUMBER()OVER(PARTITION BY 品类 ORDER BY SUM(数量) DESC) MY_RANK
  28. FROM XXX
  29. WHERE 是否电商 = 1
  30. AND 销售时间 BETWEEN '{start_date}' AND '{end_date}'
  31. GROUP BY AGENT, 品类
  32. """
  33. df = pd.read_sql(sql, con=con)
  34. df_xtc = df[df['品类'] == 'A品类'][['AGENT', 'QTY']]
  35. df_bbk = df[df['品类'] == 'B品类'][['AGENT', 'QTY']]
  36. df_pad = df[df['品类'] == 'C品类'][['AGENT', 'QTY']]
  37. return df_xtc, df_bbk, df_pad
  38. def get_machine_sale(start_date, end_date):
  39. """返回各品类, 各区域的时间段销量"""
  40. sql = f"""
  41. SELECT
  42. 品类
  43. , 机型
  44. , SUM(数量) AS QTY
  45. , ROW_NUMBER()OVER(PARTITION BY 品类 ORDER BY SUM(数量) DESC) MY_RANK
  46. FROM V_REALSALE
  47. WHERE 是否电商 = 1
  48. AND 销售时间 BETWEEN '{start_date}' AND '{end_date}'
  49. GROUP BY 机型, 品类
  50. """
  51. df = pd.read_sql(sql, con=con)
  52. df_xtc = df[df['品类'] == 'A品类'][['机型', 'QTY']]
  53. df_bbk = df[df['品类'] == 'B品类'][['机型', 'QTY']]
  54. return df_xtc, df_bbk
  55. # main
  56. con = pymssql.connect('172.28.1.158', 'sa', 'dwbbkkzw168', 'biee')
  57. # 基础配置: 根据用户输入当前日期, 输出当月, 当季度第一天
  58. print("欢迎哦, 此小程序专门为XX看板做数据自动更新呢~")
  59. print()
  60. today = input("请输入截止日期(昨天), 形如: 2021/5/20 按回车结束: ")
  61. if len(today.split('/')) != 3:
  62. raise "日期格式输入错误!!, 请按照形如 '2021/5/20'的格式重新输入"
  63. else:
  64. m_cur = today.split('/')[1]
  65. m_first_day = '2021/' + m_cur + '/1'
  66. # 季度第一天
  67. if m_cur in ('1', '01', '2', '02', '3', '03'):
  68. q_time_start = '2021/1/1'
  69. elif m_cur in ('4', '04', '5', '05', '6', '06'):
  70. q_time_start = '2021/4/1'
  71. elif m_cur in ('7', '07', '8', '08', '9', '09'):
  72. q_time_start = '2021/7/1'
  73. else:
  74. q_time_start = '2021/10/1'
  75. print()
  76. print("正在开始更新....")
  77. print("提示, 接下看到闪退, 是正常现象, 就程序模拟人去打开文件, 填充数据, 不要紧张哦~~~")
  78. # 去年月, 季度同期
  79. df_mm_xtc, df_mm_bbk = get_last_year_sale(m_first_day, today)
  80. df_qq_xtc, df_qq_bbk = get_last_year_sale(q_time_start, today)
  81. # 当月各地区累积销量
  82. df_m_xtc, df_m_bbk, df_m_pad = get_anget_sale(m_first_day, today)
  83. # 各地区当季度销量
  84. df_q_xtc, df_q_bbk, df_q_pad = get_anget_sale(q_time_start, today)
  85. # 各机型当季度销量
  86. df_q_type_xtc, df_q_type_bbk = get_machine_sale(q_time_start, today)
  87. # 过滤掉 销量为0的型号
  88. df_q_type_xtc = df_q_type_xtc[df_q_type_xtc.QTY > 0]
  89. df_q_type_xtc.replace('Z6áÛ·å°æ', 'Z6巅峰版', inplace=True)
  90. df_q_type_bbk = df_q_type_bbk[df_q_type_bbk.QTY > 0]
  91. # 打开excel 模板 等待数据填充
  92. app = xw.App(visible=True, add_book=False)
  93. app.display_alerts = False # 关闭一些提示信息,可以加快运行速度。 默认为 True。
  94. app.screen_updating = True
  95. wb = app.books.open("XXX_全品类_看板.xlsx")
  96. data_sht = wb.sheets['数据']
  97. # 19年当月同期销量
  98. data_sht.range('B9').value = df_mm_xtc.values
  99. data_sht.range('G9').value = df_mm_bbk.values
  100. # 当季度同比
  101. data_sht.range('B10').value = df_qq_xtc.values
  102. data_sht.range('G10').value = df_qq_bbk.values
  103. # 填充各品类当月销量, 注意单元格是写死的哦
  104. data_sht.range('I72').value = df_m_xtc.values
  105. data_sht.range('T72').value = df_m_bbk.values
  106. data_sht.range('AE72').value = df_m_pad.values
  107. # 填充当季度销量, 同理是写死的
  108. data_sht.range('A54').value = df_q_xtc.values
  109. data_sht.range('F54').value = df_q_bbk.values
  110. data_sht.range('K54').value = df_q_pad.values
  111. # 填充当季度各型号, 同理是写死的
  112. data_sht.range('A21').value = df_q_type_xtc.values
  113. data_sht.range('F21').value = df_q_type_bbk.values
  114. wb.save()
  115. app.quit()
  116. print()
  117. print("~~更新结束了哦~~")
  118. print()
  119. input("请按任意键退出~~")
  120. print()
  121. print('BYE~~ 人生若只如初见呢~~')

打包 EXE 桌面小程序

最好用一个纯净的 虚拟环境打包.

  1. 终端命令: python -m venv 虚拟环境名称

然后进入脚本目录下, 进行打包哦.

  1. pyinstaller main.py -F

打包成功后的样子.

双击运行即可哦.

这时候再重新打开该目录下的 Excel 模板, 发现数据已经自动更新了.

我现在真的感受到, 用开发的思维做一些脚本工具, 真的会极大提高我现在当文员的很多重复性工作哦!

Python 实现自动化 Excel 报表的更多相关文章

  1. python自动生成excel报表

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

  2. python接口自动化--Excel

    1.操作步骤: (1)安装python官方Excel库-->xlrd (2)获取Excel文件位置并读取 (3)读取sheet (4)读取指定rows和cols内容 2.示例代码 # -*- c ...

  3. python接口自动化21-下载excel文件(Content-Type:octets/stream)

    前言 Content-Type类型为octets/stream,这种一般是文件类型了,比如有时候需要导出excel数据,下载excel这种场景如何用python来实现呢? 抓下载接口 1.下载的场景如 ...

  4. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...

  5. python制作简单excel统计报表2之操作excel的模块openpyxl简单用法

    python制作简单excel统计报表2之操作excel的模块openpyxl简单用法 # coding=utf-8 from openpyxl import Workbook, load_workb ...

  6. 【python接口自动化】- openpyxl读取excel数据

    前言:目前我们进行测试时用于存储测试数据的软件几乎都是excel,excel方便存储和管理数据,读取数据时也比较清晰,测试时我们需要从excel从读取测试数据,结束后还需把测试结果写入到excel中, ...

  7. Python+reuqests自动化接口测试

    1.最近自己在摸索Python+reuqests自动化接口测试,要实现某个功能,首先自己得有清晰的逻辑思路!这样效率才会很快! 思路--1.通过python读取Excel中的接口用例,2.通过pyth ...

  8. 数据测试001:利用python连接数据库插入excel数据

    数据测试001:利用python连接数据库插入excel数据 最近在做数据测试,主要是做报表系统,需要往数据库插入数据验证服务逻辑,本次介绍如何利用python脚本插入Oracle和Mysql库中: ...

  9. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

随机推荐

  1. 知乎 bug

    知乎 bug shit zhihu https://zhuanlan.zhihu.com/p/111809590 无法展开评论 https://unpkg.zhimg.com/@cfe/sentry- ...

  2. node.js & read argv

    node.js & read argv https://nodejs.org/docs/latest/api/process.html https://flaviocopes.com/node ...

  3. 口罩 & 防毒面具 N95 & P100

    口罩 & 防毒面具 N95 & P100 N95 口罩 < 防毒面具 P100 https://www.techritual.com/2020/01/30/210599/

  4. Baccarat如何点燃DEFI市场?

    目前DeFi是成为了各大生态的"兵家必争之地",与此同时DeFi的高收益也成为吸引散户入局的一个利器.而虽然流动性挖矿板块近期的温度有所下降,但是这其中不乏还是有很多收益颇丰的De ...

  5. 冷饭新炒:理解JWT的实现原理和基本使用

    前提 这是<冷饭新炒>系列的第五篇文章. 本文会翻炒一个用以产生访问令牌的开源标准JWT,介绍JWT的规范.底层实现原理.基本使用和应用场景. JWT规范 很可惜维基百科上没有搜索到JWT ...

  6. 【HTB系列】靶机Access的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...

  7. [Android搞机]修改build.prop解决类原生无法链接12、13信道wifi问题

    最近xda找包刷了个机,发现没法搜到12.13信道.所有未本地化的类原生都有此问题. root后打开/system/build.prop 可以用 在build.prop中加入以下几句,重启即可连接12 ...

  8. Spirent Testcenter二层DHCP绑定流配置

    1.OLT配置 配一个VLAN,若GE口打Tag,不需要打PVID,打Untag,配PVID. 在ONU上配一个Other Bridge的WAN连接,并配置VLAN 2.TestCenter配置 选定 ...

  9. Java基础自学小项目

    实现一个基于文本界面的<家庭记账软件> 需求:能够记录家庭的收入,支出,并能够收支明细表 主要涉及一下知识点: - 局部变量和基本数据类型 - 循环语句 - 分支语句 - 方法调用和返回值 ...

  10. GMS的概述

    1 GMS GMS全称为GoogleMobile Service,即谷歌移动服务. GMS是Google所提供的一系列移动服务,包括开发用的一系列服务和用户所用的Google Apps. Maps与L ...