在哈萨克斯坦从事会计工作的朋友,几乎都会遇到一个共同难题:
哈萨克斯坦电子发票平台(ЭСФ)导出的发票明细,仅支持按季度下载。
如果需要核对 2—3 年的历史发票,手动合并几十张表格不仅效率极低,还非常容易出错。
如果你也希望提高效率、减少重复劳动,不妨使用 Python 自动完成表格合并,只需几分钟,就能把所有季度发票自动汇总成一张总表。

重要说明
Python 无法自动登录发票系统并下载数据,这一步必须由会计手动完成。
但下载后的多表格合并,可以完全交给 Python 自动化处理,安全、快速、零错误。
准备工作(只需 5 步,零基础可操作)
第一步:安装 Python 环境
在电脑上安装 Python 程序(建议 3.10 及以上版本)。
安装教程网络上非常丰富,全程默认设置即可,完成后你的电脑就具备运行自动化脚本的能力。
第二步:从电子发票系统导出所有季度明细
登录哈萨克斯坦电子发票平台,按季度依次导出发票明细 Excel 文件。
例如:
•2024年6月—9月
•2024年10月—12月
•2025年1月—3月
•2025年4月—6月
•2025年7月—9月
•2025年10月—12月
将所有导出的 Excel 文件,统一放在一个新文件夹中。

第三步:新建 Python 脚本文件
1.在发票文件夹内,右键新建一个文本文档(.txt)。
2.将文末提供的代码完整复制进去。
3.保存并关闭文件。

第四步:修改文件后缀为 .py
将新建的文本文档后缀从 .txt 改为 .py。
修改后图标会变为 Python 文件图标,表示脚本已生效。

第五步:一键运行合并
双击运行 .py 文件,程序会自动:
1.读取文件夹内所有发票 Excel
2.将所有表格完整合并到一张总表
3.同时保留所有原始表格
4.自动输出最终合并文件
整个过程无需手动操作,一分钟即可完成。

合并效果说明(最终输出文件)
运行后会自动生成一个合并后的 Excel 文件,包含两部分内容:
1. 第一个工作表:合并输出(总表)
所有季度发票数据自动汇总到一张表,表头统一、无重复、格式规范,可直接用于对账、统计、申报。

