Install
openclaw skills install imp-trm-accstmt将MT940、Excel或PDF格式的银行对账单转换为BIPV5、金蝶云星瀚、保融ATS、九恒星司库、用友NCC等系统的标准导入模板。
openclaw skills install imp-trm-accstmt将银行对账单文件(MT940格式、国内银行Excel格式或PDF格式)转换为目标系统的标准银行账户流水导入模板。
| 银行 | 状态 |
|---|---|
| 招商银行 | ✓ |
| 中信银行 | ✓ |
| 兴业银行 | ✓ |
| 浦发银行 | ✓ |
| 民生银行 | ✓ |
| 徽商银行 | ✓ |
| 广西北部湾银行 | ✓ |
| 渤海银行 | ✓ |
| 国开行 | ✓ |
| 中原银行 | ✓ |
| 上海银行 | ✓ |
| 银行 | 状态 | 备注 |
|---|---|---|
| 中国农业发展银行 | ✓ | 文本型PDF,含电子回单 |
| 河南农商银行 | ✓ | 文本型PDF |
| 平安银行 | ✓ | 文本型PDF |
| 恒丰银行 | ✓ | 文本型PDF(列头多行折行) |
| 浙商银行 | ✓ | 文本型PDF |
| 珠江村镇银行 | ✓ | 文本型PDF(多页) |
| 郑州银行 | ✓ | 文本型PDF(多页) |
| 上海浦东发展银行 | △ | 已知限制:英文+中文混合版式,交易明细提取受限 |
单文件转换:
请将 平安银行.pdf 银行对账单转换为 BIPV5 系统的导入模板
批量合并转换(将目录下所有对账单合并为单个文件):
将当前目录下所有银行对账单(MT940、Excel和PDF格式)合并转换为一个BIPV5导入模板
将以下银行对账单转换为 BIPV5 系统导入模板:
- 输入文件:/path/to/平安银行.pdf
- 输出文件:/path/to/output/BIPV5_平安银行.xlsx
- 目标系统:BIPV5
- 账户组织编码:ORG001
- 银行名称:平安银行
| 转换模式 | 默认输出位置 |
|---|---|
| 单文件转换 | 与输入文件相同目录 |
| 批量合并转换 | 与输入目录相同位置 |
| 指定输出路径 | 用户指定路径 |
输出文件名格式:
{原文件名}_BIPV5.xlsxmerged_BIPV5.xlsx┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 输入文件 │───▶│ 格式解析器 │───▶│ 数据映射器 │───▶│ 输出生成器 │
│ (MT940/Excel/ │ │ (Parser) │ │ (Mapper) │ │ (Excel) │
│ PDF) │ │ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
parsers/ mappings/ 输出文件
mt940_parser.py mt940_to_bipv5.json BIPV5_银行流水.xlsx
excel_parser.py
pdf_parser.py
| 字段代码 | 中文名称 | 必填 | 说明 |
|---|---|---|---|
| accentity_code | 账户使用组织编码 | 否 | 组织编码 |
| bankaccount_account | *银行账号 | 是 | 银行账号 |
| bankNumber_name | 银行名称 | 否 | 开户行名称 |
| bank_seq_no | *本方交易流水号 | 是 | 银行流水序号 |
| tran_date | *交易日期 | 是 | 交易日期YYYY-MM-DD |
| tran_time | 交易时间 | 否 | 交易时间HH:MM:SS |
| dc_flag | 借贷标识 | 否 | C=贷,D=借 |
| debitamount | 支出金额 | 否 | 借方发生额 |
| creditamount | 收入金额 | 否 | 贷方发生额 |
| currency_name | *币种 | 是 | ISO币种代码 |
| tran_amt | 金额 | 否 | 交易金额 |
| to_acct_no | 对方账号 | 否 | 交易对方账号 |
| to_acct_name | 对方户名 | 否 | 交易对方名称 |
| to_acct_bank_name | 对方银行名称 | 否 | 对方银行 |
| use_name | 用途 | 否 | 资金用途 |
| remark | 摘要 | 否 | 交易摘要 |
| remark01 | 附言 | 否 | 附加说明 |
| acct_bal | 余额 | 否 | 账户余额 |
MT940格式关键字段映射:
| MT940 Tag | 说明 | 示例 |
|---|---|---|
| :20: | 交易参考号 | STMT24010001 |
| :25: | 账号识别 | 1234567890 |
| :28C: | 语句编号 | 1/1 |
| :60F: | 期初余额 | D240101USD1000,00 |
| :61: | 交易记录 | 日期+借贷+金额 |
| :86: | 交易详情 | 对方名称等 |
| :62F: | 期末余额 | C240131USD1500,00 |
双模式支持:
page.get_text() 直接提取文字位置信息驱动:使用 PyMuPDF 的 X/Y 坐标信息按列重组表格,不依赖固定列数
列头归一化:智能处理多种列头折行格式:
交易时 + 间 → 交易时间)贷方发 + 生额(收 + 入) → 贷方发生额(收入))发生金额(元) → 发生金额)可插拔OCR接口:
from scripts.parsers.pdf_parser import PDFParser, TesseractOCR
parser = PDFParser()
parser.set_ocr_backend(TesseractOCR()) # 注入 Tesseract OCR
data = parser.parse('image_based.pdf')
多页PDF自动合并:跨页交易表自动识别(按 Y 坐标分组、按 X 坐标排序列)
scripts/parsers/ 目录创建新的解析器文件BaseParser 类parse() 和 detect_format() 方法scripts/core/parser_factory.py 中注册模板文件: assets/template/YYBIPV5_banktransaction.xlsx
Sheet: 银行流水处理
├── Row 1-3: 模板说明
├── Row 4: 英文字段名 (id, accentity_code, bankaccount_account, ...)
├── Row 5: 空行
├── Row 6: 中文字段名 (*银行账号, *本方交易流水号, ...)
├── Row 7-9: 空行
└── Row 10+: 数据行
BIPPI-imp-trm-accstmt/
├── SKILL.md # 技能说明文件
├── scripts/
│ ├── main.py # 主入口
│ ├── core/
│ │ ├── data_structures.py # 数据结构定义
│ │ ├── parser_factory.py # 解析器工厂
│ │ ├── mapper_factory.py # 映射器工厂
│ │ ├── cosine_similarity.py # 余弦相似度工具
│ │ ├── currency_map.py # 币种代码映射
│ │ └── template_manager.py # 模板文件管理器(本地查找+自动下载)
│ ├── parsers/
│ │ ├── base_parser.py # 解析器基类
│ │ ├── mt940_parser.py # MT940解析器
│ │ ├── excel_parser.py # 国内银行Excel解析器
│ │ └── pdf_parser.py # 国内银行PDF解析器(文本+可插拔OCR)
│ ├── mappers/
│ │ ├── base_mapper.py # 映射器基类
│ │ ├── _xls_template_helpers.py # xls模板写入辅助
│ │ ├── bipv5_mapper.py # BIPV5映射器
│ │ ├── eas_yxh_mapper.py # 金蝶云星瀚映射器
│ │ ├── fingard_mapper.py # 保融ATS映射器
│ │ ├── nstc_mapper.py # 九恒星司库映射器
│ │ └── yyncc_mapper.py # 用友NCC映射器
│ └── mappings/
│ └── mt940_to_bipv5.json # MT940到BIPV5映射配置
├── assets/
│ └── template/ # 5 个目标系统的导入模板
│ ├── YYBIPV5_banktransaction.xlsx
│ ├── eas_yxh_banktransaction.xlsx
│ ├── fingard_banktransaction.xls
│ ├── nstc_banktransaction.xls
│ └── yyncc_banktransaction.xls
├── references/
│ ├── currency.md # 币种代码参考
│ └── User Guide - Exporting Data in SWIFT MT940 Format[1].pdf
└── evals/
└── evals.json # 测试用例
# 单文件转换(输出到输入文件同目录)
python scripts/main.py input.xlsx
python scripts/main.py input.pdf
# 单文件转换(指定输出路径)
python scripts/main.py input.xlsx -o output/BIPV5_output.xlsx
python scripts/main.py input.pdf -o output/BIPV5_output.xlsx
# 批量转换(每个文件单独输出到输入目录)
python scripts/main.py --batch -i ./input_dir
# 批量合并(输出到输入目录)
python scripts/main.py --merge -i ./input_dir
# 批量合并(指定输出文件)
python scripts/main.py --merge -i ./input_dir -o ./output/merged.xlsx
安装依赖:
pip install openpyxl pandas scikit-learn pymupdf pillow
如需OCR支持图片型PDF(可选):
pip install pytesseract
# 还需要安装系统级 Tesseract:Windows 从 https://github.com/UB-Mannheim/tesseract/wiki 下载并安装
# 安装中文语言包(chi_sim),然后在 PDFParser 中注入:
# parser.set_ocr_backend(TesseractOCR())
| 错误代码 | 说明 | 处理建议 |
|---|---|---|
| E001 | 无法识别文件格式 | 检查文件是否为有效的MT940/Excel/PDF格式 |
| E002 | 解析失败 | 检查文件内容是否符合规范 |
| E003 | 必填字段缺失 | 检查映射配置是否完整 |
| E004 | 日期格式错误 | 检查日期字段格式配置 |
| E005 | 金额格式错误 | 检查金额字段格式配置 |
| E006 | 映射配置错误 | 检查JSON配置文件语法 |
| E007 | 输出目录不存在 | 创建输出目录 |
| E008 | PDF无可提取文字且未配置OCR | 安装Tesseract OCR并注入后端,或预转换PDF为文本型 |
| E009 | PDF页面无文字层且无图片 | 检查PDF是否有效 |
BaseParserparse() 和 detect_format() 方法parser_factory.py 中注册BaseMappermapper_factory.py 中注册OCRBackend 接口的 image_to_text 方法PDFParser.set_ocr_backend(your_backend) 注入