最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python讀取多格式Excel并實(shí)現(xiàn)跨表匹配合并的完整示例

 更新時(shí)間:2025年11月17日 08:28:25   作者:程序員愛釣魚  
在數(shù)據(jù)處理中,經(jīng)常會(huì)遇到這樣一個(gè)需求:一份是主數(shù)據(jù)表,另一份是學(xué)生/員工/客戶的完整信息表, 需要按姓名匹配,把完整信息補(bǔ)充到主表中,聽起來簡(jiǎn)單,但實(shí)際操作中常會(huì)踩坑,本文就分享一次真實(shí)項(xiàng)目中的解決方案,需要的朋友可以參考下

在數(shù)據(jù)處理中,經(jīng)常會(huì)遇到這樣一個(gè)需求:

我們有兩份 Excel:一份是主數(shù)據(jù)表,另一份是學(xué)生/員工/客戶的完整信息表。 需要按姓名匹配,把完整信息補(bǔ)充到主表中。

聽起來簡(jiǎn)單,但實(shí)際操作中常會(huì)踩坑,比如:

  • 主表是 XLS,信息表是 XLSX
  • 兩個(gè)表的表頭不在第一行
  • 信息表第一列是序號(hào),真正數(shù)據(jù)在第二列開始
  • 合并后需要把新字段插入到指定位置,而不是簡(jiǎn)單拼在末尾

本文就分享一次真實(shí)項(xiàng)目中的解決方案: 使用 Python + Pandas + xlrd + openpyxl,實(shí)現(xiàn)多格式 Excel 讀取 + 靈活表頭處理 + 按姓名匹配合并 + 自定義列順序輸出。

一、需求拆解

最終目標(biāo)是:

  1. 無論是 XLS 還是 XLSX,都能讀取
  2. 支持跳過表頭行
  3. 支持跳過第一列(常見為序號(hào))
  4. 按姓名進(jìn)行匹配
  5. 把匹配結(jié)果插入主表的指定列后(例如 I 列)
  6. 輸出一個(gè)新的 XLSX 文件

為了做到這點(diǎn),我們需要寫一個(gè)“通用 Excel 讀取函數(shù)”。

二、通用 Excel 讀取函數(shù)(支持 XLS / XLSX)

