下载PowerBI报表文件,提取数据文件读取数据并存为CSV文件
使用Python和Restful API下载PowerBI Server上报表为.pbix格式的报表文件,再把它当做zip文件解压出其中的数据文件,然后用Python读取该文件的内容并存储为CSV文件。最后详细论述PowerBI Server上需要的权限。
以下是使用Python和PowerBI Server REST API下载报表、处理文件及权限要求的详细步骤:
步骤1:获取访问令牌(OAuth2认证)
python">import requestsauth_url = "https://<your-powerbi-server>/oauth2/token"
client_id = "your_client_id"
username = "your_username"
password = "your_password"
resource = "https://analysis.windows.net/powerbi/api"data = {'grant_type': 'password','client_id': client_id,'username': username,'password': password,'resource': resource
}response = requests.post(auth_url, data=data)
access_token = response.json()['access_token']
步骤2:调用Export API下载报表
python">report_id = "your_report_id"
group_id = "your_workspace_id"
export_url = f"https://<your-powerbi-server>/api/v2.0/groups/{group_id}/reports/{report_id}/Export"headers = {'Authorization': f'Bearer {access_token}','Content-Type': 'application/octet-stream'
}response = requests.get(export_url, headers=headers)
with open('report.pbix', 'wb') as f:f.write(response.content)
步骤3:解压.pbix文件(ZIP格式)
python">import zipfilewith zipfile.ZipFile('report.pbix', 'r') as zip_ref:zip_ref.extractall('extracted_folder')
步骤4:解析数据文件并保存为CSV
(假设数据文件为DataModelSchema
)
python">import json
import pandas as pdwith open('extracted_folder/DataModelSchema', 'r') as f:data_model = json.load(f)# 提取第一个表的数据
tables = data_model['model']['tables']
for table in tables:rows = table.get('rows', [])if rows:df = pd.DataFrame(rows)df.to_csv(f"{table['name']}.csv", index=False)
权限要求(PowerBI Server)
-
API访问权限:
- 需配置OAuth2客户端并授予
Read.All
或Report.ReadWrite.All
权限。 - 用户账号需启用API访问(由管理员配置)。
- 需配置OAuth2客户端并授予
-
报表权限:
- 工作区角色:用户需属于目标工作区的
成员
、参与者
或管理员
角色。 - 导出权限:需在PowerBI Server策略中允许导出操作(通过管理门户设置)。
- 工作区角色:用户需属于目标工作区的
-
数据权限:
- 用户需对报表底层数据源有读取权限(如SQL Server数据库权限)。
-
服务器级权限:
- 可能需
内容管理员
角色以绕过行级安全性(RLS)。
- 可能需
注意事项
- API兼容性:确保PowerBI Server版本支持导出API(通常为2018年6月后版本)。
- 数据模型复杂性:部分数据可能需要解析
metadata
或使用XMLA端点
直接查询。 - 安全限制:导出操作可能受组织策略限制,需提前与管理员确认。
直接从PowerBI Server读取数据并存储为CSV文件
使用Python和Restful API下载PowerBI Server上报表数据,并详细论述PowerBI Server上需要的权限。
使用Python和Power BI REST API下载报表数据需要以下步骤和权限配置:
步骤一:配置Azure AD应用和权限
-
注册应用:
- 在Azure Portal中注册应用,获取客户端ID和客户端密钥。
- 添加API权限:
Dataset.Read.All
、Report.Read.All
(应用程序权限)。
-
管理员同意:
- 租户管理员需对添加的权限授予同意。
-
Power BI租户设置:
- 在Power BI管理门户中启用允许服务主体使用Power BI API。
步骤二:服务主体添加到Power BI工作区
- 将应用的服务主体添加到目标工作区,角色至少为查看者(通过Power BI界面或API)。
步骤三:Python代码实现
安装依赖库
pip install msal requests pandas
代码示例
python">import requests
import msal
import pandas as pd# 配置参数
config = {"client_id": "YOUR_CLIENT_ID","client_secret": "YOUR_CLIENT_SECRET","tenant_id": "YOUR_TENANT_ID","authority": "https://login.microsoftonline.com/YOUR_TENANT_ID","scope": ["https://analysis.windows.net/powerbi/api/.default"],"group_id": "WORKSPACE_ID","report_id": "REPORT_ID"
}def get_access_token(config):app = msal.ConfidentialClientApplication(config["client_id"],authority=config["authority"],client_credential=config["client_secret"])result = app.acquire_token_for_client(scopes=config["scope"])return result.get("access_token")def get_report_dataset_id(access_token, group_id, report_id):url = f"https://api.powerbi.com/v1.0/myorg/groups/{group_id}/reports/{report_id}"headers = {"Authorization": f"Bearer {access_token}"}response = requests.get(url, headers=headers)return response.json().get("datasetId")def execute_query(access_token, dataset_id, table_name):url = f"https://api.powerbi.com/v1.0/myorg/datasets/{dataset_id}/executeQueries"headers = {"Authorization": f"Bearer {access_token}", "Content-Type": "application/json"}body = {"queries": [{"query": f"EVALUATE '{table_name'"}]}response = requests.post(url, headers=headers, json=body)return response.json()if __name__ == "__main__":try:token = get_access_token(config)dataset_id = get_report_dataset_id(token, config["group_id"], config["report_id"])data = execute_query(token, dataset_id, "YourTableName")df = pd.DataFrame(data["results"][0]["tables"][0]["rows"])df.to_csv("report_data.csv", index=False)print("数据下载成功!")except Exception as e:print(f"错误: {e}")
详细权限说明
-
Azure AD应用权限:
- Dataset.Read.All:读取数据集并执行查询。
- Report.Read.All:访问报表元数据。
- Workspace.Read.All(可选):动态获取工作区列表。
-
Power BI工作区角色:
- 查看者:允许查看内容,但不可编辑。
- 贡献者/管理员:更高权限,适合需要修改的场景。
-
租户级设置:
- 启用服务主体访问Power BI API的权限。
常见问题处理
- 认证失败:检查客户端ID、密钥及作用域配置。
- 权限不足:确保服务主体已添加到工作区并分配角色。
- API限制:处理分页或大量数据时需实现循环逻辑。