You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:47:18