借助 Excel 的 Power Query 和 Narwhal,你可以把节假日、发布日期、经济数据、大宗商品现货价格、外汇汇率和预测市场概率拉取到工作簿中。你的 Narwhal 账户和 API 密钥适用于这些数据 API,工作簿打开期间 Excel 还可以刷新这些查询。
你将完成的设置
Power Query 是 Excel 发送 API 请求并读取 JSON 响应的途径。完成后,你的工作簿里会有想要数据的查询,比如节假日表或 Brent 现货价格。实际使用时,每个领域对应一个查询。示例通篇使用相同的基础 URL 和 Authorization 请求头,只是每个领域的路径和响应字段不同。Narwhal 的 CPI、通胀、GDP 和收益率等经济数据也使用同一个账户。
设置你的 API 密钥
- 创建免费密钥 在 Narwhal 注册页创建免费密钥。这里用到的数据 API 共用一个账户和一个 API 密钥。REST 和 MCP 共用该密钥,Excel 示例把它放在 REST 请求中发送。
- 把密钥保存在环境变量中 把密钥存入名为
NARWHAL_API_KEY的环境变量。在 Power Query M 示例中,把Authorization请求头里的YOUR_KEY替换成你的密钥。请求头的值以Bearer开头,后面接密钥。 - 不要公开工作簿 由于 Authorization 请求头写在 M 代码里,Power Query 会把密钥保存在工作簿内部。表格里请使用免费密钥,并且不要分享该文件。在这些示例中,环境变量并不能取代其中的密钥值。
打开空白查询
- 打开“获取数据” 在“数据”选项卡中打开“获取数据”,找到“来自其他源”,再选择“空白查询”。这些就是用来发起请求的 Power Query 控件。
- 打开高级编辑器 在高级编辑器中打开这个空白查询,并粘贴下一节中的 M 代码。刷新查询之前,先把你的密钥填入请求头。
- 选择要返回的结果
in之后的表达式决定该查询返回什么结果。完整示例返回Holidays。要得到对应的表,就返回Releases、Cpi、Fx或Fed;现货价格则返回Brent。每个想要的领域各用一个独立的查询。
用 Power Query M 获取数据
在 Web.Contents 中保持 https://api.narwhalapi.com 不变。把端点路径放在 RelativePath,参数放在 Query,这样刷新才能正常工作。Narwhal 辅助函数负责读取 JSON 响应,每个表达式再选取对应领域的字段。发布日期的表达式指定了输出列名,并使用 MissingField.UseNull。
这个辅助函数接受一个路径和一个可选的查询参数记录。没有提供查询记录时,它使用空记录。Table.FromRecords 把记录集合转成表,Number.FromText 则处理 Brent 价格。请让响应字段的选取保持连在你所需领域的调用后面。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
])),
Holidays = Table.FromRecords(Narwhal("v1/calendars/holidays/USA/2026")[holidays]),
Releases = Table.FromRecords(
Narwhal(
"v1/economics/calendar",
[countries = "USA", start_date = "2026-11-01",
end_date = "2026-11-30", limit = "100"]
)[releases],
{"at", "period", "topic", "status"}, MissingField.UseNull),
Cpi = Table.FromRecords(
Narwhal("v1/economics/USA/cpi/observations", [start = "2025-09"])[observations]
),
Brent = Number.FromText(Narwhal("v1/commodities/spot/BRENT/USD")[price]),
Fx = Table.FromRecords(Narwhal("v1/fx/rates/USD", [currencies = "EUR,IDR"])[rates]),
Fed = Table.FromRecords(
Narwhal("v1/predictions/policy-paths/federal-reserve")[meetings]
)
in
// return Releases, Cpi, Fx or Fed the same way;
// each area is its own query in practice
Holidays按计划刷新工作簿
用“数据”选项卡中的“全部刷新”来刷新查询。在查询属性中,可以设置查询在打开文件时刷新,以及在文件打开期间每隔 N 分钟刷新一次。这些设置只对已打开的工作簿生效,所以要用定时刷新,就得保持工作簿处于打开状态。
Excel 没有后台调度器。要无人值守运行,请使用 Power Automate 或 Excel 之外的脚本。设为打开时刷新的查询,会在你再次打开文件时拉取数据;定时刷新则取决于工作簿是否保持打开。请为需要刷新数据的查询逐个设置刷新属性。
在 Excel 中查询节假日
从 holidays 字段读取美国 2026 年的节假日。每个假日都有 date 和 name,Table.FromRecords 把这些记录转成表。此示例使用与完整示例相同的辅助函数和请求头,直接返回节假日表。作为独立查询使用之前,请先替换其中的密钥。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
]))
in Table.FromRecords(Narwhal("v1/calendars/holidays/USA/2026")[holidays])在 Excel 中查询发布日期
从 releases 获取美国 2026 年 11 月的经济数据发布日期。返回的字段是 at、period、topic 和 status。请把国家和日期参数保留在 Query 记录中。这个请求针对的是发布日历;要查 CPI 的观测期间和数值,请使用经济数据查询。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
]))
in Table.FromRecords(
Narwhal(
"v1/economics/calendar",
[countries = "USA", start_date = "2026-11-01",
end_date = "2026-11-30", limit = "100"]
)[releases],
{"at", "period", "topic", "status"},
MissingField.UseNull
)在 Excel 中查询经济数据
以 2025 年 9 月作为起始参数,请求美国 CPI 观测值。读取 observations,即可在表中得到 period 和 value 字段。在工作簿中使用结果时,期间要和观测值放在一起。请像完整示例那样,把起始参数保留在 Query 中。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
]))
in Table.FromRecords(
Narwhal("v1/economics/USA/cpi/observations", [start = "2025-09"])[observations]
)在 Excel 中查询大宗商品现货价格
从 price 读取以 USD 计价的 Brent 现货价格。这个响应字段是价格,M 表达式用 Number.FromText 把它作为数字返回。大宗商品现货代码例如 XAU、XAG、XPT、XPD、XCU、BRENT 和 WTI。此示例使用 BRENT。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
]))
in Number.FromText(Narwhal("v1/commodities/spot/BRENT/USD")[price])在 Excel 中查询汇率
以 USD 为基础货币,在 currencies 参数中请求 EUR 和 IDR。从响应中选取 rates,把记录转成表。每条记录都有 currency 和 rate,所以查询结果里货币始终与它的汇率并排。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
]))
in Table.FromRecords(Narwhal("v1/fx/rates/USD", [currencies = "EUR,IDR"])[rates])在 Excel 中查询预测市场概率
拉取美联储政策路径,并从响应中读取 meetings。每次会议都有 resolves_at、p_cut、p_hold 和 p_hike。此示例把会议作为表返回,结算时间和政策概率都可以当作字段使用。如果想在工作簿中使用这些概率,就把它作为独立查询。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
]))
in Table.FromRecords(Narwhal("v1/predictions/policy-paths/federal-reserve")[meetings])为什么 Power Query 会要求凭据?
对该 Web 数据源选择“匿名”身份验证。Power Query 只在匿名身份验证下允许使用 Authorization 请求头。请求仍然会通过 M 代码里的请求头发送你的 Narwhal 密钥;Web 数据源的凭据选项就是“匿名”。
可以把结果用于 NETWORKDAYS 吗?
可以。把 NETWORKDAYS 的假日参数指向 Holidays 表的 date 列。该参数使用查询返回的假日日期,name 列存放的是假日名称。美国节假日示例请求的是 2026 年,所以其日期就是那一年的假日。需要这些假日日期的计算,都可以使用这个结果。
发布于。