Python读取多格式Excel并实现跨表匹配合并的完整示例

 更新时间:2025年11月17日 08:28:25   作者:程序员爱钓鱼  
在数据处理中,经常会遇到这样一个需求:一份是主数据表,另一份是学生/员工/客户的完整信息表, 需要按姓名匹配,把完整信息补充到主表中,听起来简单,但实际操作中常会踩坑,本文就分享一次真实项目中的解决方案,需要的朋友可以参考下

在数据处理中,经常会遇到这样一个需求:

我们有两份 Excel:一份是主数据表,另一份是学生/员工/客户的完整信息表。 需要按姓名匹配,把完整信息补充到主表中。

听起来简单,但实际操作中常会踩坑,比如:

  • 主表是 XLS,信息表是 XLSX
  • 两个表的表头不在第一行
  • 信息表第一列是序号,真正数据在第二列开始
  • 合并后需要把新字段插入到指定位置,而不是简单拼在末尾

本文就分享一次真实项目中的解决方案: 使用 Python + Pandas + xlrd + openpyxl,实现多格式 Excel 读取 + 灵活表头处理 + 按姓名匹配合并 + 自定义列顺序输出。

一、需求拆解

最终目标是:

  1. 无论是 XLS 还是 XLSX,都能读取
  2. 支持跳过表头行
  3. 支持跳过第一列(常见为序号)
  4. 按姓名进行匹配
  5. 把匹配结果插入主表的指定列后(例如 I 列)
  6. 输出一个新的 XLSX 文件

为了做到这点,我们需要写一个“通用 Excel 读取函数”。

二、通用 Excel 读取函数(支持 XLS / XLSX)

