Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Power Query 系列 (20) - 如何在外部使用Power Query提供的服务

Power Query 系列 (20) - 如何在外部使用Power Query提供的服务

原创
作者头像
StoneWM
修改于 2021-03-25 01:46:23
修改于 2021-03-25 01:46:23
3.1K0
举报
文章被收录于专栏:Stone的专栏Stone的专栏

Power Query 作为桌面端数据清理和转换的工具,能极大解放生产力,将繁琐的数据处理工作从重复的劳动中解放出来。那么,Power Query 能否对外提供计算服务呢?或者说 Power Query 有没有对外提供的编程接口? 根据我的探索,似乎没有,但在网络上找到下面的两种 walkaround 方式,都比较小众。所以如果真的需要数据处理、数据分析服务的话,不如选择其他的方案,比如 pandas 等等,拥有更大的自由度。

  • 方式:将数据加载到 Power Pivot,通过 ADO 方式调用 Power Pivot 的编程接口
  • 方式:利用微软的 Power Query SDK,在 .NET 平台使用 M 语言,获取查询结果。

本篇主要介绍第一种方式,第二种方式给出一些参考链接。

利用 Power Pivot 的数据模型编程接口

貌似 PQ 没有对外的编程接口,但是 Power Pivot 有通过 Excel 工作簿的编程接口,所以我们可以将数据加载到 Power Pivot, 然后在外部调用。因为本文主要是讲 Power Query ,所以对 Power Pivot 不做展开。Power Pivot 是微软推出的 Excel COM 加载项 (COM Add-in),可以在微软官方免费下载并安装,然后启用加载项即可。安装之后,启用方法如下:通过【文件】>【选项】打开如下界面,选择加载项类型的【COM加载项】,点击转到按钮。

然后在出现的对话框中,勾上"Microsoft Power Pivot for Excel"。如果想不启用该插件,也是通过相同的路径进入该界面,去掉这个勾。

接下来,以之前文章讲解的 PQ 实现的进出存查询为例,进一步讲解如何通过 VBA + ADO 调用 PQ 的查询结果。打开上一篇示例数据的 Excel 文件,选择 stock_balance 查询,点击右键菜单的【加载到】菜单:

选择“将此数据添加到数据模型”:

然后在【数据】选项卡,点击【管理数据模型】功能项:

这样就进入了 Power Pivot 的界面。暂时不对 Power Pivot 的细节展开。

打开一个新的 Excel 工作簿,按下 Alt + F11 进入 VBE (Visual Basic Editor) 环境。在 VBE 环境中,通过【工具】>【引用】添加 Microsoft ActiveX Data Model 的引用。这个是 COM 库,运行 ADO 需要。

新建一个模块 (Module),在模块中新建一个函数 ExportExcelDataModel。该函数实现将 Excel Data Model 导出到工作表:

