Python如何批量修改替换Excel Power Query里面的SQL脚本
2021/7/20 19:35:56
本文主要是介绍Python如何批量修改替换Excel Power Query里面的SQL脚本,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景
我们现行的BI技术栈主要是Python
,MySQL
,Excel&PowerBI
,一般是ETL做好数据源和清洗之后,将其通过Power Query
加载到Excel里面,这样可以用最简单的Excel切片器交互,也方便我们自动刷新和分发报表.
我们以现行的一个模型为例,这个模型名为转介绍数控一.xlsx.它使用了我们常规的技术链
Python做ETL,SQL写脚本,Excel装载展示
问题
使用Power Query
做好的模型一般是写好的固定SQL脚本,不会轻易变动.
在这个模型中,一共有14个Power Query
查询,分别是:
- 更新日期提示x2
- 月维度x5个OD层级
- 日维度x5个OD层级
目前月维度固定的日期都是本月1号至当天,日维度都是当天,那么在SQL中也就是固定到了
# 当月1日 date_sub(curdate(),interval day(curdate())-1 day)
# 当日 curdate()
然而需求方的想法是非常不固定的,例如突然要昨天的,例如每月5号要一份上月的…
没关系,办法总比困难多
方案
我们有Python
,Python
有pywin32
.这个模块没有说明文档,但是这个模块是直接套用的VBA.
我们只需要写好py脚本,将日期设置为参数,每次运行修改参数就好
假设现在往前扩大一个月,从本月1号扩大到上月1号
from win32com.client import Dispatch # 导入pywin32 import os # 用来处理路径 #1 参数 FILENAMES = [ '【共和国】【月】转介绍表一.xlsx', '【共和国】【月】转介绍表二.xlsx', '【共和国】【月】转介绍表三.xlsx', '【共和国】【月】转介绍趋势.xlsx' ] FOLDER = r'E:\Onedrive\doc\for_share\Python_eco\excel' #2 处理 app = Dispatch('excel.application') # 打开Excel程序 app.Visible = -1 # 显示程序 for file in FILENAMES: # 循环表 filepath = os.path.join(FOLDER,file) # 路径合并成完整路径 wkb = app.Workbooks.Open(filepath) # 打开Excel文件 for p in wkb.Queries: # 遍历Power Queries replacePair = [ ('date_sub(curdate(),interval day(curdate())-1 day)', 'date_sub(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month)') ] # 替换文本 替换为文本 fml = p.formula for a in replacePair: fml = fml.replace(a[0],a[1]) p.formula = fml print('**REPLACED') wkb.Save() wkb.Close(1) print('**DONE')
总结
- 问题主要在于
pywin32
没有Excel操作相关的说明文档 - 问题的其次在于网络上也很少有VBA或者Python操作
Power Query
的现成代码 - 关键代码在于
wkb.Queries
和p.formula
这两个
打包
现在给这一块打包成函数,按照Python
国际惯例
def replacePowerQuery(filelist,replaceTuple): '''将Excel里面的Power Query SQL脚本替换部分词''' from win32com.client import Dispatch app = Dispatch('excel.application') app.Visible = -1 for file in filelist: wkb = app.Workbooks.Open(file) for p in wkb.Queries: fml = p.formula for a in replaceTuple: fml = fml.replace(a[0],a[1]) p.formula = fml print('**REPLACED') wkb.Save() wkb.Close(1) app.Quit() print('**DONE')
- filelist参数为列表或元组,元素为完整的文件路径
- replaceTuple为列表嵌套元组或者元组嵌套元组
# 使用示例 filelist = [ r'E:\Onedrive\doc\for_share\Python_eco\excel\【共和国】【月】转介绍表一.xlsx', r'E:\Onedrive\doc\for_share\Python_eco\excel\【共和国】【月】转介绍表二.xlsx', r'E:\Onedrive\doc\for_share\Python_eco\excel\【共和国】【月】转介绍表三.xlsx', r'E:\Onedrive\doc\for_share\Python_eco\excel\【共和国】【月】转介绍趋势.xlsx' ] replaceTuple = [ ('date_sub(curdate(),interval 1 day)','date_sub(curdate(),interval day(curdate()) day)'), ('date_sub(max(everyday),interval 1 day)','date_sub(max(everyday),interval day(max(everyday)) day)') ] replacePowerQuery(filelist,replaceTuple)
这篇关于Python如何批量修改替换Excel Power Query里面的SQL脚本的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程