怎么用Python把两个格式一样的Excel文件自动合并成一个?支持多工作表和去重吗?

✅ 以下是一个**健壮、易用、生产就绪**的 Python 脚本,用于合并两个结构相同的 Excel 文件(即:具有相同列名、相同语义的 Sheet),支持: - ✅ 自动识别并合并所有同名工作表(Sheet) - ✅ 按行追加(`pd.concat`),保留原始顺序(file1 在前,file2 在后) - ✅ 自动去重(可选,通过 `drop_duplicates()` 去除完全重复行) - ✅ 自动处理空表、缺失 Sheet、列不一致等异常 - ✅ 输出为单个 `.xlsx` 文件,含原 sheet 名,支持中文路径 - ✅ 命令行交互式输入路径(也支持直接传参) - ✅ 使用 `openpyxl` 保持格式兼容性(如日期、数字类型不转为字符串) --- ### ✅ 完整可运行脚本(保存为 `merge_excel.py`): ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Excel 合并工具:将两个结构相同的 Excel 文件按 Sheet 合并为一个汇总文件。 支持:多 sheet、自动对齐列、去重选项、错误提示、中文路径。 依赖:pandas, openpyxl 安装命令:pip install pandas openpyxl """ import os import sys import pandas as pd from pathlib import Path def safe_read_excel(file_path, sheet_name): """安全读取单个 sheet,返回 DataFrame 或 None(失败时)""" try: return pd.read_excel(file_path, sheet_name=sheet_name, dtype=str) # 全部读为 str 避免类型冲突 except ValueError as e: if "sheet" in str(e).lower(): print(f"⚠️ 警告:文件 '{file_path}' 中不存在工作表 '{sheet_name}',跳过。") else: print(f"⚠️ 读取 sheet '{sheet_name}' 失败:{e}") return None except Exception as e: print(f"❌ 无法读取 '{file_path}' 的 '{sheet_name}':{e}") return None def merge_sheets(df1, df2, dedupe=False): """合并两个 DataFrame(同结构),返回合并后 DataFrame""" if df1 is None and df2 is None: return None if df1 is None: return df2.copy() if df2 is None: return df1.copy() # 确保列一致:以 df1 列为准,df2 缺失列补空,多余列丢弃(警告) common_cols = df1.columns.intersection(df2.columns).tolist() extra_in_df2 = df2.columns.difference(df1.columns).tolist() if extra_in_df2: print(f"💡 提示:df2 包含额外列 {extra_in_df2},已忽略(仅保留与 df1 共有的列)。") df1_clean = df1[common_cols].copy() df2_clean = df2[common_cols].copy() merged = pd.concat([df1_clean, df2_clean], ignore_index=True, sort=False) if dedupe: original_len = len(merged) merged = merged.drop_duplicates().reset_index(drop=True) print(f"🔍 去重:{original_len} → {len(merged)} 行") return merged def main(file1_path, file2_path, output_path=None, dedupe=False): """主函数:合并两个 Excel 文件""" p1, p2 = Path(file1_path), Path(file2_path) if not p1.exists(): raise FileNotFoundError(f"❌ 输入文件1不存在:{file1_path}") if not p2.exists(): raise FileNotFoundError(f"❌ 输入文件2不存在:{file2_path}") # 自动推导输出路径(若未指定) if output_path is None: output_path = p1.parent / f"MERGED_{p1.stem}_AND_{p2.stem}.xlsx" output_path = Path(output_path) print(f"📁 正在读取:\n 🔹 {file1_path}\n 🔹 {file2_path}") # 获取所有 sheet 名(取并集,确保不遗漏) with pd.ExcelFile(p1) as xls1: sheets1 = xls1.sheet_names with pd.ExcelFile(p2) as xls2: sheets2 = xls2.sheet_names all_sheets = sorted(set(sheets1) | set(sheets2)) print(f"📊 检测到工作表:{all_sheets}") # 逐 sheet 合并 merged_sheets = {} for sheet in all_sheets: print(f" ⏳ 处理工作表 '{sheet}'...") df1 = safe_read_excel(p1, sheet) df2 = safe_read_excel(p2, sheet) merged_df = merge_sheets(df1, df2, dedupe=dedupe) if merged_df is not None and not merged_df.empty: merged_sheets[sheet] = merged_df else: print(f" ⚠️ 工作表 '{sheet}' 合并后为空,跳过写入。") if not merged_sheets: raise ValueError("❌ 所有工作表合并后均为空,请检查源文件内容和结构。") # 写入输出文件(使用 openpyxl 引擎以支持 .xlsx 格式和保留基础格式) print(f"💾 正在写入汇总文件:{output_path}") try: with pd.ExcelWriter(output_path, engine='openpyxl') as writer: for sheet_name, df in merged_sheets.items(): # 防止 sheet 名超长或含非法字符(Excel 限制 31 字符,且不能含 \ / ? * [ ]) clean_sheet = re.sub(r'[\\/\?\*\[\]]', '_', sheet_name)[:31].strip('_') if not clean_sheet: clean_sheet = "Sheet1" if clean_sheet in writer.sheets: clean_sheet += "_2" df.to_excel(writer, sheet_name=clean_sheet, index=False) print(f"✅ 合并完成!共写入 {len(merged_sheets)} 个工作表。") print(f"📄 输出路径:{output_path.resolve()}") except Exception as e: raise RuntimeError(f"❌ 写入 Excel 失败:{e}") if __name__ == "__main__": import argparse import re parser = argparse.ArgumentParser(description="合并两个结构相同的 Excel 文件") parser.add_argument("file1", help="第一个 Excel 文件路径") parser.add_argument("file2", help="第二个 Excel 文件路径") parser.add_argument("-o", "--output", help="输出文件路径(默认:同目录下自动生成)") parser.add_argument("--dedupe", action="store_true", help="启用行级去重(去除完全相同的行)") parser.add_argument("--no-input", action="store_true", help="禁用交互式输入(仅用于 CI/脚本调用)") args = parser.parse_args() # 若未提供参数,且未禁用交互,则提示输入 if len(sys.argv) == 1 or (len(sys.argv) == 2 and sys.argv[1] in ["-h", "--help"]): parser.print_help() sys.exit(0) if not args.no_input and (not args.file1 or not args.file2): print("📥 交互式模式(请输入路径):") file1 = input("请输入第一个 Excel 文件路径:").strip().strip('"\'') file2 = input("请输入第二个 Excel 文件路径:").strip().strip('"\'') if not file1 or not file2: print("❌ 路径不能为空。") sys.exit(1) else: file1, file2 = args.file1, args.file2 try: main( file1_path=file1, file2_path=file2, output_path=args.output, dedupe=args.dedupe ) except KeyboardInterrupt: print("\n🛑 用户中断操作。") sys.exit(1) except Exception as e: print(f"\n💥 错误:{e}") sys.exit(1) ``` --- ### ✅ 使用方式(3 种): #### ▶ 方式 1:命令行直接传参(推荐) ```bash python merge_excel.py "C:\data\2024_Q1.xlsx" "C:\data\2024_Q2.xlsx" -o "C:\data\2024_H1.xlsx" --dedupe ``` #### ▶ 方式 2:交互式运行(无参数时自动提示) ```bash python merge_excel.py # 然后按提示输入两个文件路径 ``` #### ▶ 方式 3:作为模块导入(供其他脚本调用) ```python from merge_excel import main main("a.xlsx", "b.xlsx", "merged.xlsx", dedupe=True) ``` --- ### ✅ 依赖安装(首次运行前): ```bash pip install pandas openpyxl ``` > 💡 提示:`openpyxl` 是写入 `.xlsx` 必需的引擎;`pandas` 默认用 `xlrd`(仅支持 `.xls`),故必须显式指定 `engine='openpyxl'`。 --- ### ✅ 示例效果: 输入: - `sales_jan.xlsx`(Sheet: `Data`,50 行) - `sales_feb.xlsx`(Sheet: `Data`,60 行) 输出: - `MERGED_sales_jan_AND_sales_feb.xlsx` → 内含 `Data` 表,共 110 行(或 105 行,若启用 `--dedupe` 且有 5 行重复) ---

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

