指南教程

在 Excel 中创建多币种发票跟踪器

下载一个用于 EUR、GBP、JPY 和 IDR 发票的 Excel 工作簿,包含按日期保存的汇率快照、USD 公式和审计记录。

2026年9月8日 · 阅读 8 分钟

工作簿保留发票原币金额,并使用所选日期的快照计算 USD。日期、来源、data_updated_at 和汇率一起保存,因此已入账的行可以复现。

  • 工作簿包含日期快照、公式和审计记录。
  • rate_per_usd 表示每 1 USD 对应的币种数量。
  • 保存已入账行的来源、会话和 data_updated_at。
  • Power Query 添加新行,不覆盖冻结值。
  • 汇率是参考值,不是税务或会计建议。

下载工作簿

下载发票跟踪工作簿并在 Excel 中打开。文件包含示例发票、EUR/GBP/JPY/IDR 快照、USD 列和审计记录。

了解四个工作表

Invoice Tracker保存发票和公式,FX Snapshots保存日期观测,Audit Trail记录冻结决定,Read Me说明流程和限制。

按原币添加发票

在蓝色输入单元格填写编号、客户、日期、币种、净额、税额、汇率日期和状态。Net、Tax、Gross 保持为发票原币。

添加按日期的汇率快照

加入实际使用的历史观测,并保存日期、币种、source、market_session、data_updated_at 和汇率。汇率表示 1 USD 对应的发票币种数量。 使用唯一 Snapshot ID,例如 EUR-20260602-v1,并验证该 ID 恰好对应一行,且快照币种与发票币种一致。修正时新增 v2,不要覆盖 v1。data_updated_at 表示历史数据写入时间,不等同于 effective_at。

Representative historical response
{  "result": "success",  "base": "USD",  "date": "2026-06-02",  "source": "ecb_daily",  "sources": { "EUR": "ecb_daily" },  "market_session": "open",  "timestamp": "2026-09-08T11:52:18Z",  "data_updated_at": "2026-06-02T00:00:00Z",  "is_forward_filled": false,  "rates": { "EUR": 0.85844 },  "notice": "Indicative rates, not for settlement."}

检查公式驱动的 USD 列

工作簿按日期和币种匹配 FX Snapshots,再用 FX Rate / USD 除金额。没有快照时 USD 列保持空白。 示例公式覆盖发票第100行和快照第100行;扩展时必须同时扩展两处。Posted 只是标签,不会锁定单元格,也不会自动冻结公式。

Excel formula · Net USD
=IF(OR(F6<0,G6<0,H6<0,K6="",L6="Missing snapshot ID",L6="Duplicate snapshot ID",L6="Currency mismatch",L6="Invalid rate"),"",F6/K6)

冻结已入账的值

发票入账后不要修改快照行。如需更正或重述,请添加新行并在 Audit Trail 说明原因。

用 Power Query 添加新快照

Power Query 脚本获取指定日期和币种。共享工作簿中不要保存 API 密钥。 Power Query 输出固定为 A:I 九列。先加载到 staging 工作表,再不带表头复制数据行,从第7行起选择性粘贴为值。Refresh All 会替换查询输出,不会自动追加不可变历史。Windows 使用 Data → Get Data → From Other Sources → Blank Query;支持的 Microsoft 365 for Mac 使用 Data → Get Data → Launch Power Query Editor。选择 Anonymous;需要密钥时使用服务器端 proxy。

Power Query M · explicit snapshot
let    SnapshotDate = "2026-06-02",    Currency = Text.Upper(Text.Trim("EUR")),    Revision = "v1",    SelectedDate = Date.FromText(SnapshotDate, [Format = "yyyy-MM-dd", Culture = "en-US"]),    RelativePath = "v1/" & Date.ToText(SelectedDate, "yyyy-MM-dd") & "/USD",    Endpoint = "https://api.exchangerate.dev/" & RelativePath & "?symbols=" & Currency,    Payload = Json.Document(Web.Contents("https://api.exchangerate.dev", [        RelativePath = RelativePath,        Query = [symbols = Currency],        Timeout = #duration(0, 0, 0, 10)    ])),    Source = if Payload[base] <> "USD" or Payload[date] <> SnapshotDate        then error "Unexpected response base or date" else Payload,    RawRate = Record.Field(Source[rates], Currency),    Rate = if not Value.Is(RawRate, type number) or RawRate <= 0        then error "Expected a positive numeric rate" else RawRate,    SnapshotId = Currency & "-" & Text.Replace(SnapshotDate, "-", "") & "-" & Revision,    Notes = "Response timestamp=" & Source[timestamp] & "; is_forward_filled=" &        (if Source[is_forward_filled] then "true" else "false"),    Snapshot = #table(        {"Snapshot ID", "Snapshot Date", "Currency", "Source", "Market Session", "Data Updated At (UTC)", "Rate / USD", "API Endpoint", "Notes"},        {{SnapshotId, SelectedDate, Currency, Record.Field(Source[sources], Currency), Source[market_session], Source[data_updated_at], Rate, Endpoint, Notes}}    )in    Snapshot

保留审计记录

记录入账时间、使用的快照、来源/会话以及冻结原因。若流程需要更强证据,也应保存原始响应。 在 Notes 中保存响应 timestamp 和 is_forward_filled,并记录 Snapshot ID、来源、市场时段和修正原因。

仅将结果用于报告

这是用于报告和分析的示例,不决定税务、会计、合规或结算金额。 示例容量到第100行;增加容量时同时扩展公式和查找范围。

常见问题

已入账发票会自动更新吗?

不会。已入账行使用冻结快照,避免后续更新悄悄改变历史报告。

rate_per_usd 是什么意思?

它是 1 USD 对应的发票币种金额,用原币金额除以该汇率。

可以使用实时汇率吗?

可以为未结期间添加新的快照,但不要替换已入账的历史观测。

这是税务或会计建议吗?

不是。请遵循自己的政策并咨询专业人士。

可以把 API 密钥放入 Power Query 吗?

不要放在共享文件中;请使用匿名访问或服务器端代理。

继续阅读

从免费API密钥开始

免费套餐每月提供5,000次请求。无需信用卡。

获取免费密钥