Files
TableProcessing/README.md
yangfan cc9f3e21c9 fix
2025-10-17 17:44:24 +08:00

379 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 财务Excel数据处理程序 - 使用说明
## 概述
本程序用于处理财务Excel数据,自动提取收款信息并生成会计分录表。
---
## 前置要求
### 运行环境
- **Python版本**: Python 3.x
- **操作系统**: Windows / Linux / macOS
### 依赖库安装
本程序依赖以下Python第三方包:
#### 1. openpyxl
**用途**: Excel文件读写操作
**安装命令**:
```bash
pip install openpyxl --break-system-packages
```
或使用虚拟环境(推荐):
```bash
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
# Linux/Mac:
source venv/bin/activate
# Windows:
venv\Scripts\activate
# 安装依赖
pip install openpyxl
```
**版本要求**: 建议使用最新稳定版本
#### 验证安装
安装完成后,可以通过以下命令验证:
```bash
python3 -c "import openpyxl; print(openpyxl.__version__)"
```
如果输出版本号(例如: 3.1.2),则说明安装成功。
---
## 功能说明
### 1. 数据提取 (`process_excel.py`)
从Excel文件中提取财务数据并输出为JSON格式。
**输入文件**: `data/data.xlsx` (Sheet1)
**输出文件**: `res.json`
**提取字段**:
- `ReceivedAmount`: 实收金额 (F列)
- `HandlingFee`: 手续费 (G列空值记为0)
- `Order`: 订单列表
- `OrderNum`: 订单号 (H列可以为空)
- `Amount`: 金额 (I列必需)
- `AccountName`: 账户名称 (O列)
- `checkRes`: 验证结果 (实收金额+手续费 = 订单金额之和)
**运行命令**:
```bash
python3 process_excel.py
```
**输出示例**:
```json
[
{
"ReceivedAmount": 12125,
"HandlingFee": 25,
"Order": [
{
"OrderNum": "XLRQD300T25",
"Amount": 550,
"AccountName": "24台湾长荣航运"
}
],
"checkRes": true
}
]
```
---
### 2. 会计分录生成 (`generate_accounting_entries.py`)
根据`res.json`生成标准会计分录表。
**输入文件**: `res.json`
**输出文件**: `AccountingEntries.xlsx`
**运行命令**:
```bash
python3 generate_accounting_entries.py
```
---
## 会计分录规则
### 基本规则
每笔到账金额产生以下分录:
1. **到账金额 - 借方** (每笔记录1条)
- 科目代码: `1002.02`
- 科目名称: `银行存款 - 中行USD`
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
- 币别: 美元
- 原币金额: ReceivedAmount
- 金额: ReceivedAmount × 汇率
2. **手续费 - 借方** (如果手续费>0)
- 科目代码: `5603.03`
- 科目名称: `财务费用-手续费`
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
- 币别: 人民币
- 金额: HandlingFee × 汇率
3. **订单明细 - 贷方** (每个Order记录1条)
- 科目代码: `1122`
- 科目名称: `应收账款`
- 应收账款: Order.Amount (显示在"应收账款"列)
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
- 币别: 美元
- 原币金额: Order.Amount
- 金额: Order.Amount × 汇率
### 特殊规则
- **摘要处理**:
- OrderNum有值时: 摘要为 `美金收款-{OrderNum}`
- OrderNum为空时: 摘要固定为 `美金收款`
- **金额验证**: checkRes为false的记录,所有相关分录行标记为粉红色背景(#FAD1D4)
- **单元格合并**: 同一笔到账金额的所有分录,"到账金额"和"手续费"列会合并显示
- **空值处理**:
- 订单金额为空的订单会被跳过,不生成贷方分录
- 订单号(OrderNum)可以为空,允许记录
---
## 汇率配置
程序支持两种方式设置汇率:
### 方法一: 使用汇率文件 (推荐)
在程序目录下创建 `exchange_rate.txt` 文件,文件中只包含汇率数值。
**操作步骤**:
```bash
# 创建汇率文件
echo "7.25" > exchange_rate.txt
# 运行程序,会自动读取该文件中的汇率
python3 generate_accounting_entries.py
```
**输出示例**:
```
从 exchange_rate.txt 读取汇率: 7.25
使用汇率: 7.25
```
**注意事项**:
- 汇率值必须是有效数字
- 汇率范围: 0.1 ~ 100 (超出范围会使用默认汇率)
- 文件格式错误会自动使用默认汇率
### 方法二: 修改程序默认值
编辑 `generate_accounting_entries.py` 文件第13行:
```python
DEFAULT_EXCHANGE_RATE = 7.1072 # 修改此默认值
```
**默认汇率**: 7.1072
**优先级**: 汇率文件 > 程序默认值
---
## 文件说明
| 文件名 | 说明 |
|--------|------|
| `data/data.xlsx` | 原始财务数据Excel文件 |
| `process_excel.py` | Excel数据提取程序 |
| `res.json` | 提取的财务数据(JSON格式) |
| `generate_accounting_entries.py` | 会计分录生成程序 |
| `AccountingEntries.xlsx` | 生成的会计分录表 |
| `exchange_rate.txt` | 汇率配置文件(可选) |
| `analyze_excel.py` | Excel结构分析工具(可选) |
---
## 使用流程
### 标准流程
1. **准备数据**
```bash
# 确保 data/data.xlsx 文件存在
```
2. **提取数据**
```bash
python3 process_excel.py
# 输出: res.json
```
3. **生成会计分录**
```bash
python3 generate_accounting_entries.py
# 输出: AccountingEntries.xlsx
```
4. **检查结果**
- 打开 `AccountingEntries.xlsx`
- 粉红色背景的行表示金额不匹配,需要核对
---
## 数据验证
### checkRes字段说明
- **true**: 实收金额 + 手续费 = 订单金额之和 (误差<0.01)
- **false**: 金额不匹配,需要人工核对
### 识别问题记录
在 `AccountingEntries.xlsx` 中:
- 粉红色背景(#FAD1D4)的行表示该笔记录金额不匹配
- 建议优先核对这些记录
---
## 常见问题
### Q1: 如何处理合并单元格?
程序自动处理F列的合并单元格:
- 合并单元格: 该区域内所有行属于同一笔记录
- 非合并单元格: 每行单独处理
### Q2: 手续费为空怎么办?
程序自动将空值记为0。
### Q3: 订单号(OrderNum)为空怎么办?
订单号为空是允许的,程序会记录该订单。生成的会计分录摘要会显示为 `美金收款`(而不是 `美金收款-{OrderNum}`)。
### Q4: 订单金额为空怎么办?
金额为空的订单会被跳过,不生成贷方分录。
### Q5: 如何修改汇率?
**推荐方法**: 创建 `exchange_rate.txt` 文件,输入汇率值即可。
```bash
echo "7.25" > exchange_rate.txt
```
**备选方法**: 编辑 `generate_accounting_entries.py` 第13行的 `DEFAULT_EXCHANGE_RATE` 值。
### Q6: Excel列对应关系
| 字段 | Excel列 | 说明 |
|------|---------|------|
| ReceivedAmount | F | 实收金额 |
| HandlingFee | G | 手续费 |
| OrderNum | H | 订单号 |
| Amount | I | 解款金额 |
| AccountName | O | 金蝶名称 |
---
## 输出示例
### res.json 示例
```json
[
{
"ReceivedAmount": 9455,
"HandlingFee": 25,
"Order": [
{
"OrderNum": "XLRQD063M25",
"Amount": 9480,
"AccountName": "20 Transsea"
}
],
"checkRes": true
}
]
```
### AccountingEntries.xlsx 结构
| 到账金额 | 手续费 | 订单号 | 应收账款 | 金蝶名称 | 摘要 | 借/贷 | 科目代码 | 科目名称 | 核算项目 | 币别 | 汇率 | 原币金额 | 金额 |
|---------|--------|--------|---------|---------|------|-------|----------|----------|----------|------|------|----------|------|
| 9455 | 25 | XLRQD063M25 | | 20 Transsea | 美金收款-XLRQD063M25 | 借 | 1002.02 | 银行存款 - 中行USD | 20 Transsea | 美元 | 7.1072 | 9455 | 67,188.54 |
| (合并) | (合并) | XLRQD063M25 | | | 美金收款-XLRQD063M25 | 借 | 5603.03 | 财务费用-手续费 | | 人民币 | | | 177.68 |
| (合并) | (合并) | XLRQD063M25 | 9480 | 20 Transsea | 美金收款-XLRQD063M25 | 贷 | 1122 | 应收账款 | 20 Transsea | 美元 | 7.1072 | 9480 | 67,366.22 |
---
## 注意事项
1. **数据起始行**: 程序从第2行开始读取(第1行为表头)
2. **汇率固定**: 默认使用固定汇率7.1072,不会从Excel读取
3. **金额精度**: 计算结果保留2位小数
4. **合并单元格**: "到账金额"和"手续费"列会自动合并
5. **背景标记**: checkRes=false的记录用粉红色标记
6. **文件编码**: 所有文件使用UTF-8编码
---
## 更新记录
- **v1.3** - 2025-10-17
- 支持OrderNum为空的订单记录
- 修改数据提取逻辑: 允许OrderNum为空,只跳过Amount为空的订单
- 优化摘要生成: OrderNum为空时摘要显示为 `美金收款`
- 确保所有数据行都被正确记录和处理
- **v1.2** - 2025-10-17
- 新增汇率文件支持: 可通过 `exchange_rate.txt` 设置汇率
- 智能汇率验证: 自动检测异常汇率并回退到默认值
- 改进错误处理: 汇率文件异常时提供详细提示信息
- **v1.1** - 2025-01-17
- 优化会计分录规则: 移除"到账金额-贷方"记录
- 每个Order记录都生成对应的贷方分录
- Order生成的贷方记录在"应收账款"列显示Amount金额
- 简化单订单处理逻辑
- **v1.0** - 2025-01-17
- Excel数据提取
- 会计分录生成
- 合并单元格支持
- 金额验证功能
- 背景色标记
---
## 联系支持
如遇问题或需要帮助,请检查:
1. Excel文件格式是否正确
2. 列映射是否匹配
3. Python依赖是否已安装
4. 汇率设置是否正确