2. 后续工作表:原始季度表
每个原始文件都会被完整保留,格式、公式、样式完全不变,方便回溯核对。
为什么推荐这种方式?
1.安全合规:不登录系统、不抓数据、不破解接口,仅处理本地已下载文件。
2.格式完全保留:保留颜色、边框、公式、列宽、行高,不会乱版。
3.速度极快:几十张表几秒合并完成。
4.零错误:避免手动复制粘贴造成的漏行、错行、乱序。
5.长期可用:适用于所有年度、所有季度、表头一致的发票明细。
完整 Python 合并代码(直接复制使用)
import pandas as pdimport openpyxlfrom openpyxl.styles import Font, PatternFill, Border, Side, Alignmentimport osfrom pathlib import Pathdef copy_cell_style(source_cell, target_cell): """复制单元格样式(字体、填充、边框、对齐、数字格式)""" # 字体 target_cell.font = Font( name=source_cell.font.name, size=source_cell.font.size, bold=source_cell.font.bold, italic=source_cell.font.italic, color=source_cell.font.color ) # 填充色 target_cell.fill = PatternFill( fill_type=source_cell.fill.fill_type, start_color=source_cell.fill.start_color, end_color=source_cell.fill.end_color ) # 边框 target_cell.border = Border( left=source_cell.border.left, right=source_cell.border.right, top=source_cell.border.top, bottom=source_cell.border.bottom ) # 对齐方式 target_cell.alignment = Alignment( horizontal=source_cell.alignment.horizontal, vertical=source_cell.alignment.vertical, wrap_text=source_cell.alignment.wrap_text ) # 数字格式 target_cell.number_format = source_cell.number_formatdef copy_sheet_format(source_ws, target_ws): """复制Sheet格式(列宽、行高)""" # 复制列宽 for col in source_ws.columns: col_letter = col[0].column_letter target_ws.column_dimensions[col_letter].width = source_ws.column_dimensions[col_letter].width # 复制行高 for row in range(1, source_ws.max_row + 1): target_ws.row_dimensions[row].height = source_ws.row_dimensions[row].heightdef merge_excel_files(excel_dir, output_file="合并报表文件-棉花树下好乘凉.xlsx"): """ 合并多个Excel文件: - Sheet1:汇总所有文件数据 - Sheet2及以后:保留原文件所有Sheet(命名:原文件名_原Sheet名) """ # 1. 初始化输出工作簿 output_wb = openpyxl.Workbook() # 删除默认的Sheet,重新创建汇总Sheet(Sheet1) output_wb.remove(output_wb.active) summary_ws = output_wb.create_sheet(title="合并输出") # 汇总表固定为Sheet1 has_header = False # 标记是否已添加表头(仅添加第一个文件的表头) # 2. 遍历所有Excel文件 excel_files = list(Path(excel_dir).glob("*.xlsx")) if not excel_files: print("未找到Excel文件!") return # 用于记录原文件Sheet,避免重复命名 sheet_count = 1 # Sheet1是汇总表,从Sheet2开始计数 for file in excel_files: file_name = file.stem # 原文件名(不含后缀) print(f"正在处理文件:{file_name}.xlsx") # 用openpyxl读取原文件(保留格式) source_wb = openpyxl.load_workbook(file, data_only=False) # data_only=False保留公式和格式 # 3. 提取当前文件所有Sheet数据,写入汇总表(Sheet1) for source_sheet_name in source_wb.sheetnames: source_ws = source_wb[source_sheet_name] # 获取当前Sheet的有效数据范围(排除空行空列) max_row = source_ws.max_row max_col = source_ws.max_column if max_row == 0 or max_col == 0: continue # 跳过空Sheet # 写入汇总表:首行作为表头(仅第一次写入) start_row = summary_ws.max_row + 1 for row in range(1, max_row + 1): for col in range(1, max_col + 1): source_cell = source_ws.cell(row=row, column=col) target_cell = summary_ws.cell(row=start_row + row - 1, column=col) # 写入单元格值(保留公式) if source_cell.value is not None: target_cell.value = source_cell.value # 复制单元格样式 copy_cell_style(source_cell, target_cell) # 仅第一次写入时,复制表头行高和列宽 if not has_header: copy_sheet_format(source_ws, summary_ws) has_header = True # 4. 原封不动复制当前Sheet到输出文件(Sheet2及以后) sheet_count += 1 new_sheet_name = f"{file_name}_{source_sheet_name}" # 避免重名:原文件名_原Sheet名 # 若Sheet名过长,截取前30个字符(Excel Sheet名最大31字符) if len(new_sheet_name) > 31: new_sheet_name = new_sheet_name[:30] + "..." # 创建新Sheet并复制内容和格式 new_ws = output_wb.create_sheet(title=new_sheet_name) # 复制数据和样式 for row in range(1, max_row + 1): for col in range(1, max_col + 1): source_cell = source_ws.cell(row=row, column=col) target_cell = new_ws.cell(row=row, column=col) if source_cell.value is not None: target_cell.value = source_cell.value copy_cell_style(source_cell, target_cell) # 复制列宽和行高 copy_sheet_format(source_ws, new_ws) source_wb.close() # 关闭原文件,释放资源 # 5. 保存合并后的文件 output_wb.save(output_file) print(f"\n✅ 合并完成!输出文件:{os.path.abspath(output_file)}") print(f"📊 汇总表:Sheet1(包含所有文件数据)") print(f"📋 原文件Sheet:Sheet2及以后(命名格式:原文件名_原Sheet名)")# ------------------- 运行代码 -------------------if __name__ == "__main__": # !!!关键:修改为你的Excel文件所在文件夹路径!!! # 示例1:如果文件在桌面,路径类似 "C:/Users/admin/Desktop/Excel文件" # 示例2:如果文件和代码在同一文件夹,路径写 "." EXCEL_FOLDER = "." # 此处替换为你的Excel文件文件夹路径 # 执行合并(输出文件默认名为"合并后的Excel文件.xlsx",可自定义) merge_excel_files(excel_dir=EXCEL_FOLDER, output_file="合并报表文件-棉花树下好乘凉.xlsx")
本文原创,搬运请注明出处!