Files
cma-management/backend/scripts/gen_voucher_import_template.py
T

77 lines
3.3 KiB
Python
Raw 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.
"""生成网银流水标准导入模板 xlsx — 列: 凭证日期/凭证号/科目编码/科目名称/借方金额/贷方金额/摘要
用法: python scripts/gen_voucher_import_template.py
输出: backend/scripts/templates/网银流水导入模板.xlsx(表头 + 1行示例)
"""
import os
import sys
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter
OUT_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "templates", "网银流水导入模板.xlsx")
HEADERS = ["凭证日期", "凭证号", "科目编码", "科目名称", "借方金额", "贷方金额", "摘要"]
# 1行示例(借贷平衡)
EXAMPLE = ["2026-08-01", "记-001", "1002", "银行存款-工行", 50000, 0, "收到客户回款"]
# 附赠一行结转示例行(注释说明用,不写入数据行)
def main():
os.makedirs(os.path.dirname(OUT_PATH), exist_ok=True)
wb = Workbook()
ws = wb.active
ws.title = "网银流水"
# 表头样式
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill("solid", fgColor="409EFF")
for col, h in enumerate(HEADERS, start=1):
cell = ws.cell(row=1, column=col, value=h)
cell.font = header_font
cell.fill = header_fill
cell.alignment = Alignment(horizontal="center", vertical="center")
for col, val in enumerate(EXAMPLE, start=1):
cell = ws.cell(row=2, column=col, value=val)
cell.alignment = Alignment(horizontal="center" if col in (1, 3, 5, 6) else "left")
# 列宽
widths = [14, 12, 12, 22, 12, 12, 30]
for i, w in enumerate(widths, start=1):
ws.column_dimensions[get_column_letter(i)].width = w
# 说明sheet
note = wb.create_sheet("填写说明")
notes = [
["网银流水标准导入模板 — 填写说明"],
[""],
["1. 列说明(与凭证明细表 voucher_details 对齐):"],
[" 凭证日期: YYYY-MM-DD(必填,用于提取期间period"],
[" 凭证号: 字符串(必填,如 记-001 / 银收-20260801-001"],
[" 科目编码: 必填,如 1001库存现金 / 1002银行存款"],
[" 科目名称: 必填,如 银行存款-工行 / 库存现金"],
[" 借方金额: 数字,无则留空或0(与贷方二选一)"],
[" 贷方金额: 数字,无则留空或0(与借方二选一)"],
[" 摘要: 可选,含'结转'或科目名含'本年利润'的行将标记为结转行,不参与现金流计算"],
[""],
["2. 三校验规则(导入时自动执行):"],
[" ① 借贷平衡: 全文件Σ借方 = Σ贷方(容差0.01),不平衡将提示差额"],
[" ② 期间合计: 按期间(YYYY-MM)汇总借贷合计,供对账"],
[" ③ 结转行识别: 摘要含'结转' 或 科目名含'本年利润'/'结转' → carry_forward标记"],
[""],
["3. 现金流联动:货币资金科目(1001/1002开头)期末余额自动更新现金余额与EXT_现金类KPI、F_CASH_SAFETY现金安全垫"],
["4. 示例行(第2行)请删除后填入真实流水;不要修改表头列名"],
]
for row in notes:
note.append(row)
note.column_dimensions["A"].width = 90
wb.save(OUT_PATH)
print(f"模板已生成: {OUT_PATH}")
if __name__ == "__main__":
sys.exit(main())