Python将多个excel文件合并为一个文件

Python将多个excel文件合并为一个文件

主要涉及的Python库有`xlrd`和`xlsxwriter`。首先,`xlrd`是Python的一个库,用于读取Excel文件,支持多种Excel文件格式。

python合并多个excel文件的示例

python合并多个excel文件的示例

在数据分析和处理任务中,有时候我们需要将多个Excel文件合并成一个大文件,以便于进一步的分析或报告。Python提供了一种高效且灵活的方式来完成这项任务,尤其在处理大量数据时,自动化的优势尤为明显。

Python将多个excel表格合并为一个表格

Python将多个excel表格合并为一个表格

### Python将多个Excel表格合并为一个表格的知识点详解#### 一、背景介绍与应用场景在日常工作和学习中,我们经常需要处理大量的Excel文件。

python 实现读取一个excel多个sheet表并合并的方法

python 实现读取一个excel多个sheet表并合并的方法

本文将详细介绍如何使用Python的`xlrd`和`pandas`库来读取一个包含多个Sheet的Excel文件,并将其内容合并到一个单一的数据帧中。

Python合并多个Excel数据的方法

Python合并多个Excel数据的方法

首先定义一个包含所有要合并的Excel文件路径的列表。2. 打开这些Excel文件,并读取每个文件中所有工作表的数据。3. 将读取的数据存储在一个二维数组中,这将形成一个由行和列组成的表格。4.