核心難點(diǎn)在于:

  • pandas 無法直接讀取帶舊格式 .xls 的合并單元格或特殊格式
  • xlrd 只能讀取 .xls(新版不支持 .xlsx

所以策略是:

  • xls → xlrd
  • xlsx → pandas(openpyxl)

并手動(dòng)實(shí)現(xiàn)跳過行、跳過列等功能。

三、跨表匹配的整體流程

整個(gè)數(shù)據(jù)處理邏輯如下:

  1. 讀取主表(XLS/XLSX 均可)
  2. 讀取信息表(可以從第二行是真表頭)
  3. 把信息表按“姓名”設(shè)置為索引
  4. 循環(huán)主表每一行,根據(jù)姓名取對(duì)應(yīng)信息
  5. 把匹配結(jié)果拼成新的 DataFrame
  6. 插入到主表指定列之后
  7. 輸出最終的合并表

這個(gè)流程能適配各種不同的 Excel 格式,健壯性很高。

四、完整示例代碼(已脫敏)

以下是通用示例代碼,你可以直接復(fù)用:

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 的通用讀取函數(shù)
    - skip_header_rows: 跳過前 N 行
    - skip_first_column: 是否跳過第一列(序號(hào))
    """
    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


# ===== 配置區(qū)(示例) ===== #
main_file = "主表.xls"
main_sheet = "數(shù)據(jù)表"

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("兩份表格必須都包含“姓名”列!")

# 設(shè)置信息表的索引
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)

# 匹配內(nèi)容插入到指定位置(示例:插入到第 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("輸出結(jié)果.xlsx", index=False)

五、關(guān)鍵技術(shù)點(diǎn)解釋

① 通用讀取函數(shù)封裝的意義

很多項(xiàng)目里主表和信息表格式不同、位置不同、列不同。 封裝通用函數(shù)之后:

  • 腳本可復(fù)用性強(qiáng)
  • 更換 Excel 只需修改文件名
  • 結(jié)構(gòu)更清晰、利于維護(hù)

② 使用set_index做匹配

df_info.set_index("姓名")

這樣查找效率極高,相當(dāng)于字典查詢。

③ 保持原表字段順序不變

很多業(yè)務(wù)表格是“固定模板”,不能隨意打亂列。 這里通過自定義 new_cols 保證了最終順序完全可控。

六、效果示例

最終輸出的 Excel 將會(huì):

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

整個(gè)流程自動(dòng)化,不需要人工篩選、復(fù)制、粘貼。

七、總結(jié)

通過 Python 的數(shù)據(jù)處理能力,我們可以輕松實(shí)現(xiàn):

  • 跨格式 Excel 讀?。╔LS/XLSX)
  • 靈活處理表頭位置與列結(jié)構(gòu)
  • 按姓名精準(zhǔn)匹配信息表
  • 保持主表字段順序
  • 自動(dòng)生成合并后的最終數(shù)據(jù)

在實(shí)際業(yè)務(wù)場(chǎng)景(學(xué)籍管理、人事數(shù)據(jù)、客戶數(shù)據(jù)等)中,這類腳本非常實(shí)用,大幅提升效率。

如果你有更復(fù)雜的需求,比如:

  • 多字段匹配
  • 多表聯(lián)查
  • 模糊匹配(拼音/首字母)
  • 學(xué)生重復(fù)名自動(dòng)識(shí)別
  • 批量處理多個(gè)文件夾

以上就是Python讀取多格式Excel并實(shí)現(xiàn)跨表匹配合并的完整示例的詳細(xì)內(nèi)容,更多關(guān)于Python讀取多格式Excel并合并的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python語言變量和數(shù)據(jù)類型基礎(chǔ)學(xué)習(xí)

    python語言變量和數(shù)據(jù)類型基礎(chǔ)學(xué)習(xí)

    這篇文章主要為大家介紹了python語言變量和數(shù)據(jù)類型基礎(chǔ)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • python如何根據(jù)windows窗口名稱、進(jìn)程pid打開窗口(pygetwindow)

    python如何根據(jù)windows窗口名稱、進(jìn)程pid打開窗口(pygetwindow)

    pygetwindow是一個(gè)Python庫(kù),用于獲取、操作和管理當(dāng)前打開的窗口,提供窗口句柄、位置和大小獲取、移動(dòng)、調(diào)整大小、最小化、最大化、還原窗口、模擬輸入和焦點(diǎn)控制等功能
    2026-02-02
  • python命令行安裝包詳解

    python命令行安裝包詳解

    這篇文章主要介紹了python命令行安裝包的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • python3-flask-3將信息寫入日志的實(shí)操方法

    python3-flask-3將信息寫入日志的實(shí)操方法

    在本篇文章里小編給大家整理的是關(guān)于python3-flask-3將信息寫入日志的實(shí)操方法,有興趣的朋友們學(xué)習(xí)下。
    2019-11-11
  • python裝飾器常見使用方法分析

    python裝飾器常見使用方法分析

    這篇文章主要介紹了python裝飾器常見使用方法,結(jié)合實(shí)例形式分析了Python裝飾器的功能及三種常見的裝飾模式使用技巧,需要的朋友可以參考下
    2019-06-06
  • 利用Python將數(shù)值型特征進(jìn)行離散化操作的方法

    利用Python將數(shù)值型特征進(jìn)行離散化操作的方法

    今天小編就為大家分享一篇利用Python將數(shù)值型特征進(jìn)行離散化操作的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python之json文件讀寫操作的四種方法

    python之json文件讀寫操作的四種方法

    本文介紹了Python中處理JSON數(shù)據(jù)的四個(gè)主要方法,包括json.loads用于將JSON字符串轉(zhuǎn)化為Python字典,json.load用于從JSON文件讀取數(shù)據(jù),json.dumps將Python對(duì)象轉(zhuǎn)換為JSON字符串,而json.dump則用于將數(shù)據(jù)寫入JSON文件,感興趣的可以了解一下
    2025-12-12
  • Python去除字符串中某個(gè)字符的多種實(shí)現(xiàn)方法

    Python去除字符串中某個(gè)字符的多種實(shí)現(xiàn)方法

    這篇文章主要介紹了Python去除字符串中某個(gè)字符的多種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 利用Python抓取行政區(qū)劃碼的方法

    利用Python抓取行政區(qū)劃碼的方法

    做項(xiàng)目的時(shí)候會(huì)需要用到各個(gè)行政區(qū)劃的代碼,最近就碰巧遇到有這個(gè)需求,于是就上網(wǎng)搜了一下,測(cè)試后分享給大家,這篇文章就給大家分享了利用Python抓取行政區(qū)劃碼的示例代碼,有需要的朋友們可以參考借鑒,下面跟著小編一起去學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • 一文帶你搞懂Python上下文管理器

    一文帶你搞懂Python上下文管理器

    這篇文章主要為大家介紹了Python上下文管理器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12

最新評(píng)論

大同县| 驻马店市| 文水县| 廊坊市| 平阴县| 汝城县| 寻乌县| 临泽县| 云梦县| 仲巴县| 山东省| 治县。| 和静县| 汪清县| 广汉市| 延边| 五原县| 综艺| 鄂尔多斯市| 和龙市| 巴青县| 柳林县| 昔阳县| 读书| 巴楚县| 宁陵县| 上饶县| 西峡县| 崇仁县| 高平市| 德钦县| 石泉县| 陕西省| 永新县| 仪征市| 抚顺市| 长宁县| 资溪县| 双桥区| 建阳市| 万安县|