当前位置:首页>python>AI+Python项目002:往来明细对账工具

AI+Python项目002:往来明细对账工具

  • 2026-09-27 18:24:37
AI+Python项目002:往来明细对账工具

       各位财务小伙伴,往来对账还在一行一行标注颜色、加加减减吗?别再用老办法费眼睛了。利用Python代码轻松搞定往来对账!下面,我将优化后的代码以及使用方法分享给大家,下列代码由AI生成,欢迎大家取用。

一、操作界面展示

       你也想感受1秒对账并输出未达账项的快乐吗!快复制代码体验吧!

二、完整代码

    # 导入必要库import tkinter as tkfrom tkinter import ttk, filedialog, messageboximport pandas as pdimport osfrom datetime import datetimefrom difflib import SequenceMatcher# 创建主窗口root = tk.Tk()root.title("往来对账工具")root.geometry("500x150")# 全局变量存储文件夹路径folder_path = tk.StringVar()def select_folder():    """选择往来明细账文件夹路径"""    path = filedialog.askdirectory()    if path:        folder_path.set(path)def standardize_columns(df):    """标准化列名"""    columns = df.columns    for col in columns:        if '借方' in col:            df = df.rename(columns={col: '借方金额'})        elif '贷方' in col:            df = df.rename(columns={col: '贷方金额'})        elif '摘要' in col:            df = df.rename(columns={col: '摘要'})    return dfdef start_reconciliation():    """开始对账主函数"""    try:        # 获取文件夹路径并检查        path = folder_path.get()        if not path:            raise ValueError("请先选择文件夹路径")        # 获取文件夹内的Excel文件        files = [f for f in os.listdir(path) if f.endswith(('.xls', '.xlsx'))]        if len(files) != 2:            raise ValueError("文件夹内必须包含两个Excel文件")        # 读取两个Excel文件并标准化列名        df1 = pd.read_excel(os.path.join(path, files[0]))        df2 = pd.read_excel(os.path.join(path, files[1]))        df1 = standardize_columns(df1)        df2 = standardize_columns(df2)        # 第一步核对:单条匹配        def single_match(df_a, df_b):            """单条借贷方匹配逻辑"""            matched_a = []            matched_b = []            for idx_a, row_a in df_a.iterrows():                for idx_b, row_b in df_b.iterrows():                    # 检查金额相等且借贷方向相反                    if (row_a['借方金额'] == row_b['贷方金额'] and row_a['借方金额'] != 0) or \                       (row_a['贷方金额'] == row_b['借方金额'] and row_a['贷方金额'] != 0):                        matched_a.append(idx_a)                        matched_b.append(idx_b)            return df_a.drop(matched_a), df_b.drop(matched_b)        # 执行双向匹配        remaining1, remaining2 = single_match(df1, df2)        remaining2, remaining1 = single_match(remaining2, remaining1)        # 第二步核对:摘要相似性分组匹配        def group_match(df_a, df_b):            """摘要分组匹配逻辑"""            # 生成摘要分组关键词(示例使用简单相似度匹配)            groups = {}            for idx, row in df_a.iterrows():                found = False                for key in groups:                    # 判断摘要相似度(阈值可调整)                    if SequenceMatcher(None, key, row['摘要']).ratio() > 0.6:                        groups[key].append(idx)                        found = True                        break                if not found:                    groups[row['摘要']] = [idx]            # 检查分组金额是否匹配            matched_a = []            matched_b = []            for key, indices in groups.items():                sum_debit = df_a.loc[indices, '借方金额'].sum()                sum_credit = df_a.loc[indices, '贷方金额'].sum()                # 在df_b中寻找匹配项                for idx_b, row_b in df_b.iterrows():                    if (sum_debit == row_b['贷方金额'] and sum_debit != 0) or \                       (sum_credit == row_b['借方金额'] and sum_credit != 0):                        matched_a.extend(indices)                        matched_b.append(idx_b)                        break            return df_a.drop(matched_a), df_b.drop(matched_b)        # 执行双向分组匹配        final1, final2 = group_match(remaining1, remaining2)        final2, final1 = group_match(final2, final1)        # 生成结果文件        timestamp = datetime.now().strftime("%Y%m%d%H%M%S")        output_path = os.path.join(path, f'未匹配条目_{timestamp}.xlsx')        with pd.ExcelWriter(output_path) as writer:            final1.to_excel(writer, sheet_name=files[0][:30], index=False)            final2.to_excel(writer, sheet_name=files[1][:30], index=False)        messagebox.showinfo("完成", f"对账完成!结果已保存至:\n{output_path}")    except Exception as e:        messagebox.showerror("错误", str(e))# 创建界面组件ttk.Label(root, text="往来明细账文件夹:").grid(row=0, column=0, padx=5, pady=5)ttk.Entry(root, textvariable=folder_path, width=40).grid(row=0, column=1, padx=5)ttk.Button(root, text="选择文件夹", command=select_folder).grid(row=0, column=2, padx=5)ttk.Button(root, text="开始对账", command=start_reconciliation).grid(row=1, column=1, pady=10)# 运行主循环root.mainloop()

    三、代码关键部分解释

    该代码是基于 Python 开发的 GUI 版往来明细账对账工具,核心功能是:首先对两个 Excel 格式的明细账文件进行借贷对向金额匹配,筛选出未匹配条目,再利用摘要信息的字段进行模糊匹配,最后输出未匹配条目。

    四、运行前置条件

    • Python版本:需Python 3.6及以上。

    • 依赖库(使用pip安装)

    pip3 install pandas openpyxl xlrd==1.2.0

      五、使用说明

      1. 准备对账文件

           将需要对账的两个往来明细账excel文件放入同一文件夹内,且该文件夹有且仅有这两个excel文件。确保Excel文件包含"摘要"、"借方金额"、"贷方金额"三列(列名需完全一致),其他列可以保留,但必须有上述三列且名称一致。

      1. 运行程序

          • 运行代码:在终端执行python 20250213对账工具.py,打开对账工具窗口;
          • 选择文件夹:点击 “选择文件夹” 按钮,选中包含两个对账 Excel 文件的文件夹,路径会显示在输入框中;
          • 开始对账:点击 “开始对账” 按钮,程序自动执行匹配逻辑;
          • 查看结果:对账完成后,弹窗提示结果文件路径,打开该 Excel 文件,可查看两个 sheet 分别对应的未匹配条目。
      3.注意事项
        • 报错 “找不到列名‘借方金额 / 贷方金额 / 摘要’”:检查 Excel 文件是否包含相关列,或列名无 “借方 / 贷方 / 摘要” 关键词(需手动调整列名)。

        • 读取 Excel 报错:确认文件未被占用(如打开状态)、文件格式为.xls/.xlsx(非 CSV 重命名)。

        • 对账结果包含:期初、期末未达。因程序执行逻辑首先是对金额的匹配,再对摘要文字进行模糊分析匹配,不能完全排除有异常结果,需对结果进行人工鉴别(目前使用过程中的准确率90%以上)。

      我的100个财务工具计划:邀你一起破局

         AI是大脑,Python是手和脚,人类指引方向。我将挑战一下用AI制作100个Python工具,解决财务工作中“费时间、易出错、重复率高”的痛点难点问题——这也是我开通这个公众号的初衷。

             但一个人的能力和思维终究有限,很容易陷入“闭门造车”的困境。所以想真诚地邀请你,欢迎有需求、有想法以及勇于突破传统财务工作方式的小伙伴加入,让我们一起探索AI时代的财务之路!如果你在财务工作中遇到重复性的问题,都可以在评论区告诉我,以便深入的沟通交流。

            后续我将陆续发布各类财务实用性小工具,非常期待你的留言,让我们一起用AI赋能财务!

      最新文章

      随机文章