9.2 KiB
9.2 KiB
财务Excel数据处理系统 - 需求文档
项目概述
本系统用于自动化处理财务Excel数据,提取收款信息并生成标准会计分录表,支持数据验证和异常标记功能。
功能模块
模块一: Excel数据提取 (process_excel.py)
1.1 数据源
- 文件路径:
data/data.xlsx - 工作表: Sheet1
- 数据起始行: 第2行(第1行为表头)
1.2 数据提取规则
1.2.1 主记录字段
-
ReceivedAmount (实收金额)
- 来源: F列
- 说明: 支持合并单元格(一行或多行)
- 处理: 非合并单元格按单行处理
-
HandlingFee (手续费)
- 来源: G列
- 处理: 空值自动记为0
1.2.2 订单明细字段
- Order (订单列表)
- 范围: F列合并单元格包含的所有行
- 包含字段:
- OrderNum (订单号): H列
- Amount (金额): I列
- AccountName (账户名称): O列(支持公式,读取计算结果)
1.2.3 数据验证
- checkRes (验证结果): Boolean
- 计算规则:
ReceivedAmount + HandlingFee ≈ Sum(Order[].Amount) - 容差: 0.01
- true: 金额匹配
- false: 金额不匹配,需要人工核对
- 计算规则:
1.3 输出格式
文件: res.json
结构:
[
{
"ReceivedAmount": 12125,
"HandlingFee": 25,
"Order": [
{
"OrderNum": "XLRQD300T25",
"Amount": 550,
"AccountName": "24台湾长荣航运"
},
{
"OrderNum": "XLRQD044T25",
"Amount": 11600,
"AccountName": "24台湾长荣航运"
}
],
"checkRes": true
}
]
1.4 特殊处理
- 跳过订单号为空的行
- 处理F列合并和非合并单元格混合的情况
- 读取O列公式计算后的值(data_only=True)
模块二: 会计分录生成 (generate_accounting_entries.py)
2.1 输入输出
- 输入:
res.json - 输出:
AccountingEntries.xlsx
2.2 会计分录规则
2.2.1 基本分录
每笔 ReceivedAmount 记录生成以下分录:
1) 到账金额 - 借方记录 (每笔记录1条)
- 科目代码:
1002.02 - 科目名称:
银行存款 - 中行USD - 摘要:
美金收款-{OrderNum} - 核算项目: Order[0].AccountName
- 币别: 美元
- 汇率: 7.1072 (可配置)
- 原币金额: ReceivedAmount
- 金额: ReceivedAmount × 汇率
2) 手续费 - 借方记录 (仅当 HandlingFee > 0)
- 科目代码:
5603.03 - 科目名称:
财务费用-手续费 - 摘要:
美金收款-{OrderNum} - 核算项目: 空
- 币别: 人民币
- 汇率: 空
- 原币金额: 空
- 金额: HandlingFee × 汇率
3) 订单明细 - 贷方记录 (每个Order记录1条)
- 科目代码:
1122 - 科目名称:
应收账款 - 应收账款: Order.Amount (显示在"应收账款"列)
- 摘要:
美金收款-{OrderNum} - 核算项目: Order.AccountName
- 币别: 美元
- 汇率: 7.1072 (可配置)
- 原币金额: Order.Amount
- 金额: Order.Amount × 汇率
2.2.2 特殊规则
空值处理
- Order.Amount为null的订单跳过,不生成分录
金额验证
- checkRes为false的记录,所有相关分录行标记为粉红色背景(#FAD1D4)
2.3 Excel格式设置
2.3.1 表头
- 字段: 到账金额, 手续费, 订单号, 应收账款, 金蝶名称, 摘要, 借/贷, 科目代码(), 科目名称(), 核算项目, 币别, 汇率, 原币金额, 金额
- 样式: 粗体, 蓝色背景(#CCE5FF), 居中对齐
2.3.2 单元格合并
- 到账金额列 (A列): 同一ReceivedAmount的所有分录行合并
- 手续费列 (B列): 同一ReceivedAmount的所有分录行合并
- 对齐方式: 垂直居中,水平居中
2.3.3 异常标记
- 条件: 原始记录的 checkRes = false
- 处理: 该记录产生的所有分录行设置背景色
- 颜色: #FAD1D4 (粉红色)
- 目的: 突出显示金额不匹配的记录,便于人工核对
2.3.4 列宽设置
A(到账金额): 12, B(手续费): 10, C(订单号): 18,
D(应收账款): 12, E(金蝶名称): 25, F(摘要): 25,
G(借/贷): 8, H(科目代码): 15, I(科目名称): 25,
J(核算项目): 25, K(币别): 10, L(汇率): 10,
M(原币金额): 12, N(金额): 15
配置参数
汇率配置
- 变量名:
EXCHANGE_RATE - 位置:
generate_accounting_entries.py第12行 - 默认值: 7.1072
- 修改方式: 直接编辑变量值
# 固定汇率
EXCHANGE_RATE = 7.1072 # 修改此值
数据流程
data/data.xlsx (原始数据)
↓
[process_excel.py 提取]
↓
res.json (中间数据)
↓
[generate_accounting_entries.py 生成]
↓
AccountingEntries.xlsx (会计分录表)
技术要求
开发语言
- Python 3.x
依赖库
- openpyxl: Excel文件读写
安装命令
pip install openpyxl --break-system-packages
数据示例
输入示例 (data.xlsx)
| 到账金额 | 手续费 | 订单号 | 解款金额 | 金蝶名称 |
|---|---|---|---|---|
| 12125 | 25 | XLRQD300T25 | 550 | 24台湾长荣航运 |
| (合并) | (合并) | XLRQD044T25 | 11600 | 24台湾长荣航运 |
中间数据 (res.json)
{
"ReceivedAmount": 12125,
"HandlingFee": 25,
"Order": [
{"OrderNum": "XLRQD300T25", "Amount": 550, "AccountName": "24台湾长荣航运"},
{"OrderNum": "XLRQD044T25", "Amount": 11600, "AccountName": "24台湾长荣航运"}
],
"checkRes": true
}
输出示例 (AccountingEntries.xlsx)
| 到账金额 | 手续费 | 订单号 | 应收账款 | 金蝶名称 | 借/贷 | 科目代码 | 科目名称 | 币别 | 原币金额 | 金额 |
|---|---|---|---|---|---|---|---|---|---|---|
| 12125 | 25 | XLRQD300T25 | 24台湾长荣航运 | 借 | 1002.02 | 银行存款 - 中行USD | 美元 | 12125 | 86,174.80 | |
| (合并) | (合并) | XLRQD300T25 | 借 | 5603.03 | 财务费用-手续费 | 人民币 | 177.68 | |||
| (合并) | (合并) | XLRQD300T25 | 550 | 24台湾长荣航运 | 贷 | 1122 | 应收账款 | 美元 | 550 | 3,908.96 |
| (合并) | (合并) | XLRQD044T25 | 11600 | 24台湾长荣航运 | 贷 | 1122 | 应收账款 | 美元 | 11600 | 82,443.52 |
验证规则
checkRes计算
received_plus_fee = ReceivedAmount + HandlingFee
order_amount_sum = Sum(Order[].Amount where Amount is not null)
checkRes = abs(received_plus_fee - order_amount_sum) < 0.01
异常情况
- checkRes = false: 粉红色背景标记
- Order.Amount = null: 跳过该订单,不生成分录
- HandlingFee = null: 自动记为0
测试用例
测试用例1: 正常单订单
- 输入: ReceivedAmount=695, HandlingFee=0, Order[0].Amount=695
- 预期: 2行分录(到账借+订单贷), checkRes=true
- 应收账款列: 贷方记录显示695
测试用例2: 正常多订单
- 输入: ReceivedAmount=12125, HandlingFee=25, Order=[550, 11600]
- 预期: 4行分录(到账借+手续费借+2个订单贷), checkRes=true
- 应收账款列: 两条贷方记录分别显示550和11600
测试用例3: 金额不匹配
- 输入: ReceivedAmount=17270, HandlingFee=0, Order=[5676, 11450]
- 预期: checkRes=false, 所有分录行粉红色背景(#FAD1D4)
测试用例4: 订单金额为空
- 输入: ReceivedAmount=240, HandlingFee=25, Order[0].Amount=null
- 预期: 跳过订单明细分录,不报错,只生成到账借方和手续费借方
文件清单
| 文件名 | 类型 | 说明 |
|---|---|---|
| data/data.xlsx | 输入 | 原始财务数据 |
| process_excel.py | 程序 | 数据提取脚本 |
| res.json | 中间 | 提取的JSON数据 |
| generate_accounting_entries.py | 程序 | 会计分录生成脚本 |
| AccountingEntries.xlsx | 输出 | 会计分录表 |
| analyze_excel.py | 工具 | Excel结构分析工具 |
| task.md | 文档 | 需求文档(本文件) |
| User.md | 文档 | 用户使用说明 |
性能要求
- 支持处理300+行Excel数据
- 生成500+行会计分录
- 处理时间 < 10秒
- 实测: 174条记录生成566条会计分录
错误处理
Excel读取错误
- 文件不存在: 提示并退出
- Sheet1不存在: 提示并退出
- 列映射错误: 记录日志,跳过该行
数据验证错误
- 空值: 自动处理(HandlingFee=0, 跳过Amount=null)
- 格式错误: 记录日志,继续处理
- checkRes=false: 标记但继续处理
扩展需求
未来可能增加的功能
- 支持多工作表批量处理
- 汇率从配置文件读取
- 生成汇总统计报表
- 支持导出金蝶格式
- 添加数据修正功能
版本信息
- 版本: v1.1
- 最后更新: 2025-01-17
- 作者: Claude Code
- 状态: 已完成并测试
版本历史
v1.1 (2025-01-17)
- 优化会计分录规则: 移除"到账金额-贷方"记录
- 每个Order记录都生成对应的贷方分录(无例外)
- Order生成的贷方记录在"应收账款"列显示Amount金额
- 简化单订单处理逻辑,移除单订单优化规则
v1.0 (2025-01-17)
- 初始版本
- Excel数据提取功能
- 会计分录生成功能
- 合并单元格支持
- 金额验证功能
- 异常背景色标记
备注
- 所有金额计算保留2位小数
- 汇率统一使用固定值,不从Excel读取
- 合并单元格的值读取左上角单元格
- O列公式使用data_only=True读取计算结果
- 背景色仅用于标记,不影响数据内容