Power Query_数据源为API_链接方式
·
新建空白查询——>高级编辑器——>粘贴下面的代码
AppKey的内容为自己的APIkey
AppSecret的内容为自己的APISecret
let
// ===========================================
// 配置参数区域 - 便于维护和修改
// ===========================================
AppKey = "",
AppSecret = "",
StartDate = "2025-01-01", // 开始日期
EndDate = "2025-12-31", // 结束日期
PageSize = 500,
// ===========================================
// Python脚本模板 - 完全按照原程序方法
// ===========================================
PythonScriptTemplate = "
import requests
import base64
import hmac
import hashlib
import time
import urllib.parse
import pandas as pd
from datetime import datetime
import logging
def get_access_token(app_key, app_secret):
'''获取访问令牌 - 完全按照原程序方法'''
timestamp = str(int(time.time() * 1000))
# 构建待签名字符串
string_to_sign = f'appKey{app_key}timestamp{timestamp}'
# 使用HMAC-SHA256算法计算签名
hmac_code = hmac.new(app_secret.encode(), string_to_sign.encode(), hashlib.sha256).digest()
signature = urllib.parse.quote(base64.b64encode(hmac_code).decode())
# 构建请求URL - 完全按照原程序方式
url = f'https://c4.yonyoucloud.com/iuap-api-auth/open-auth/selfAppAuth/base/v1/getAccessToken?appKey={app_key}×tamp={timestamp}&signature={signature}'
response = requests.get(url)
result = response.json()
if result['code'] == '00000':
return result['data']['access_token']
else:
raise Exception(f'获取token失败: {result[""message""]}')
def get_salesout_data(access_token, start_date, end_date):
'''获取销售出库列表数据 - 支持日期期间查询'''
url = 'https://c4.yonyoucloud.com/iuap-api-gateway/yonbip/scm/salesout/list'
# 构建查询参数
params = {
'access_token': access_token
}
# 构建请求体
# 设置日期查询条件: 查询日期期间的数据
# 方法1: 使用vouchdate参数的区间格式 (推荐)
vouchdate_range = f'{start_date}|{end_date} 23:59:59'
body = {
'pageIndex': 1,
'pageSize': {{PAGE_SIZE}}, # 设置较大的页面大小以获取更多数据
'isSum': False,
'vouchdate': vouchdate_range, # 使用区间格式查询
'simpleVOs': [] # 清空扩展查询条件,使用vouchdate参数
}
# 方法2: 使用simpleVOs的between操作符 (备选方案)
# 如果方法1不工作,可以取消注释下面的代码并注释掉上面的vouchdate行
# body = {
# 'pageIndex': 1,
# 'pageSize': {{PAGE_SIZE}},
# 'isSum': False,
# 'simpleVOs': [
# {
# 'field': 'vouchdate',
# 'op': 'between',
# 'value1': f'{start_date} 00:00:00',
# 'value2': f'{end_date} 23:59:59'
# }
# ]
# }
headers = {
'Content-Type': 'application/json'
}
response = requests.post(url, params=params, json=body, headers=headers)
result = response.json()
if result['code'] == '200':
return result['data']
else:
raise Exception(f'获取销售出库列表失败: {result[""message""]}')
def get_all_salesout_data(access_token, start_date, end_date):
'''获取所有销售出库数据 - 支持分页获取'''
all_records = []
page_index = 1
while True:
# 获取当前页数据
url = 'https://c4.yonyoucloud.com/iuap-api-gateway/yonbip/scm/salesout/list'
params = {'access_token': access_token}
vouchdate_range = f'{start_date}|{end_date} 23:59:59'
body = {
'pageIndex': page_index,
'pageSize': {{PAGE_SIZE}},
'isSum': False,
'vouchdate': vouchdate_range
}
headers = {'Content-Type': 'application/json'}
response = requests.post(url, params=params, json=body, headers=headers)
result = response.json()
if result['code'] != '200':
raise Exception(f'获取销售出库列表失败: {result[""message""]}')
data = result['data']
records = data.get('recordList', [])
if not records:
break
all_records.extend(records)
# 检查是否还有更多页
if page_index >= data.get('pageCount', 1):
break
page_index += 1
return {'recordList': all_records, 'recordCount': len(all_records)}
def process_data_for_power_bi(salesout_data):
'''处理数据为Power BI可用的格式 - 完全按照原程序方法'''
if not salesout_data.get('recordList'):
return pd.DataFrame()
# 提取主要数据
df = pd.json_normalize(salesout_data['recordList'])
# 添加数据处理时间戳,便于追踪
df['data_processed_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return df
# 主函数 - 当在Power BI中使用时,Power BI会使用返回的数据框
def main():
# 设置AppKey和AppSecret
app_key = '{{APP_KEY}}'
app_secret = '{{APP_SECRET}}'
# 设置查询日期期间
start_date = '{{START_DATE}}'
end_date = '{{END_DATE}}'
try:
# 获取访问令牌
access_token = get_access_token(app_key, app_secret)
# 获取销售出库数据(支持分页获取所有数据)
salesout_data = get_all_salesout_data(access_token, start_date, end_date)
# 处理数据为Power BI可用的格式
df = process_data_for_power_bi(salesout_data)
# 打印数据统计信息
print(f'成功获取 {start_date} 到 {end_date} 期间的销售出库数据')
print(f'共获取到 {len(df)} 条记录')
# 返回数据框 - Power BI会使用这个返回值
return df
except Exception as e:
print(f'错误: {str(e)}')
# 返回空数据框
return pd.DataFrame()
# 当直接运行脚本时执行
if __name__ == '__main__':
result_df = main()
print(f'获取到 {len(result_df)} 条记录')
if not result_df.empty:
print(result_df.head())
",
// ===========================================
// 使用Text.Replace替换参数占位符
// ===========================================
PythonScript = Text.Replace(
Text.Replace(
Text.Replace(
Text.Replace(
Text.Replace(PythonScriptTemplate, "{{APP_KEY}}", AppKey),
"{{APP_SECRET}}", AppSecret),
"{{START_DATE}}", StartDate),
"{{END_DATE}}", EndDate),
"{{PAGE_SIZE}}", Number.ToText(PageSize)),
// ===========================================
// 执行Python脚本并获取结果
// ===========================================
执行结果 = Python.Execute(PythonScript),
最终数据 = 执行结果{[Name="result_df"]}[Value]
in
最终数据
更多推荐

所有评论(0)