核心难点在于:

  • pandas 无法直接读取带旧格式 .xls 的合并单元格或特殊格式
  • xlrd 只能读取 .xls(新版不支持 .xlsx

所以策略是:

  • xls → xlrd
  • xlsx → pandas(openpyxl)

并手动实现跳过行、跳过列等功能。

三、跨表匹配的整体流程

整个数据处理逻辑如下:

  1. 读取主表(XLS/XLSX 均可)
  2. 读取信息表(可以从第二行是真表头)
  3. 把信息表按“姓名”设置为索引
  4. 循环主表每一行,根据姓名取对应信息
  5. 把匹配结果拼成新的 DataFrame
  6. 插入到主表指定列之后
  7. 输出最终的合并表

这个流程能适配各种不同的 Excel 格式,健壮性很高。

四、完整示例代码(已脱敏)

以下是通用示例代码,你可以直接复用:

import pandas as pd
import xlrd
import openpyxl

def read_excel_any(path, sheet_name=None, skip_header_rows=0, skip_first_column=False):
    """
    支持 XLS/XLSX 的通用读取函数
    - skip_header_rows: 跳过前 N 行
    - skip_first_column: 是否跳过第一列(序号)
    """
    if path.lower().endswith(".xls"):
        book = xlrd.open_workbook(path)
        sheet = book.sheet_by_name(sheet_name) if sheet_name else book.sheet_by_index(0)

        data = []
        for r in range(sheet.nrows):
            if r < skip_header_rows:
                continue
            row = sheet.row_values(r)
            if skip_first_column:
                row = row[1:]
            data.append(row)

        df = pd.DataFrame(data[1:], columns=data[0])
        return df

    else:  # XLSX
        df = pd.read_excel(
            path,
            sheet_name=sheet_name,
            engine="openpyxl",
            skiprows=skip_header_rows
        )
        if skip_first_column:
            df = df.iloc[:, 1:]
        return df


# ===== 配置区(示例) ===== #
main_file = "主表.xls"
main_sheet = "数据表"

info_file = "信息表.xlsx"
info_sheet = "全部信息"

info_skip_header = 1
info_skip_first_col = True
# ======================== #

# 读取主表
df_main = read_excel_any(main_file, sheet_name=main_sheet)

# 读取信息表
df_info = read_excel_any(
    info_file,
    sheet_name=info_sheet,
    skip_header_rows=info_skip_header,
    skip_first_column=info_skip_first_col
)

# 确保两张表都有“姓名”列
if "姓名" not in df_main.columns or "姓名" not in df_info.columns:
    raise ValueError("两份表格必须都包含“姓名”列!")

# 设置信息表的索引
df_info_index = df_info.set_index("姓名")

# 按姓名匹配
matched_data = []
for name in df_main["姓名"]:
    if name in df_info_index.index:
        matched_data.append(df_info_index.loc[name].to_dict())
    else:
        # 不存在则填空
        matched_data.append({col: None for col in df_info.columns if col != "姓名"})

df_match = pd.DataFrame(matched_data)

# 匹配内容插入到指定位置(示例:插入到第 8 列之后)
insert_pos = 8
cols_main = df_main.columns.tolist()
new_cols = cols_main[:insert_pos + 1] + df_match.columns.tolist() + cols_main[insert_pos + 1:]

df_out = pd.concat([df_main, df_match], axis=1)[new_cols]

df_out.to_excel("输出结果.xlsx", index=False)

五、关键技术点解释

① 通用读取函数封装的意义

很多项目里主表和信息表格式不同、位置不同、列不同。 封装通用函数之后:

  • 脚本可复用性强
  • 更换 Excel 只需修改文件名
  • 结构更清晰、利于维护

② 使用set_index做匹配

df_info.set_index("姓名")

这样查找效率极高,相当于字典查询。

③ 保持原表字段顺序不变

很多业务表格是“固定模板”,不能随意打乱列。 这里通过自定义 new_cols 保证了最终顺序完全可控。

六、效果示例

最终输出的 Excel 将会:

  • 保留主表原有字段顺序
  • 在指定列(如 I 列)后插入信息表的字段
  • 按姓名逐行匹配
  • 如果信息表中没有该姓名,填充为空白

整个流程自动化,不需要人工筛选、复制、粘贴。

七、总结

通过 Python 的数据处理能力,我们可以轻松实现:

  • 跨格式 Excel 读取(XLS/XLSX)
  • 灵活处理表头位置与列结构
  • 按姓名精准匹配信息表
  • 保持主表字段顺序
  • 自动生成合并后的最终数据

在实际业务场景(学籍管理、人事数据、客户数据等)中,这类脚本非常实用,大幅提升效率。

如果你有更复杂的需求,比如:

  • 多字段匹配
  • 多表联查
  • 模糊匹配(拼音/首字母)
  • 学生重复名自动识别
  • 批量处理多个文件夹

以上就是Python读取多格式Excel并实现跨表匹配合并的完整示例的详细内容,更多关于Python读取多格式Excel并合并的资料请关注脚本之家其它相关文章!

相关文章

  • python编程普通及类和静态方法示例详解

    python编程普通及类和静态方法示例详解

    普通方法会将实例传入方法当中(通常用self表示),类方法会将类传入方法当中(通常用cls表示),静态方法中传入与类无关的变量。下面将举例详细说明
    2021-10-10
  • python处理大数字的方法

    python处理大数字的方法

    这篇文章主要介绍了python处理大数字的方法,涉及Python递归操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 使用Python批量下载ts格式视频

    使用Python批量下载ts格式视频

    这篇文章主要介绍了使用Python批量下载ts格式视频的相关资料,需要的朋友可以参考下
    2023-05-05
  • python 中if else 语句的作用及示例代码

    python 中if else 语句的作用及示例代码

    python中的if-else语句是一个判断性语句,既然是判断就要有条件以及满足条件与不满足的情况,一下将讲解一些if-else语句的知识,需要的朋友参考下吧
    2018-03-03
  • python3 下载网络图片代码实例

    python3 下载网络图片代码实例

    这篇文章主要介绍了python3 下载网络图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 教你使用TensorFlow2识别验证码

    教你使用TensorFlow2识别验证码

    验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,本文主要介绍了 TensorFlow2识别验证码,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 在django中图片上传的格式校验及大小方法

    在django中图片上传的格式校验及大小方法

    今天小编就为大家分享一篇在django中图片上传的格式校验及大小方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python模块如何查看

    python模块如何查看

    在本篇文章中小编给大家整理的是关于python的模块位置的相关知识点,需要的朋友们可以参考下。
    2020-06-06
  • 使用Python实现TCP/IP客户端和服务端通信功能

    使用Python实现TCP/IP客户端和服务端通信功能

    TCP/IP(传输控制协议/互联网协议)是互联网的基础协议,用于在网络中的计算机之间进行可靠的数据传输,在Python中,可以使用socket模块来实现TCP/IP通信,本文给大家介绍了使用Python实现TCP/IP客户端和服务端通信功能,需要的朋友可以参考下
    2024-12-12
  • Python实现将视频按照时间维度剪切

    Python实现将视频按照时间维度剪切

    这篇文章主要为大家详细介绍了如何利用Python实现将视频按照时间维度进行剪切,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12

最新评论