Python项目-自动办公-40 excel处理实例(多工作表合并到单工作表.zip

Python项目-自动办公-40 excel处理实例(多工作表合并到单工作表.zip

首先,我们要了解Python中的pandas库,这是处理Excel文件的核心工具。Pandas提供DataFrame对象,可以方便地读取和写入Excel文件,并支持多种数据格式。

Python一键合并多Excel(支持 xlsx/xls + 自动识别表头 + 最新/最早去重),办公自动化必备工具,含完整源码

Python一键合并多Excel(支持 xlsx/xls + 自动识别表头 + 最新/最早去重),办公自动化必备工具,含完整源码

本文介绍的Python工具,它能够一键合并多个Excel文件,支持常见的Excel文件格式(xlsx和xls),并且具备自动识别表头和去重功能,使得在处理大量数据时更为高效。

python源码-案例框架-自动办公-40 excel处理实例(多工作表合并到单工作表.zip

python源码-案例框架-自动办公-40 excel处理实例(多工作表合并到单工作表.zip

本资源"python源码-案例框架-自动办公-40 excel处理实例(多工作表合并到单工作表.zip"提供了一个全面的教程,帮助用户学习如何使用Python来处理Excel文件,特别是将多个工作表的数据合并到一个单一的工作表中

python自动办公源码_excel处理实例(多工作表合并到单工作表.rar

python自动办公源码_excel处理实例(多工作表合并到单工作表.rar

Python提供了许多库来处理Excel文件,其中最常用的是pandas和openpyxl。pandas是一个强大的数据分析工具,它支持读取和写入多种文件格式,包括Excel。

Python源码自动办公-40 excel处理实例(多工作表合并到单工作表.rar

Python源码自动办公-40 excel处理实例(多工作表合并到单工作表.rar

本主题聚焦于"Python源码自动办公-40 excel处理实例(多工作表合并到单工作表",意在教授如何利用Python高效地管理和操作Excel文件,特别是将多个工作表的数据整合到一个单一的工作表中。

python之DataFrame实现excel合并单元格

python之DataFrame实现excel合并单元格

在Python中,处理和操作Excel文件是一个常见的需求,特别是在数据分析和报告生成中。

python读取excel文件例子

python读取excel文件例子

综上所述,本例子涵盖了Python使用`pandas`库读取Excel文件的基本方法,以及如何将Python脚本打包成exe文件和可能的MFC界面交互。

利用Python pandas对Excel进行合并的方法示例

利用Python pandas对Excel进行合并的方法示例

在Python编程中,pandas库是一个非常强大的工具,用于数据处理和分析,其中包括对Excel文件的操作。本示例主要展示了如何使用pandas进行Excel文件的合并。

python操作excel表格 格式设置

python操作excel表格 格式设置

根据给定的文件标题“python操作excel表格 格式设置”及描述“python 操作excel,字体,格式等的设置”,本文将详细解析如何利用Python中的`xlwt`库进行Excel表格的操作,包括字体样式

python合并同类型excel表格的方法

python合并同类型excel表格的方法

在Python编程中,合并同类型的Excel表格是一项常见的任务,尤其在数据分析和处理中。Python提供了多种库来处理Excel文件,其中最常用的是`pandas`库。

Python批量合并有合并单元格的Excel文件详解

Python批量合并有合并单元格的Excel文件详解

"这篇教程主要关注使用Python处理包含合并单元格的Excel文件的批量合并方法。文章适合已经熟悉Excel操作并且有一定Python基础的读者,旨在解决在自动化处理大量Excel文件时遇到的合并

解决python xlrd无法读取excel文件的问题

解决python xlrd无法读取excel文件的问题

**转换文件格式**:如果需要保留原始文件的`.xls`或`.xlsx`格式,可以通过其他工具(如Microsoft Excel本身或在线转换服务)将文件转换成正确的格式后再进行读取。

基于python实现把json数据转换成Excel表格

基于python实现把json数据转换成Excel表格

`tablib`是一个多格式数据包,支持包括Excel在内的多种数据导入导出格式。通过`pip install tablib`命令,可以在Python环境中安装此库。

python案例-excel处理实例(多工作表合并到单工作表)-源码工程

python案例-excel处理实例(多工作表合并到单工作表)-源码工程

在处理Excel文件时,Python同样表现出色,特别是在多工作表合并这类常规但又繁琐的任务上,Python能够简化过程,提高效率。

基于Python自动化脚本实现Excel表格数据精准提取的项目-使用openpyxl库读取Excel文件-定位特定行与列-提取单元格数值-处理多工作表数据-支持xlsx格式解析-批.zip

基于Python自动化脚本实现Excel表格数据精准提取的项目-使用openpyxl库读取Excel文件-定位特定行与列-提取单元格数值-处理多工作表数据-支持xlsx格式解析-批.zip

该项目主要涉及几个核心功能:读取Excel文件、定位特定行与列、提取单元格数值、处理多工作表数据,以及支持xlsx格式解析。

最新推荐最新推荐

recommend-type

PyPI 官网下载 | mlpack3-3.4.2-cp36-cp36m-manylinux1_x86_64.whl

资源来自pypi官网,解压后可用。 资源全名:mlpack3-3.4.2-cp36-cp36m-manylinux1_x86_64.whl
recommend-type

实现基于C++或者python基本库,初学学习之用.zip

人工智能-项目实践-机器学习
recommend-type

机器学习的一些基础算法,主要使用Python、Cpp、Matlab编写。.zip

matlab算法,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。
recommend-type

jenkins-conf:Jenkins的配置文件

mlpack Jenkins配置和测试支持 该存储库包含Jenkins( )使用的许多脚本,用于构建和测试mlpack。
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti
recommend-type

Java线程池运行时状态怎么实时掌握?有哪些靠谱的监控手段?

<think>我们之前已经讨论过Java线程池监控的多种方法,包括使用第三方工具和自定义监控。现在用户再次询问Java线程池监控方法,我们需要根据引用内容以及之前讨论的内容进行总结和扩展。 引用[1]提到使用JDK自带的监控工具,引用[2]提到了三种常用的线程池创建方式,引用[3]给出了通过ThreadPoolExecutor获取线程池状态的方法。 结合之前回答的内容,我们可以将监控方法分为以下几类: 1. 使用JDK自带工具(如jconsole, jvisualvm)进行监控。 2. 通过编程方式获取线程池状态(如引用[3]所示)。 3. 扩展ThreadPoolExecutor,