77 lines
3.3 KiB
Python
77 lines
3.3 KiB
Python
"""生成网银流水标准导入模板 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())
|