代码语言:txt
AI代码解释
复制
Public Function ExportExcelDataModel(
	excelFilePath As String, 
	modelName As String, 
	targetSheet As Worksheet)
	
    '''Reference: Microsoft ActiveX Data Objects
 
    Dim wbTarget As Workbook  'target workbook
    Dim ws As Worksheet
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim sQueryString As String

    'Suppress alerts and screen updates
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Err.Clear
    On Error GoTo ErrHandler
    
    Set wbTarget = Application.Workbooks.Open(excelFilePath)
 
    'Make sure the model is loaded
    wbTarget.Model.Initialize
    wbTarget.Model.Refresh

    Set conn = wbTarget.Model.DataModelConnection.ModelConnection.ADOConnection
    sQueryString = "EVALUATE '" & modelName & "'"
    
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open sQueryString, conn
    
    targetSheet.Cells.ClearContents
    ' Write header
    Dim colIndex As Integer
    For colIndex = 0 To rs.Fields.Count - 1
        targetSheet.Range("A1").Offset(0, colIndex).Value = rs.Fields(colIndex).Name
    Next
    
    ' Write Lines
    targetSheet.Range("A1").Offset(1, 0).CopyFromRecordset rs
 
    rs.Close
    Set rs = Nothing    
    ' Close workbook
    wbTarget.Close
 
ExitPoint:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    Set rs = Nothing
    Exit Function
 
ErrHandler:
    MsgBox "An error occured - " & Err.Number & "," & Err.Description, vbOKOnly
    Resume ExitPoint
End Function

因为本文的主题是 PQ,所以不对代码的细节进行讲解,只稍微提一下 ADO 读取 Excel Data Model 的要点:

  • 通过 someWorkbook.Model.DataModelConnection.ModelConnection.ADOConnection 获得数据连接
  • CopyFromRecordSet 方法要求 RecordSet 的 Cursor Location 为 adUseClient,否则结果错误,并没有抛出 Exception 或 Error,而是数据出现错误。如果手工代码循环的方式获取,则没有问题。

然后再添加一个子例程,调用函数 ExportExcelDataModel,下面的调用过程既是调用代码,也能体现函数的调用方法。

代码语言:txt
AI代码解释
复制
Public Sub DoExport()
    Dim filePath As String
    filePath = ThisWorkbook.Path & "\pqservice.xlsx"

    Dim conn As New ADODB.Connection
    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Extended Properties=""Excel 12.0;HDR=No"";" & _
        "data source=" & filePath
    
    ' Update cell in another excel workbook
    Dim sql As String
    sql = "UPDATE [Criteria$A1:B3] SET F2=5 WHERE F1='month'"
    conn.Open
    conn.Execute sql
    conn.Close
    
    ' Retrieve data
    Dim sht As Worksheet
    Set sht = Sheet1    
    Call ExportExcelDataModel(filePath, "stock_balance", sht)
    
    sht.Activate
End Sub

因为需要将筛选条件:月份,从当前工作簿传递到目标工作簿,我采用了 ADO 直接读写 Excel 工作表的方法。但我平时很少用到 ADO 读写 Excel 工作表的方式,因为数据尽可能存放在数据库中,而不是 Excel。在目标工作簿 -- 即提供 Power Query 服务的 Excel 工作表中,筛选条件界面如下:

所以用

代码语言:txt
AI代码解释
复制
sql = "UPDATE [Criteria$A1:B3] SET F2=5 WHERE F1='month'"

表示更新的 SQL 语句。连接字符串中 HDR = No,表示不启用 Header Row,所以此语句 F1 表示 A 列,F2 表示 B 列。Criteria 是工作表名称 (worksheet name)。

本示例代码提供的功能:

  • 将目标工作表的 B3 单元格值修改为 5 (月份条件)
  • 然后对数据据模型进行刷新操作,确保获取的是最新计算的结果
  • 将 Data Model 的计算结果写入 RecordSet 对象,再将 RecordSet 对象数据写入当前工作簿的 Sheet1 (函数的功能)

从理论上来说,这种方法适用于所有能操作 COM 对象 (ADO ActiveX) 的编程语言。

Power Query SDK

微软提供了 Power Query SDK,从而赋予了在 .net 平台中可以直接使用 M 语言的功能。尽管官方的说法,Power Query SDK 已经在 Visual Studio 2019 中可以使用,但我在安装的时候没有成功,也不打算在 Visual Studio 2017 或更老的版本中折腾,这里只能给出相关的连接,有兴趣的读者请自行探索。

Power Query SDK 是一扩展名为 vsix 的文件,在 Visual Studio 中安装的方法请参考:vs2015如何安装vsix扩展工具

网上为数不多的参考文章:

示例数据和代码

github - Consuming Power Query Service

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Power Query 系列 (18) - 参数化查询
参数化查询增加了查询的灵活性。Power Query 可以设置和管理参数,同一工作簿下所有查询都可以使用。
StoneWM
2021/03/25
2.9K0
Power Query 系列 (09) - 合并查询,全面超越 VLookup 函数
VLookup 函数据说在 Excel 函数的使用频率排名前三,但这个函数也有不少局限性,Microsoft 推出了一个新的函数 XLookup 可以用于取代 VLookup。但 XLookup 目前还没有正式发布。处理多表连接,如果有多条件,之前我比较多的是用 MS Access 的查询,但现在有了 Power Query (PQ),在 Excel 中也能愉快的玩耍了。多条件连接准备放在下一篇。PQ 的查询表合并,实现将两个表横向合并,无论是界面友好性方面,还是功能上,都比 VLookup 强大太多。
StoneWM
2021/03/25
5K0
Power Query 系列 (12) - Power Query 结构化列应用案例
本篇数据处理来自一个实际处理数据的简化。下图中,假设左边是一个直观的 BOM 结构展示,数据在 Excel 中存储格式如中间部分所示:第一列为物料编码的级别,第二列为物料编码。数据处理任务:需要在 Excel 中增加一列输出物料编码上一级的物料编码(目标为黄色部分)。
StoneWM
2021/03/25
1.6K0
Power Query 系列 (04) - 从 Web 导入数据
因为网络页面具有很大不确定性,比如数据变化,或者页面过几天就不见了,所以无法保证我所选取的页面在您查看的时候一定还在。但基本方法类似,您也可以找到一个类似的页面来操作。
StoneWM
2019/09/17
2.1K0
Power Query 系列 (03) - 从数据库导入数据
Excel 支持部分数据库数据导入和基于 ODBC 的数据库导入,Power Query (以下简称 PQ) 扩大了直连数据库的范围,并且使用起来更加直观。本篇介绍 MS Access 和 MySQL 数据导入,其他数据库的使用方式类似。也会介绍 从 ODBC 数据源导入数据的方法。
StoneWM
2019/09/11
2.8K0
Power Query 系列 (10) - 合并查询多字段关联技巧
本篇介绍的合并查询的时候,需要多个字段关联作为连接条件的操作技巧。Excel Vlookup 函数可以进行多列作为条件的关联,但已经需要高级操作技巧,在 Power Query (PQ) 中实现则非常简单,方法基本上和上篇一样。
StoneWM
2021/03/25
2.7K0
Power Query 系列 (14) - BOM数据展开应用案例
层次化数据是一种比较常见的数据关系,比如 BOM、公司的组织架构、族谱等等。本文讲解应该如何对层次化数据进行存储和加工输出。设计的场景如下:
StoneWM
2021/03/25
1.2K0
Power Query 系列 (15) - Table 和 List 转换应用案例
本文通过一个数据处理的案例,说明 table 和 list 相互转换在 Power Query (PQ) 数据处理中的作用。假设有下面的销售数据,需要按月份进行汇总,输出为右边的格式:
StoneWM
2021/03/25
2.7K0
Power Query 系列 (01) - Power Query 介绍
Power Query 是微软提供的工具,Excel 2013 版作为插件加载使用,从 Office 2016 版开始,Power Query 的功能集成到 Excel 中,可以直接使用。微软推出 Power BI Desktop 后,一系列的工具,比如 Power Query, Power Pivot, Power View 等,都集成在其中。Power Query 定位查询,中文一般翻译为超级查询,主要作用是连接不同种类的数据源,进行数据的转换。下图来自微软官方对 Power Query 的介绍,可以帮助理解。Power Query 主要实现连接和转换功能。
StoneWM
2019/08/30
6.4K0
Power Query 系列 (13) - 自定义函数
以工资类所得应交个税为例,最新的个税起征点为 5000 并按下表的级次进行缴税(假设没有其它扣除项)。
StoneWM
2021/03/25
2.1K0
Power Query 系列 (19) - 使用混合查询 (Query Folding)提高性能
在本系列的第 18 篇文章中,我详细讲解了从 MS Access 数获取数据,通过 PQ 完成进出存查询的过程。在示例中, stock_movement_details 查询大约 28000+ 行,计算出基于月份的进出存大致耗时 20 秒左右。使用 Excel 实现这样的输出报表有一定难度,从这个角度来说 PQ 是一个巨大的飞跃。但 28000 条的数据耗时 20 秒,性能就比较低了,这引起了我的好奇。经过一番思考和探索,发现了一些可以提高性能的做法。
StoneWM
2021/03/25
2.5K0
Power Query 系列 (06) - M 语言结构化数据类型
本篇介绍 Power Query M 语言的三种结构化类型(或称为容器类型):List、Record 和 Table,它们是 Power Query 数据处理的核心。了解本篇三种容器类型后,应该能大体看懂查询编辑器和高级编辑器中的代码逻辑。
StoneWM
2019/12/13
1.9K0
Power Query 系列 (11) - 函数基础
函数是 Power Query (PQ) 解决问题的核心。之前的博客文章我多层刻意在完成查询的步骤之后显示高级编辑器中 M 语言代码,想必大家已经对 M 的函数有了初步印象,尽管不一定很关注。本篇介绍 M 函数比较重要的知识点。
StoneWM
2021/03/25
1.5K0
Power Query 系列 (07) - 添加列
前面几篇博客介绍了 Power Query (简称 PQ) 的数据源和 M 语言的基础知识,现在开始进入数据处理部分。本篇接着介绍 如何在 PQ 中添加列。添加列是很重要的一个操作,在 PQ 的查询编辑器界面,有一个专门【添加列】功能区。在讲解添加列的过程中,我们会逐步介绍一些相关知识点和 PQ 的操作细节。
StoneWM
2021/03/25
3.2K0
Power Query 系列 (08) - 行转列案例
行转列是一种常见的数据处理操作,所以对如何在 SQL 语句中、如何在 pandas 中实现这种行转列做过一些总结。请参考我之前写的博文:
StoneWM
2021/03/25
1.5K0
Power Query 系列 (17) - BOM数据展开应用案例(2)
在本系列的第 14 篇,我介绍了类似 BOM 的数据应该怎么存储,以及在 Power Query 中如何展开。那篇文章使用创建辅助查询的方法,从而简化了在查询编辑器的操作,小白都是可以理解和掌握的。但如果我们来回顾一下处理的过程,有很多重复的操作,比如合并和展开第 2 级数据,合并和展开第 3 级数据等等。有编程概念的人立即想到,应该用循环来解决啊。在编程语言中,循环是一种基础的控制结构,是基础的东西,但在 PQ 中却没有直接的循环语句,需要通过函数的辅助来实现。上篇介绍了 List.Generate 函数之后,我们可以对 BOM 数据的展开进行优化了。
StoneWM
2021/03/25
9810
Power Query 系列 (05) - M 语言介绍
M 语言或者叫 M 查询语言是 Power Query (简称为 PQ) 幕后的英雄。据说 Power Query Editor 可视化操作可以实现 PQ 80% 的功能,所以从操作层面来说,大部分人不用学习 M 语言,但学习和掌握 M 语言无疑是在数据处理的时候如虎添翼,而且,有一些 M 的基础也能加深对 PQ 操作步骤的理解,进而有可能对这些应用的步骤做一些优化和改善。总的来说,M 是一种值得学习和掌握的技能,Excel 和 Power BI 都可以用。
StoneWM
2019/09/18
2.7K0
10分钟快速搭建小程序管理后台,借助云开发CMS搭建可视化的数据管理网页平台
官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/extensions/cms/introduction.html
编程小石头
2021/01/13
4.3K0
10分钟快速搭建小程序管理后台,借助云开发CMS搭建可视化的数据管理网页平台
3行代码实现小程序直播,带美颜优惠券抽奖功能
注意我们上图红色框里的一些要求。必须要满足这些条件,才可以开通直播功能。更详细些的如下:
编程小石头
2020/06/30
1.3K0
3行代码实现小程序直播,带美颜优惠券抽奖功能
小程序里使用async和await变异步为同步,解决回调地狱问题
最近好多同学,学习完石头哥的云开发基础以后,自己实际项目中,总会遇到各种各样的异步问题。
编程小石头
2021/05/29
1.5K0
小程序里使用async和await变异步为同步,解决回调地狱问题
推荐阅读
相关推荐
Power Query 系列 (18) - 参数化查询
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档