使用Python连接Power BI报表遇未嵌入异常,如何实现取数到Jupyter?
解决Power BI Python连接时的"Power BI report is not embedded"异常
问题原因
你使用的powerbiclient.Report类是专为Power BI报表嵌入到第三方应用设计的,它要求报表必须配置为嵌入模式(比如使用嵌入容量或嵌入令牌)。而你的需求是从Power BI服务中读取报表元数据/数据来生成DQ报告,这个类并不适用,因此抛出该异常。
解决方案
改用Power BI REST API来直接获取报表信息,以下是具体实现步骤:
1. 准备工作
- 在Azure AD注册一个应用程序,授予
Power BI Service的相关权限(比如Report.Read.All、Dataset.Read.All) - 记录应用的
客户端ID(CLIENT_ID)
2. 安装依赖库
pip install requests msal
3. 示例代码(交互式认证)
import requests from msal import PublicClientApplication # 替换为你的配置 CLIENT_ID = "你的Azure AD应用客户端ID" REPORT_ID = "abc" WORKSPACE_ID = "def" AUTHORITY = "https://login.microsoftonline.com/common" # 根据需求调整权限范围 SCOPE = ["https://analysis.windows.net/powerbi/api/Report.Read.All"] # 获取访问令牌 app = PublicClientApplication(CLIENT_ID, authority=AUTHORITY) result = app.acquire_token_interactive(scopes=SCOPE) access_token = result["access_token"] # 调用API获取报表页面信息 pages_url = f"https://api.powerbi.com/v1.0/myorg/groups/{WORKSPACE_ID}/reports/{REPORT_ID}/pages" headers = {"Authorization": f"Bearer {access_token}"} response = requests.get(pages_url, headers=headers) response.raise_for_status() # 捕获HTTP错误 pages_data = response.json() # 打印结果 print("报表页面信息:") for page in pages_data["value"]: print(f"页面名称:{page['displayName']},页面ID:{page['name']}")
4. 无交互场景(Device Code认证)
如果在服务器等无交互环境运行,可改用Device Code认证:
import requests from msal import PublicClientApplication CLIENT_ID = "你的Azure AD应用客户端ID" REPORT_ID = "abc" WORKSPACE_ID = "def" AUTHORITY = "https://login.microsoftonline.com/common" SCOPE = ["https://analysis.windows.net/powerbi/api/Report.Read.All"] app = PublicClientApplication(CLIENT_ID, authority=AUTHORITY) flow = app.initiate_device_flow(scopes=SCOPE) if "user_code" not in flow: raise ValueError("生成Device Code失败,请检查配置") # 提示用户登录 print(flow["message"]) result = app.acquire_token_by_device_flow(flow) access_token = result["access_token"] # 后续调用API步骤和上面一致 pages_url = f"https://api.powerbi.com/v1.0/myorg/groups/{WORKSPACE_ID}/reports/{REPORT_ID}/pages" headers = {"Authorization": f"Bearer {access_token}"} response = requests.get(pages_url, headers=headers) response.raise_for_status() pages_data = response.json() print(pages_data)
5. 扩展:获取报表数据用于DQ报告
如果需要提取报表中的数据(比如数据集的表数据),可调用Power BI REST API的Execute Queries接口,示例:
import pandas as pd # 获取数据集ID(先通过报表API获取关联的数据集ID) report_details_url = f"https://api.powerbi.com/v1.0/myorg/groups/{WORKSPACE_ID}/reports/{REPORT_ID}" response = requests.get(report_details_url, headers=headers) dataset_id = response.json()["datasetId"] # 执行查询获取数据 query_url = f"https://api.powerbi.com/v1.0/myorg/groups/{WORKSPACE_ID}/datasets/{dataset_id}/executeQueries" query_payload = { "queries": [{"query": "EVALUATE '你的表名'"}], "serializerSettings": {"includeNulls": True} } response = requests.post(query_url, json=query_payload, headers=headers) data_result = response.json() # 转换为DataFrame用于DQ分析 df = pd.DataFrame(data_result["results"][0]["tables"][0]["rows"]) print(df.head())
内容的提问来源于stack exchange,提问作者Alastair
相关产品推荐
相关产品推荐

