AI 自动解析银行对账单并分类交易流水
通过 n8n webhook 接收 PDF/Excel/CSV 对账单,经 AI 提取结构化交易数据,分类后存入 PostgreSQL 并返回汇总
- 给谁
- 需要自动化处理银行对账单、提取交易并分类存储的财务或运营人员
- 你会得到
- 上传对账单文件后,自动获得含账户信息、交易明细、支出分类汇总的标准化 JSON 响应,数据持久化到数据库
- 你需要
- n8n · postgres
硬约束
前置条件:可访问的 n8n 实例;OpenAI API 密钥(openAiApi 凭证);PostgreSQL 数据库及写入权限;需预先创建 bank_statements 表。输入为 PDF、Excel 或 CSV 格式的银行对账单文件;输出为 JSON 汇总及数据库记录。来源声称设置时间约 8–12 分钟。
他们做了什么
来源作者 vinci-king-01 在 n8n 上发布了一个工作流模板,包含 9 个节点:Webhook 接收上传、Code 提取文件信息、If 路由文件类型、Extract from File 提取 PDF 文本、Spreadsheet File 解析 Excel/CSV、OpenAI 节点提取结构化交易数据、Code 清洗汇总、Postgres 存储、Respond to Webhook 返回 JSON。模板描述声称支持 PDF、Excel、CSV 三种格式,使用 GPT-4 系列模型进行提取与自动分类,分类涵盖 groceries、dining、gas 等 10 类,数据最终存入 PostgreSQL。
效果如何
来源声称设置时间约 8–12 分钟,支持多格式上传、AI 提取、自动分类、数据验证、数据库存储及干净 JSON 响应。具体准确率、处理速度、异常文件表现未在来源中报告。(author_report)
值得知道
1)本站未实际导入运行该工作流,reproduction=not_tested;2)bank_statements 表需预先手动创建,来源未提供完整 DDL;3)PDF 提取依赖 n8n 的 Extract from File 节点,复杂扫描版 PDF 可能识别失败;4)AI 输出为 JSON 字符串,Process & Summarize 节点使用正则提取首个 {…} 块,若模型输出格式异常可能导致解析为空数组;5)分类列表为英文硬编码,非英文对账单可能需要调整提示词;6)数据库写入需确保字段类型与映射匹配,否则插入失败;7)来源 workflow.json 中 credential id 为占位符,实际使用需替换为真实凭证。
n8n 工作流模板
结构已检查 · 未实际运行下载后在 n8n 选择“Import from File”,或复制 JSON 后粘贴到编辑器。先配置自己的账号,再用测试数据运行;模板默认未启用。
配置与测试清单
需要绑定的凭证
- openAi 节点:绑定OpenAI API 凭证。
- postgres 节点:绑定Postgres 连接凭证。
需要替换的配置
- 源模板来自 n8n 公开库 #6629(约 9 个节点)。导入后先保持未启用,核对触发器、表达式与外部 API 端点。
- Sticky Note 中的说明仅供参考;按自己的账号、表结构或频道 ID 替换占位配置。
测试输入与预期结果
- 在测试环境手动执行一次主路径,确认每个需凭证的节点已连接且无鉴权错误。
- 用一条合成/脱敏样例数据跑通,核对输出字段与下游写入目标,再考虑生产启用。
模板处理说明
- 已移除原作者凭证绑定、webhookId 与执行数据,工作流设为未启用;节点、连线与原文提示词保持原样。未在 n8n 中实际运行。
- 未改业务逻辑;运行前请自行核对密钥、配额与隐私合规。
模板获取日期: 2026-10-24
步骤
前置准备与凭证配置
在 n8n 中配置 OpenAI API 凭证(openAiApi)和 PostgreSQL 数据库凭证(postgres)。在 PostgreSQL 中创建 bank_statements 表,需包含 raw_data、bank_name、processed_at、total_income、account_number、total_expenses、statement_period、total_transactions 等字段(与 Save to Database 节点映射字段一致)。自定义分类列表可在后续 AI 节点提示词中调整。
上传对账单并智能路由
通过 POST 请求向 /upload-statement webhook 端点上传银行对账单文件(PDF、Excel 或 CSV)。Webhook 节点接收后,File Handler 代码节点提取文件名、MIME 类型等元数据,并保留 binary 数据。Check File Type 节点根据 contentType 是否包含 application/pdf 进行路由:PDF 文件进入 Extract PDF Text 节点提取文本;Excel/CSV 文件进入 Parse Excel/CSV 节点解析为结构化数据。
运行提示词 · 来源原文。File Handler 节点(n8n-nodes-base.code)的 jsCode 参数
// Simple file processor const inputData = $input.all()[0]; const files = []; // Handle file uploads if (inputData.binary) { Object.keys(inputData.binary).forEach(key => { const file = inputData.binary[key]; files.push({ filename: file.fileName, contentType: file.mimeType, uploadedAt: new Date().toISOString() }); }); } return files.map(file => ({ json: { filename: file.filename, contentType: file.contentType, uploadedAt: file.uploadedAt, status: 'ready_for_processing' }, binary: inputData.binary }));AI 提取交易与分类
Extract PDF Text 或 Parse Excel/CSV 的输出进入 AI Data Extractor 节点(OpenAI)。system 提示词要求模型提取账户信息、交易明细、余额,并返回指定格式的 JSON;user 提示词传入提取的文本或结构化数据。模型默认使用 gpt-4o-mini,来源亦提及 GPT-4 系列可用。分类包括:groceries、dining、gas、shopping、utilities、healthcare、entertainment、income、fees、other。
运行提示词 · 来源原文。AI Data Extractor 节点(OpenAI)system message 字段
Extract bank statement data and return clean JSON: { "account_number": "****1234", "bank_name": "Bank Name", "statement_period": "2024-01-01 to 2024-01-31", "opening_balance": 1500.00, "closing_balance": 1250.00, "transactions": [ { "date": "2024-01-15", "description": "GROCERY STORE", "amount": -45.67, "category": "groceries" } ] } Use negative amounts for expenses, positive for income. Categorize transactions as: groceries, dining, gas, shopping, utilities, healthcare, entertainment, income, fees, or other.运行提示词 · 来源原文。AI Data Extractor 节点(OpenAI)user message 字段
{{ $json.data || $json.extracted_text }}数据清洗与汇总计算
Process & Summarize 代码节点接收 AI 输出,解析 JSON 内容,清洗交易数据(生成唯一 ID、格式化日期、大写描述、数值化金额、填充缺失分类),并计算总支出、总收入、净变化及按分类的支出汇总。若解析失败,返回空 transactions 数组以避免中断。
运行提示词 · 来源原文。Process & Summarize 节点(n8n-nodes-base.code)的 jsCode 参数
// Clean and validate extracted data const inputData = $input.all()[0]; let extractedData = {}; // Parse AI response try { const content = inputData.json.message?.content || inputData.json; if (typeof content === 'string') { const jsonMatch = content.match(/{[\s\S]*}/); if (jsonMatch) { extractedData = JSON.parse(jsonMatch[0]); } } else { extractedData = content; } } catch (error) { console.log('Parse error:', error.message); extractedData = { transactions: [] }; } // Clean transaction data const cleanTransactions = (extractedData.transactions || []).map((tx, index) => ({ id: `tx_${Date.now()}_${index}`, date: tx.date, description: (tx.description || '').trim().toUpperCase(), amount: parseFloat(tx.amount) || 0, category: tx.category || 'other', processed_at: new Date().toISOString() })); // Calculate summary const totalExpenses = cleanTransactions .filter(tx => tx.amount < 0) .reduce((sum, tx) => sum + Math.abs(tx.amount), 0); const totalIncome = cleanTransactions .filter(tx => tx.amount > 0) .reduce((sum, tx) => sum + tx.amount, 0); const categoryTotals = {}; cleanTransactions.forEach(tx => { if (tx.amount < 0) { // Only expenses categoryTotals[tx.category] = (categoryTotals[tx.category] || 0) + Math.abs(tx.amount); } }); return [{ json: { account_info: { account_number: extractedData.account_number || 'Unknown', bank_name: extractedData.bank_name || 'Unknown', statement_period: extractedData.statement_period || 'Unknown', opening_balance: parseFloat(extractedData.opening_balance) || 0, closing_balance: parseFloat(extractedData.closing_balance) || 0 }, transactions: cleanTransactions, summary: { total_transactions: cleanTransactions.length, total_expenses: totalExpenses, total_income: totalIncome, net_change: totalIncome - totalExpenses, category_breakdown: categoryTotals }, processed_at: new Date().toISOString(), status: 'completed' } }]);存入 PostgreSQL 数据库
Save to Database 节点将处理后的数据插入 bank_statements 表。字段映射包括:raw_data(完整 JSON)、bank_name、processed_at、total_income、account_number、total_expenses、statement_period、total_transactions。需确保数据库表结构与映射字段匹配,否则插入失败。
返回 JSON 响应
Send Response 节点向 webhook 调用方返回 JSON,包含 success 状态、处理交易数、总支出、总收入及分类汇总。responseBody 使用 n8n 表达式引用上游节点的汇总字段。
可复制提示词
搭建指导 · 本站建议版本。交给搭建助手,先确认输入和权限
这一段是提示词,页面不会在这里插入广告。
你正在搭建一个 n8n 工作流,用于自动接收银行对账单文件(PDF/Excel/CSV),通过 AI 提取并分类交易,最终存入 PostgreSQL 并返回汇总。请先确认:1)n8n 实例已运行;2)已配置 OpenAI 和 PostgreSQL 凭证;3)已创建 bank_statements 表;4)已根据本用例步骤导入或重建 9 个节点及其连线。如需调整分类,请修改 AI Data Extractor 节点的 system 提示词中的分类列表。
核心可调参数:AI 节点 model 字段(gpt-4o-mini / gpt-4o / gpt-4)、分类列表、PostgreSQL 表字段映射、webhook 路径。
来源
AI-powered bank statement analysis & transaction categorization · vinci-king-01 · n8n.io · 2025-07-29
留言与反馈
Agent 反馈
以下反馈由 Agent 提交,经用户确认和审核后公开,不代表平台已验证。