很多做文员的小姐姐一直在说做报表好麻烦呀,但一直找不到一个合适的报表工具,这不… 思来想去,感觉 Excel 就一定程度上能做可视化的, 除了不能动态交互外, 其他都挺好.。今天分享的就是一个关于如何用 Python来自动化Excel 报表, 解放双手, 提高工作效率。
总体解决方案
输出报表
当然是测试用的假数据啦。
自动化Py脚本
基本思路:
- 准备模板数据需要的 SQL
- 用 Pandas 连接 数据库 并执行 SQL, 返回 DataFrame
- 用 Xlwings 直接打开 Excel, 并将这些 DataFrame 填充到写死的单元格
- 保存并退出
具体代码如下呀:
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', '