Python从PowerBI Server上取得报表数据的方法

devtools/2025/3/6 8:49:12/

下载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)

  1. API访问权限

    • 需配置OAuth2客户端并授予Read.AllReport.ReadWrite.All权限。
    • 用户账号需启用API访问(由管理员配置)。
  2. 报表权限

    • 工作区角色:用户需属于目标工作区的成员参与者管理员角色。
    • 导出权限:需在PowerBI Server策略中允许导出操作(通过管理门户设置)。
  3. 数据权限

    • 用户需对报表底层数据源有读取权限(如SQL Server数据库权限)。
  4. 服务器级权限

    • 可能需内容管理员角色以绕过行级安全性(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应用和权限

  1. 注册应用

    • 在Azure Portal中注册应用,获取客户端ID客户端密钥
    • 添加API权限:Dataset.Read.AllReport.Read.All(应用程序权限)。
  2. 管理员同意

    • 租户管理员需对添加的权限授予同意。
  3. 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}")

详细权限说明

  1. Azure AD应用权限

    • Dataset.Read.All:读取数据集并执行查询。
    • Report.Read.All:访问报表元数据。
    • Workspace.Read.All(可选):动态获取工作区列表。
  2. Power BI工作区角色

    • 查看者:允许查看内容,但不可编辑。
    • 贡献者/管理员:更高权限,适合需要修改的场景。
  3. 租户级设置

    • 启用服务主体访问Power BI API的权限。

常见问题处理

  • 认证失败:检查客户端ID、密钥及作用域配置。
  • 权限不足:确保服务主体已添加到工作区并分配角色。
  • API限制:处理分页或大量数据时需实现循环逻辑。

http://www.ppmy.cn/devtools/164957.html

相关文章

Python 面向对象高级编程-定制类

目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意&#xff0c;这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了&#xff0c;__len__()方法我们也知道是为了能让class作用于len()…

确定信号分析:从傅里叶级数到信号带宽的Matlab实践

关键词&#xff1a;傅里叶变换 信号能量 功率谱密度 自相关函数 信号带宽 Matlab仿真 内容摘要&#xff1a; 本文系统讲解确定信号分析的核心理论与Matlab实践&#xff0c;涵盖周期信号的傅里叶级数展开、非周期信号的傅里叶变换及性质、信号能量与功率的计算、自相关函数与频…

能简述一下动态 SQL 的执行原理吗

MyBatis 的动态 SQL 是一种强大的功能&#xff0c;允许开发者根据条件动态生成 SQL 语句。它的执行原理主要涉及以下几个步骤&#xff1a; ### **1. 解析映射文件** 当 MyBatis 启动时&#xff0c;会加载并解析映射文件&#xff08;Mapper.xml&#xff09;&#xff0c;提取其中…

61. Three.js案例-彩色旋转立方体创建与材质应用

61. Three.js案例-彩色旋转立方体创建与材质应用 实现效果 知识点 WebGLRenderer(WebGL渲染器) 构造器 WebGLRenderer( parameters : Object ) 参数类型描述antialiasBoolean是否执行抗锯齿(默认false)alphaBoolean是否包含alpha通道(默认false)方法 setSize( width…

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(一)

文章目录 2.3 Polar 编解码2.3.1 Polar 码简介与发展背景2.3.2 信道极化理论基础对称容量与巴氏参数对称容量 I ( W ) I(W) I(W)巴氏参数 Z ( W ) Z(W) Z(W)常见信道信道联合信道分裂信道极化 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&…

Web安全|渗透测试|网络安全

基础入门(P1-P5) p1概念名词 1.1域名 什么是域名&#xff1f; 域名&#xff1a;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 什么是二级域名多级域名…

鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 目录 技术融合背景与价值鸿蒙分布式架构解析DeepSeek技术体系剖析核心整合架构设计智能调度系统实现…

css不出现滚动条

这是现在的样式&#xff0c;左边有滚动条&#xff0c;右边没有 /* styles.css */ .guRpLZ {display: flex;flex-direction: column; } .dMItjA {height: 63px;border-bottom: 1px solid var(--TY-Line-1);background-color: rgb(251, 251, 253); } .gIoENS {flex: 1 0 0%;displ…