什么是 OFX 格式?Open Financial Exchange 详解
OFX 是银行与软件之间交换财务数据的开放标准。本文将介绍 OFX 文件的内部结构,以及为什么 Xero、MYOB 和 GnuCash 更青睐这种格式。
您的会计软件要求提供 OFX 文件。而银行只给了您一份 PDF。现在您正盯着一种从未听说过的格式发愁,心想为什么一份好端端的电子表格就不行呢?
OFX —— 即 Open Financial Exchange(开放财务交换) —— 是驱动现代财务软件的隐形标准。正是因为它,Xero 才能在无需您手动映射列的情况下导入银行交易;正是因为它,GnuCash 才能检测到重复项;它也是 QuickBooks 的 QBO 格式所基于的基础。
本指南将详细介绍 OFX 到底是什么、包含哪些内容、它与 CSV 和 QBO 的对比、哪些软件支持它,以及如何从 PDF 银行对账单生成 OFX 文件。
一句话了解 OFX
Open Financial Exchange 是一种基于 XML 的数据格式,用于在金融机构、软件应用程序和最终用户之间交换财务信息。它是 Intuit 的 QBO 格式所基于的开放标准,也是大多数非 QuickBooks 会计软件在导入银行交易时首选的格式。
可以将 OFX 视为财务数据的“通用语言”。银行使用它,会计软件读取它。与 CSV(仅是没有任何内在含义的行和列)不同,OFX 携带结构化的元数据,能准确告知接收软件每个数据项代表的含义。
OFX 的历史
OFX 诞生于 1997 年,由微软 (Microsoft)、Intuit 和 CheckFree 共同创建。当时,每家公司都有自己的竞争标准 —— 微软有 OFC (Open Financial Connectivity),Intuit 有自己的交换格式,而 CheckFree 则有其电子账单协议。OFX 是统一这些标准的折中方案。
版本时间线
- OFX 1.0 (1997) —— 最初的规范,基于 SGML (标准通用标记语言)。SGML 允许不闭合标签,这使得 OFX 1.x 文件看起来与现代 XML 不同。
- OFX 1.6 (2002) —— 应用最广泛的版本。仍基于 SGML。大多数提供 OFX 下载的银行生成的都是 1.6 版本的文件。
- OFX 2.0 (2005) —— 重大重写。从 SGML 切换到带有闭合标签的规范 XML。
- OFX 2.2 (2016) —— 安全性增强,并改进了对投资交易的支持。
- OFX 2.3 (当前) —— 最新版本,由金融数据交换 (FDX) 维护。FDX 是一个行业财团,从最初的创始人手中接管了管理权。
从 SGML 到 XML 的转变非常重要,因为它会影响解析。1.x 版本的文件使用不闭合的标签(例如 <TRNTYPE>DEBIT 后面没有 </TRNTYPE>),而 2.x 版本则使用带有闭合标签的规范 XML。大多数现代解析器都能处理这两种格式,但版本不匹配仍然是常见的 OFX 导入错误原因。
OFX 可以包含的内容
OFX 不仅仅是一种银行对账单格式。该规范涵盖了广泛的财务数据:
- 银行账户对账单 —— 支票、储蓄和货币市场账户交易。这是最常见的用例。
- 信用卡账单 —— 包含商户类别代码和购买详情的交易历史。
- 投资和经纪对账单 —— 股票购买、股息支付、资金转账和投资组合持仓,以及批次级别的成本基础数据。
- 账单支付信息 —— 收款人列表、定期付款和付款确认。
- 税务信息 —— 在金融机构和税务软件之间传输的 1099 表单和其他税务文件。
- 贷款对账单 —— 抵押贷款、汽车贷款和个人贷款的交易记录及余额信息。
对于大多数会计师和簿记员来说,OFX 意味着一件事:将银行和信用卡交易导入会计软件,而无需进行列映射或猜测日期格式。
剖析 OFX 文件
这是一个完整的 OFX 1.6 银行对账单文件的样子。这是您最常遇到的格式 —— 大多数银行和转换工具生成的都是基于 SGML 的版本:
OFXHEADER:100
DATA:OFXSGML
VERSION:160
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE
<OFX>
<SIGNONMSGSRSV1>
<SONRS>
<STATUS>
<CODE>0
<SEVERITY>INFO
</STATUS>
<DTSERVER>20260228120000
<LANGUAGE>ENG
</SONRS>
</SIGNONMSGSRSV1>
<BANKMSGSRSV1>
<STMTTRNRS>
<TRNUID>0
<STATUS>
<CODE>0
<SEVERITY>INFO
</STATUS>
<STMTRS>
<CURDEF>USD
<BANKACCTFROM>
<BANKID>021000021
<ACCTID>123456789
<ACCTTYPE>CHECKING
</BANKACCTFROM>
<BANKTRANLIST>
<DTSTART>20260201120000
<DTEND>20260228120000
<STMTTRN>
<TRNTYPE>CREDIT
<DTPOSTED>20260201120000
<TRNAMT>3500.00
<FITID>20260201001
<NAME>DIRECT DEP PAYROLL
<MEMO>ACME CORP PAYROLL
</STMTTRN>
<STMTTRN>
<TRNTYPE>DEBIT
<DTPOSTED>20260203120000
<TRNAMT>-87.50
<FITID>20260203001
<NAME>POS PURCHASE GROCERY
<MEMO>WHOLE FOODS #10847
</STMTTRN>
<STMTTRN>
<TRNTYPE>CHECK
<DTPOSTED>20260210120000
<TRNAMT>-1200.00
<FITID>20260210001
<NAME>CHECK 1045
<CHECKNUM>1045
</STMTTRN>
</BANKTRANLIST>
<LEDGERBAL>
<BALAMT>4712.50
<DTASOF>20260228120000
</LEDGERBAL>
<AVAILBAL>
<BALAMT>4712.50
<DTASOF>20260228120000
</AVAILBAL>
</STMTRS>
</STMTTRNRS>
</BANKMSGSRSV1>
</OFX>
文件结构分析
该文件包含三个主要部分:
1. 标头块 (Header Block) —— 顶部的纯文本行(在 <OFX> 之前)声明了 OFX 版本、编码和安全设置。这不是 XML —— 它是解析器在处理 SGML/XML 正文之前读取的简单键值对标头。
2. 登录响应 (SIGNONMSGSRSV1) —— 身份验证和服务器元数据。CODE 为 0 表示成功。大多数导入的文件在此处使用占位符值。
3. 对账单响应 (BANKMSGSRSV1) —— 实际的财务数据:
BANKACCTFROM—— 交易所属的账户(路由号码、账号、账户类型)BANKTRANLIST—— 交易列表,由开始和结束日期限定STMTTRN—— 单条交易记录LEDGERBAL和AVAILBAL—— 截至特定日期的结单余额和可用余额
请注意 SGML 语法:像 <TRNTYPE>CREDIT 这样的标签没有闭合的 </TRNTYPE>。解析器通过下一个标签的开始来推断当前值的结束 —— 这是有效的 SGML,但对于 XML 是无效的,这也是为什么 OFX 2.x 增加了闭合标签的原因。
OFX 关键标签
以下是银行对账单 OFX 文件中最常遇到的标签参考表:
| 标签 | 描述 | 示例 |
|---|---|---|
STMTTRN |
对账单交易封装器 | 包含单笔交易的所有字段 |
TRNTYPE |
交易类型 | DEBIT, CREDIT, CHECK, DEP, ATM, POS, XFER, FEE, SRVCHG, INT |
DTPOSTED |
过账日期 | 20260215120000 (YYYYMMDDHHMMSS) |
TRNAMT |
交易金额(带符号) | -87.50 (负数 = 借方), 3500.00 (正数 = 贷方) |
FITID |
金融机构交易 ID | 20260215001 —— 用于重复检测的唯一标识符 |
NAME |
收款人或商户名称 | POS PURCHASE GROCERY |
MEMO |
附加说明 | WHOLE FOODS #10847 AUSTIN TX |
CHECKNUM |
支票号码 | 1045 (仅限支票交易) |
REFNUM |
参考编号 | 银行分配给交易的参考号 |
BANKACCTFROM |
源账户信息 | 包含 BANKID (路由), ACCTID (账号), ACCTTYPE |
LEDGERBAL |
结单/账面余额 | 包含 BALAMT 和 DTASOF |
AVAILBAL |
可用余额 | 包含 BALAMT 和 DTASOF |
CURDEF |
货币代码 | USD, GBP, EUR, AUD, CAD |
FITID —— 为什么它很重要
从会计角度来看,FITID (Financial Institution Transaction ID) 是 OFX 文件中最重要的标签。它是分配给每笔交易的唯一标识符,正是它实现了重复检测功能。
当您将 OFX 文件导入 Xero、GnuCash 或任何其他兼容软件时,它会存储已处理过的每个 FITID。如果再次导入同一个文件,软件会根据数据库检查每个 FITID,并自动跳过重复项。
这是 OFX 相对于 CSV 的主要优势。CSV 没有唯一标识符 —— 如果两次导入同一个文件,您将不得不手动清理重复的分录。
OFX vs CSV
两种格式都可以将银行交易导入会计软件。OFX 胜在结构化,CSV 胜在灵活性。
为什么 OFX 更适合会计导入
| 功能 | OFX | CSV |
|---|---|---|
| 列映射 | 自动 —— 标签定义含义 | 手动 —— 您需要分配每一列 |
| 重复检测 | 支持 (基于 FITID) | 不支持 —— 重新导入会产生重复项 |
| 日期格式 | 无歧义 (YYYYMMDDHHMMSS) | 因地区而异 —— DD/MM/YYYY vs MM/DD/YYYY |
| 金额处理 | 带有 TRNTYPE 的带符号值 | 必须解析正负号、符号和分隔符 |
| 账户识别 | 已嵌入 (路由 + 账号) | 未包含 |
| 余额验证 | 包含结单余额 | 通常不包含 |
| 交易类型 | 已分类 (DEBIT, CREDIT, CHECK 等) | 自由文本或缺失 |
| 多账户文件 | 单个文件即可支持 | 需要分开的文件 |
单是日期格式就能节省数小时的排错时间。在 CSV 中,01/02/2026 是模糊的 —— 是 1 月 2 日还是 2 月 1 日?OFX 通过 YYYYMMDDHHMMSS 消除了这种歧义。20260201120000 永远代表 2026 年 2 月 1 日。
什么时候 CSV 是更好的选择
CSV 也有其合理的优势:
- 数据编辑 —— 您可以在 Excel 中打开 CSV,修复错误,添加分类并重新保存。OFX 文件则需要文本编辑器并了解标签结构。
- Excel 分析 —— 如果您需要对交易数据运行公式、透视表或图表,CSV 是天然的中间格式。
- 自定义处理 —— 编程脚本和数据管道处理 CSV 比处理 OFX 的嵌套标签结构更容易。
- 通用兼容性 —— 每一个能读取表格数据的应用程序都能读取 CSV。但并非每个应用程序都能读取 OFX。
实际建议:导入会计软件时使用 OFX,其他用途使用 CSV。
OFX vs QBO
这是最让人们感到困惑的问题 —— 而答案比您预想的要简单。
QBO (QuickBooks Web Connect) 其实就是换了文件扩展名并增加了一些 Intuit 特定标签的 OFX。底层数据结构是完全相同的。QBO 文件就是 QuickBooks 识别为自家格式的 OFX 文件。
主要区别
| 维度 | OFX | QBO |
|---|---|---|
| 文件扩展名 | .ofx |
.qbo |
| 规范 | 开放标准 (FDX) | Intuit 的品牌子集 |
| 金融机构标识 | 可选的 FI 块 |
INTU.BID 标签 (Intuit 银行 ID) |
| 目标软件 | Xero, MYOB, GnuCash, Wave 等 | QuickBooks (桌面版和在线版) |
| 兼容性 | 更广泛 —— 大多数会计软件 | QuickBooks 专用 |
INTU.BID 标签是 Intuit 的主要添加项 —— 这是一个银行识别码,告诉 QuickBooks 该文件来自哪家金融机构,从而在导入期间自动匹配到正确的银行账户。
在实践中,您可以将 .ofx 文件重命名为 .qbo,QuickBooks 通常也能读取。反之亦然 —— 大多数读取 OFX 的软件也能处理 .qbo 文件。但为了确保导入顺畅,建议使用每个应用程序预期的格式。
此外还有 QFX (Quicken Financial Exchange) —— 同样的 OFX 基础,不同的品牌和文件扩展名,针对 Quicken 用户。
支持 OFX 的软件
OFX 在会计和个人理财软件中得到了广泛支持:
Xero (首选格式)
Xero 明确建议在手动导入银行对账单时优先选择 OFX 而非 CSV。OFX 文件无需配置列即可自动映射,包含基于 FITID 的重复检测,并携带账户元数据。
导入方法: 前往 Accounting > Bank Accounts,选择账户,点击 Manage Account > Import a Statement,然后选择您的 .ofx 文件。每个文件最多支持 1,000 笔交易。
MYOB (全面支持)
MYOB 接受 OFX 用于银行流水导入。过程与 Xero 类似 —— 将文件上传到相关的银行账户,交易就会出现在银行流水界面中,以便进行匹配和分类。
GnuCash (免费开源)
GnuCash 通过 libofx 库内置了 OFX 导入功能。它是处理 OFX 文件的最佳免费选择之一。
导入方法: 前往 File > Import > Import OFX/QFX,选择您的文件,并将其映射到正确的账户。GnuCash 的重复检测功能使用 FITID 来防止重复分录。
其他兼容软件
- Wave —— 支持 OFX 导入的免费会计软件
- Sage Business Cloud —— 接受 OFX 用于银行交易导入
- FreeAgent —— 支持 OFX 和 QIF 文件上传
- Moneydance —— 具有 OFX 直接连接和文件导入功能的个人理财软件
- KMyMoney —— 通过
libofx支持 OFX 的开源个人理财管理器 - Microsoft Money —— 已停止更新但仍有人在使用;内置 OFX 支持曾是其核心功能之一
- Reckon (澳大利亚) —— 在其银行流水导入流程中接受 OFX 文件
QuickBooks 是一个显著的例外 —— 它更倾向于其 QBO 品牌变体,并且在使用包含 INTU.BID 标识符的 .qbo 文件时工作更可靠。
从 PDF 银行对账单创建 OFX 文件
大多数银行不直接提供 OFX 下载。它们给您的是 PDF —— 这种格式是为了打印而设计的,而不是为了数据交换。有些银行提供近期交易(通常是过去 90 天)的 CSV 导出,但对于历史数据、已关闭的账户或没有数字导出选项的银行,您只能使用 PDF。
PDFSub 的银行对账单转换器 可以从 PDF 银行对账单中提取交易,并生成具有正确结构的有效 OFX 文件。输出内容包括每笔交易的唯一 FITID、正确的 YYYYMMDD 日期格式、带有适当交易类型的带符号金额以及账户元数据 —— 这一切都是会计软件进行干净导入所需要的。
该转换器支持来自 133 种语言、超过 20,000 家银行的对账单。数字 PDF(基于文本的对账单)在您的浏览器中处理 —— 文件永远不会离开您的设备。扫描件或图片较多的对账单则通过服务器端 AI 提取。
方案起价为每月 24.90 美元(500 页),并提供 7 天免费试用。有关将生成的 OFX 文件导入 Xero 的详细步骤,请参阅 Xero 银行对账单导入指南。
常见的 OFX 问题及解决方法
OFX 文件虽然是结构化的,但并非万无一失。以下是最常见的问题及其解决方法:
1. 无效的 XML/SGML 语法
症状: 您的软件因解析错误而拒绝该文件。
原因: 标签格式错误、缺少闭合标签(在 2.x 文件中)或说明中包含非法字符。和号 (&) 是最常见的罪魁祸首 —— 在 XML 中它们必须编码为 &,但在像 "AT&T" 这样的名称中经常被直接使用。
解决方法: 在文本编辑器中打开文件,将单独的 & 替换为 &。如果是 2.x 版本的文件,还要检查是否有未闭合的标签。
2. 缺失或重复的 FITID
症状: 导入产生了重复交易,或者软件报告缺少标识符。
原因: 一些转换工具为每笔交易生成相同的 FITID(如 0 或 1),或者完全省略了该标签。
解决方法: 每个 FITID 在文件内必须是唯一的。常见的模式是结合日期和顺序计数器:20260215001、20260215002 等。在导入前,在文本编辑器中修改占位符 FITID。
3. 错误的日期格式
症状: 交易显示在错误的日期,或者软件显示的日期是 1900 年或 2099 年。
原因: DTPOSTED 值不符合 YYYYMMDDHHMMSS 格式。YYYYMMDD(不含时间)是可以的,但 DD/MM/YYYY 或 MM-DD-YYYY 会导致解析错误。
解决方法: 确保所有 DTPOSTED 值使用 YYYYMMDD 或 YYYYMMDDHHMMSS。20260215 和 20260215120000 都是有效的。
4. 字符编码问题
症状: 交易说明显示乱码、问号或缺失重音符号。
原因: 文件标头声明了一种编码(通常是 USASCII 或 UTF-8),但实际内容使用了不同的编码。这在包含非 ASCII 字符的国际银行对账单中尤为常见。
解决方法: 更改 ENCODING 标头以匹配实际的文件编码。对于带有重音字符的国际对账单,UTF-8 是最安全的选择。一些较旧的软件要求使用不含特殊字符的 USASCII。
5. 版本兼容性 (1.x vs 2.x)
症状: 预期 OFX 2.x 的软件拒绝 1.x 文件,反之亦然。
原因: OFX 1.x 使用 SGML(不闭合标签),而 2.x 使用 XML(闭合标签)。专为其中一个版本构建的解析器可能会在另一个版本上出错。
解决方法: 大多数现代会计软件都能处理这两个版本。如果您的软件不行,可以通过添加闭合标签(1.x 转 2.x)或删除闭合标签(2.x 转 1.x)来进行版本转换。文本编辑器的查找替换功能可以处理小型文件。
常见问题解答
OFX 代表什么?
OFX 代表 Open Financial Exchange(开放财务交换) —— 这是一种用于在金融机构和最终用户应用程序之间电子交换财务数据的开放标准,由金融数据交换 (FDX) 维护。
OFX 和 QBO 是一样的吗?
几乎一样。QBO 是 Intuit 为 QuickBooks 推出的 OFX 品牌版本。数据结构是相同的 —— QBO 增加了用于银行识别的 INTU.BID 标签,并使用 .qbo 扩展名。您通常可以将 .ofx 重命名为 .qbo,QuickBooks 就会接受它。
我可以在 Excel 中打开 OFX 文件吗?
不能直接作为结构化数据打开。Excel 会将该文件作为文本文件打开,显示原始的 SGML/XML 标记。要在 Excel 中查看 OFX 数据,您需要先将其转换为 CSV 或 XLSX,或者使用能将 OFX 标签解析为表格列的第三方插件。
对于 Xero 来说,OFX 和 CSV 哪个更好?
对于 Xero,OFX 更好。它无需列映射即可自动导入,包含基于 FITID 的重复检测,使用无歧义的日期格式,并携带账户元数据。Xero 官方文档建议在手动导入银行对账单时优先选择 OFX 而非 CSV。
银行提供 OFX 下载吗?
有些银行提供,但并不统一。美国、英国和澳大利亚的大型银行可能会提供近期交易(通常是过去 90 天)的 OFX 或 QFX 下载。许多较小的银行、信用社和国际机构仅提供 PDF 对账单。对于超出下载窗口的历史数据,PDF 转换通常是唯一的选择。
OFX 安全吗?
OFX 规范包含了传输过程中的 SSL/TLS 加密以及直接连接的基于证书的身份验证条款。然而,保存在磁盘上的 OFX 文件是纯文本的 —— 它以可读形式包含账号和交易详情。请像对待任何财务文件一样谨慎对待 OFX 文件。
OFX 1.x 和 2.x 有什么区别?
OFX 1.x 使用 SGML 标记(标签不需要闭合),而 OFX 2.x 使用规范 XML(所有标签必须有始有终)。数据内容是一样的 —— 区别在于语法。1.6 版本仍然是生成最广泛的格式。大多数现代会计软件都能毫无问题地解析这两个版本。
我可以手动编辑 OFX 文件吗?
可以。OFX 文件是纯文本,可以在任何文本编辑器中编辑。您可以修复说明、更正金额、添加缺失的 FITID 或调整日期。只需保持标签结构完整即可 —— 未闭合或不匹配的标签会导致导入失败。对于 OFX 2.x 文件,请确保每个开始标签都有对应的闭合标签。