Python如何批量修改替换Excel Power Query里面的SQL脚本

背景

我们现行的BI技术栈主要是Python,MySQL,Excel&PowerBI,一般是ETL做好数据源和清洗之后,将其通过Power Query加载到Excel里面,这样可以用最简单的Excel切片器交互,也方便我们自动刷新和分发报表.
我们以现行的一个模型为例,这个模型名为转介绍数控一.xlsx.它使用了我们常规的技术链

Python做ETL,SQL写脚本,Excel装载展示


问题

使用Power Query做好的模型一般是写好的固定SQL脚本,不会轻易变动.
在这个模型中,一共有14Power Query查询,分别是:

  • 更新日期提示x2
  • 月维度x5个OD层级
  • 日维度x5个OD层级

目前月维度固定的日期都是本月1号至当天,日维度都是当天,那么在SQL中也就是固定到了

# 当月1日
date_sub(curdate(),interval day(curdate())-1 day)	
# 当日
curdate()

然而需求方的想法是非常不固定的,例如突然要昨天的,例如每月5号要一份上月的…
在这里插入图片描述
没关系,办法总比困难多


方案

我们有Python,Pythonpywin32.这个模块没有说明文档,但是这个模块是直接套用的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')

总结

  1. 问题主要在于pywin32没有Excel操作相关的说明文档
  2. 问题的其次在于网络上也很少有VBA或者Python操作Power Query的现成代码
  3. 关键代码在于wkb.Queriesp.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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Power Query是一种数据处理工具,可用于将不同的数据源聚合并进行转换和筛选。而VBA则是一种微软的编程语言,可用于自动化执行Excel任务。那么,如何使用VBA来实现Power Query的高级筛选呢? 在VBA中,我们可以通过连接到Power Query并使用Power Query的筛选方法来实现高级筛选。首先,我们需要添加Power Query的引用,然后可以使用以下代码示例来实现: ``` Sub PowerQueryAdvancedFilter() '连接到Power Query Dim conn As WorkbookConnection Set conn = ThisWorkbook.Connections.Add2(Name:="Power Query", Description:="Connection to Power Query", _ ConnectionString:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=queryName") conn.Name = "Power Query" conn.Refresh '执行高级筛选 Dim ws As Worksheet Set ws = ThisWorkbook.Sheets.Add With ws.QueryTables.Add(Connection:=conn, Destination:=ws.Range("A1")) .CommandType = xlCmdSql .CommandText = "SELECT * FROM [queryName] WHERE columnName = 'filterValue'" .Refresh BackgroundQuery:=False End With '关闭并删除Power Query连接 conn.Delete End Sub ``` 在上述代码中,我们首先连接到Power Query,并执行高级筛选。我们可以使用SQL语句来指定筛选的条件,例如`SELECT * FROM [queryName] WHERE columnName = 'filterValue'`,其中`queryName`是Power Query的查询名称,`columnName`是要筛选的列名,`filterValue`是筛选的值。 最后,我们关闭并删除Power Query连接。这段代码可以根据实际情况进行修改和扩展,以满足不同的数据处理需求。 总之,通过使用VBA连接到Power Query,并使用Power Query的高级筛选方法,我们可以实现自动化地在Excel中进行数据筛选和转换。这样,我们可以节省大量的时间和人力成本,并提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但老师

要是看起来爽 求打赏一耳光

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值