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

Python自動(dòng)化篩選Excel工作簿中多個(gè)工作表的實(shí)戰(zhàn)教學(xué)

 更新時(shí)間:2026年06月30日 09:03:49   作者:楊利杰YJlio  
本文介紹了如何利用Python自動(dòng)化篩選Excel工作簿中多個(gè)工作表的實(shí)用方法,文中詳細(xì)說明了實(shí)現(xiàn)原理、適用場(chǎng)景(需字段一致)、限制條件,并提供了完整代碼示例和流程圖解,有需要的小伙伴可以了解下

1. 問題背景與寫作目標(biāo)

本文主題是 篩選一個(gè)工作簿中的所有工作表數(shù)據(jù)。這一節(jié)的價(jià)值不在于“會(huì)不會(huì)點(diǎn) Excel 篩選按鈕”,而是把重復(fù)篩選動(dòng)作變成一套可以復(fù)用的自動(dòng)化流程。

在日常辦公里,經(jīng)常會(huì)遇到這樣的表格:一個(gè)工作簿里有很多張工作表,例如 1 月、2 月、3 月、4 月,或者華北、華東、華南等區(qū)域表?,F(xiàn)在我們要按同一個(gè)條件篩選每張表,比如只保留 銷售區(qū)域 = 華東 的記錄。如果手工做,就要一張表一張表點(diǎn)篩選、復(fù)制、粘貼、保存,表一多就很容易漏掉。

這張圖展示了本文要解決的核心問題:對(duì)一個(gè)工作簿中的多個(gè)工作表,統(tǒng)一按照同一個(gè)條件進(jìn)行批量篩選。

從這張圖中我們可以看出,左側(cè)有多個(gè)工作表,右側(cè)通過“銷售區(qū)域 = 華東”的條件把目標(biāo)數(shù)據(jù)篩選出來。這里真正值得注意的是:篩選對(duì)象不是一張表,而是整個(gè)工作簿里的所有工作表。這就是 Python 自動(dòng)化比手工操作更有價(jià)值的地方。

原理說明:本案例的本質(zhì)是“批量遍歷 + 條件過濾 + 結(jié)果寫入”。Excel 負(fù)責(zé)存儲(chǔ)表格,pandas 負(fù)責(zé)數(shù)據(jù)篩選,xlwings 負(fù)責(zé)連接和操作工作簿。

2. 適用場(chǎng)景與限制條件

這個(gè)案例適合處理“多個(gè)工作表結(jié)構(gòu)相似,并且需要按照同一個(gè)字段篩選”的場(chǎng)景。比如所有工作表里都有“銷售區(qū)域”字段,現(xiàn)在只保留“華東”;或者所有工作表里都有“狀態(tài)”字段,只保留“有效”;再或者所有工作表里都有“金額”字段,只保留大于 1000 的記錄。

常見適用場(chǎng)景包括:

1. 多個(gè)月份銷售表中,只篩選某個(gè)區(qū)域的數(shù)據(jù);

2. 多個(gè)部門明細(xì)表中,只篩選某個(gè)狀態(tài)的數(shù)據(jù);

3. 多張訂單表中,只篩選指定產(chǎn)品類別或指定客戶的數(shù)據(jù);

4. 多個(gè)庫(kù)存表中,只篩選庫(kù)存不足、狀態(tài)異常或金額超過閾值的記錄。

限制條件:這類腳本默認(rèn)每張工作表的數(shù)據(jù)結(jié)構(gòu)比較接近。如果有的表第一行不是表頭、有的表字段名稱不一致、有的表中間有空行,那么腳本就需要額外做兼容處理,不能直接照搬最簡(jiǎn)單版本。

推薦做法:正式運(yùn)行前,先打開源工作簿確認(rèn)三件事:表頭是否在第一行、篩選字段是否一致、數(shù)據(jù)區(qū)域是否連續(xù)。只要這三點(diǎn)不穩(wěn)定,批量篩選就容易出現(xiàn)漏篩或跳過。

3. 核心原理與實(shí)現(xiàn)流程

這一節(jié)的核心流程可以拆成五步:打開工作簿、遍歷每張工作表、讀取數(shù)據(jù)為 DataFrame、按字段條件篩選、把篩選結(jié)果寫入新的工作簿。只要這個(gè)流程理解清楚,代碼就不會(huì)顯得亂。

這張圖展示了批量篩選工作表數(shù)據(jù)的完整處理鏈路。

從這張圖中我們可以看出,程序不是直接在 Excel 界面上“模擬點(diǎn)擊篩選按鈕”,而是把每張工作表的數(shù)據(jù)讀取出來,轉(zhuǎn)換成 DataFrame,再通過條件表達(dá)式篩選出目標(biāo)記錄,最后寫入結(jié)果文件。這種方式比模擬鼠標(biāo)點(diǎn)擊更穩(wěn)定,也更容易加日志和校驗(yàn)。

原理說明:pandas 的優(yōu)勢(shì)是數(shù)據(jù)過濾能力強(qiáng),適合做 data[data[字段] == 條件] 這類判斷;xlwings 的優(yōu)勢(shì)是可以直接和 Excel 工作簿交互,適合讀取、寫入、保存文件。

4. 完整代碼:篩選一個(gè)工作簿中所有工作表的數(shù)據(jù)

下面這段代碼演示一個(gè)常見場(chǎng)景:遍歷 銷售明細(xì).xlsx 中的所有工作表,只保留 銷售區(qū)域 等于 華東 的數(shù)據(jù),并將篩選結(jié)果寫入一個(gè)新的工作簿。

這張圖展示了 pandas + xlwings 配合完成自動(dòng)篩選的場(chǎng)景:左側(cè)是 Python 代碼,右側(cè)是 Excel 數(shù)據(jù)源和篩選結(jié)果。

從這張圖中我們可以看出,pandas 負(fù)責(zé)把數(shù)據(jù)篩出來,xlwings 負(fù)責(zé)打開工作簿和寫入結(jié)果。這個(gè)分工要理解清楚,否則很容易把 pandas 和 xlwings 的職責(zé)混在一起。

import os
import re
import pandas as pd
import xlwings as xw


def safe_sheet_name(name):
    """
    清理工作表名稱,避免超過 Excel 限制或包含非法字符
    """
    name = str(name).strip()
    name = re.sub(r'[\\/:*?\[\]]', "_", name)
    return name[:31] if name else "篩選結(jié)果"


# ====== 需要根據(jù)實(shí)際情況修改的參數(shù) ======
source_file = r"E:\example\銷售明細(xì).xlsx"
result_file = r"E:\example\篩選結(jié)果_華東.xlsx"

filter_column = "銷售區(qū)域"
filter_value = "華東"
# =====================================

app = xw.App(visible=False, add_book=False)

try:
    wb = app.books.open(source_file)
    result_wb = app.books.add()

    # 刪除默認(rèn)工作簿中多余的空白工作表,只保留第一張備用
    while len(result_wb.sheets) > 1:
        result_wb.sheets[-1].delete()

    output_count = 0

    for sht in wb.sheets:
        print(f"正在處理工作表:{sht.name}")

        # 讀取當(dāng)前連續(xù)數(shù)據(jù)區(qū)域?yàn)?DataFrame
        try:
            data = sht.range("A1").options(
                pd.DataFrame,
                header=1,
                index=False,
                expand="table"
            ).value
        except Exception as e:
            print(f"跳過:{sht.name},讀取失?。簕e}")
            continue

        if data is None or data.empty:
            print(f"跳過:{sht.name},空表或無有效數(shù)據(jù)")
            continue

        # 清理字段名前后空格
        data.columns = [str(col).strip() for col in data.columns]

        if filter_column not in data.columns:
            print(f"跳過:{sht.name},缺少字段:{filter_column}")
            continue

        # 條件篩選
        result = data[data[filter_column].astype(str).str.strip() == filter_value]

        if result.empty:
            print(f"未命中:{sht.name},沒有符合條件的數(shù)據(jù)")
            continue

        # 寫入結(jié)果工作簿
        if output_count == 0:
            result_sht = result_wb.sheets[0]
            result_sht.name = safe_sheet_name(sht.name)
        else:
            result_sht = result_wb.sheets.add(name=safe_sheet_name(sht.name), after=result_wb.sheets[-1])

        result_sht.range("A1").value = result
        result_sht.autofit()

        output_count += 1
        print(f"已寫入:{sht.name},篩選結(jié)果 {len(result)} 行")

    wb.close()

    if output_count == 0:
        print("沒有任何工作表篩選出結(jié)果,結(jié)果文件未保存。")
        result_wb.close()
    else:
        result_wb.save(result_file)
        result_wb.close()
        print(f"篩選完成:{result_file}")

finally:
    app.quit()

這段代碼比最基礎(chǔ)版本多做了幾個(gè)保護(hù):字段名前后空格清理、目標(biāo)字段是否存在判斷、空結(jié)果跳過、工作表名稱合法化、結(jié)果數(shù)量統(tǒng)計(jì)。這些細(xì)節(jié)不是為了“顯得復(fù)雜”,而是為了讓腳本更接近真實(shí)辦公環(huán)境。

風(fēng)險(xiǎn)提醒:如果你直接使用最簡(jiǎn)單的篩選代碼,不判斷字段是否存在,那么只要某一張工作表字段名不一致,整個(gè)腳本就可能中斷。批量處理時(shí),穩(wěn)定性比代碼短更重要。

5. 關(guān)鍵判斷:為什么要先檢查字段是否存在

批量處理 Excel 時(shí),不要默認(rèn)所有工作表都完全規(guī)范?,F(xiàn)實(shí)里最常見的問題不是代碼不會(huì)寫,而是數(shù)據(jù)源不干凈。比如同一個(gè)字段,有的表叫“銷售區(qū)域”,有的表叫“區(qū)域”,還有的表干脆缺少這一列。

這張圖展示了批量篩選前必須做的字段檢查:字段正確可以繼續(xù)執(zhí)行,字段不匹配或字段缺失則需要跳過并提示。

從這張圖中我們可以看出,字段檢查不是可有可無的步驟。左側(cè)表格中存在“銷售區(qū)域”字段,可以安全執(zhí)行篩選;右側(cè)表格雖然也有區(qū)域數(shù)據(jù),但字段名不是“銷售區(qū)域”,或者直接缺少目標(biāo)字段,程序就不能強(qiáng)行篩選。

原理說明:pandas 按列名篩選時(shí),本質(zhì)上是通過 data[filter_column] 定位目標(biāo)列。如果列名不存在,就會(huì)觸發(fā)異常。因此在正式篩選前,必須先執(zhí)行 if filter_column not in data.columns。

if filter_column not in data.columns:
    print(f"跳過:{sht.name},缺少字段:{filter_column}")
    continue

推薦做法:如果你的數(shù)據(jù)來源比較混亂,可以維護(hù)一個(gè)字段別名列表,把“銷售區(qū)域”“區(qū)域”“所屬區(qū)域”都識(shí)別為同一個(gè)篩選字段。

candidate_columns = ["銷售區(qū)域", "區(qū)域", "所屬區(qū)域"]

real_column = None
for col in candidate_columns:
    if col in data.columns:
        real_column = col
        break

if real_column is None:
    print(f"跳過:{sht.name},未找到可用區(qū)域字段")
    continue

result = data[data[real_column].astype(str).str.strip() == filter_value]

注意:字段別名雖然能提高兼容性,但也可能帶來誤判。如果“區(qū)域”和“銷售區(qū)域”在業(yè)務(wù)含義上不是同一個(gè)字段,就不要強(qiáng)行合并。

6. 效果驗(yàn)證與數(shù)據(jù)對(duì)比

腳本運(yùn)行完成以后,不要只看有沒有生成結(jié)果文件。真正要驗(yàn)證的是:結(jié)果文件能不能打開,篩選出來的數(shù)據(jù)是不是都符合條件,行數(shù)是否符合預(yù)期,關(guān)鍵字段有沒有丟失。

這張圖展示了篩選結(jié)果驗(yàn)證的思路:不僅要確認(rèn)結(jié)果文件生成,還要檢查行數(shù)、條件和抽樣數(shù)據(jù)。

從這張圖中我們可以看出,結(jié)果驗(yàn)證至少包含三層:第一,結(jié)果文件已經(jīng)生成并且可以正常打開;第二,結(jié)果行數(shù)與預(yù)期一致;第三,隨機(jī)抽樣檢查時(shí),篩選字段確實(shí)都滿足“華東”。這一步?jīng)Q定了腳本結(jié)果是否可靠。

我建議運(yùn)行后至少檢查以下幾項(xiàng):

1. 輸出目錄中是否生成了 篩選結(jié)果_華東.xlsx

2. 結(jié)果工作簿中是否存在對(duì)應(yīng)的工作表;

3. 每張結(jié)果表中的 銷售區(qū)域 是否全部為 華東;

4. 篩選結(jié)果行數(shù)是否和源表中手工篩選結(jié)果一致;

5. 金額、日期、客戶名稱等關(guān)鍵字段是否完整保留。

# 簡(jiǎn)單驗(yàn)證某個(gè)結(jié)果表中的銷售區(qū)域是否都為目標(biāo)值
check_result = result[filter_column].astype(str).str.strip().eq(filter_value).all()

if check_result:
    print(f"{sht.name} 驗(yàn)證通過:篩選結(jié)果全部為 {filter_value}")
else:
    print(f"{sht.name} 驗(yàn)證失敗:存在不符合條件的數(shù)據(jù)")

  推薦做法:正式交付前,隨機(jī)抽查 2~3 張結(jié)果表,再回到源表中用 Excel 手工篩選一次進(jìn)行對(duì)照。批量腳本最怕“整體看起來成功,但某幾張表處理錯(cuò)了”。

7. 常見問題與踩坑記錄

這個(gè)案例看起來不難,但真實(shí)運(yùn)行時(shí)很容易踩坑。問題通常不是 pandas 的篩選語(yǔ)法,而是 Excel 文件本身不規(guī)范。

坑 1:字段名有隱藏空格。例如表頭顯示為“銷售區(qū)域”,但實(shí)際是“銷售區(qū)域 ”。肉眼不容易發(fā)現(xiàn),但程序會(huì)認(rèn)為這是兩個(gè)不同字段。代碼里用 strip() 清理字段名,就是為了處理這種問題。

坑 2:篩選值不統(tǒng)一。有的表寫“華東”,有的表寫“華東區(qū)”,還有的寫“華東區(qū)域”。如果業(yè)務(wù)上這些代表同一個(gè)意思,就需要先做標(biāo)準(zhǔn)化。

data[filter_column] = data[filter_column].astype(str).str.strip()
data[filter_column] = data[filter_column].replace({
    "華東區(qū)": "華東",
    "華東區(qū)域": "華東"
})

坑 3:工作表名稱超過 31 個(gè)字符。Excel 工作表名稱有長(zhǎng)度限制,如果直接拿原表名創(chuàng)建結(jié)果表,可能保存失敗。所以代碼中使用了 safe_sheet_name() 做截?cái)嗵幚怼?/p>

坑 4:結(jié)果文件正在打開。如果 篩選結(jié)果_華東.xlsx 已經(jīng)被 Excel 打開,腳本保存時(shí)可能失敗。運(yùn)行前建議關(guān)閉源文件和結(jié)果文件。

坑 5:默認(rèn)空白工作表沒有處理。新建結(jié)果工作簿時(shí),Excel 通常會(huì)自帶一個(gè)空白工作表。如果不處理,最后結(jié)果文件里可能多出一個(gè)無用空表。上面的代碼通過復(fù)用第一張表或刪除多余表來減少這個(gè)問題。

經(jīng)驗(yàn)判斷:批量腳本不是寫完能跑一次就算完成。真正可用的腳本,必須能在遇到空表、缺字段、字段名有空格、結(jié)果為空時(shí)給出明確提示,而不是直接中斷。

8. 總結(jié)與進(jìn)階建議

這一節(jié)的核心,不是記住某一段 pandas 代碼,而是理解批量篩選 Excel 工作表的完整處理模式:打開工作簿、遍歷工作表、讀取數(shù)據(jù)、判斷字段、執(zhí)行篩選、寫入結(jié)果、驗(yàn)證輸出。

我認(rèn)為這篇筆記最值得帶走的經(jīng)驗(yàn)有三點(diǎn)。

第一,批量處理前必須明確對(duì)象和邊界。你要處理的是一個(gè)工作簿里的所有工作表,不是一張表,也不是多個(gè)文件夾中的文件。對(duì)象不同,代碼結(jié)構(gòu)就不同。

第二,字段校驗(yàn)比篩選語(yǔ)法更重要。篩選語(yǔ)法很簡(jiǎn)單,但字段不一致會(huì)直接影響結(jié)果可靠性。真實(shí)辦公數(shù)據(jù)里,字段名異常比語(yǔ)法錯(cuò)誤更常見。

第三,結(jié)果驗(yàn)證不能省。生成文件只是第一步,結(jié)果是否符合條件才是交付標(biāo)準(zhǔn)。尤其是涉及銷售金額、訂單、客戶、資產(chǎn)等數(shù)據(jù)時(shí),必須核對(duì)行數(shù)和關(guān)鍵字段。

如果后續(xù)繼續(xù)擴(kuò)展,可以把篩選字段、篩選條件、源文件路徑和輸出路徑做成參數(shù),甚至做成一個(gè)小工具界面。這樣就能從“讀書筆記中的腳本”升級(jí)成“真實(shí)辦公場(chǎng)景可復(fù)用的自動(dòng)化工具”。

以上就是Python自動(dòng)化篩選Excel工作簿中多個(gè)工作表的實(shí)戰(zhàn)教學(xué)的詳細(xì)內(nèi)容,更多關(guān)于Python篩選Excel工作表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 通過實(shí)例解析python創(chuàng)建進(jìn)程常用方法

    通過實(shí)例解析python創(chuàng)建進(jìn)程常用方法

    這篇文章主要介紹了通過實(shí)例解析python創(chuàng)建進(jìn)程常用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python面試題之read、readline和readlines的區(qū)別詳解

    python面試題之read、readline和readlines的區(qū)別詳解

    當(dāng)python進(jìn)行文件的讀取會(huì)遇到三個(gè)不同的函數(shù),它們分別是read(),readline(),和readlines(),下面這篇文章主要給大家介紹了關(guān)于python面試題之read、readline和readlines區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Python標(biāo)準(zhǔn)庫(kù)中email模塊的使用方法與內(nèi)部機(jī)制詳解

    Python標(biāo)準(zhǔn)庫(kù)中email模塊的使用方法與內(nèi)部機(jī)制詳解

    在 Python 中處理電子郵件時(shí),標(biāo)準(zhǔn)庫(kù)中的 email 模塊是首選工具,無論你需要發(fā)送 HTML 格式的郵件、帶附件的郵件,還是解析復(fù)雜的郵件結(jié)構(gòu),email 庫(kù)都能勝任,這篇博客將帶你系統(tǒng)地認(rèn)識(shí)并掌握 email 模塊的使用方法與內(nèi)部機(jī)制,需要的朋友可以參考下
    2025-06-06
  • python實(shí)現(xiàn)MongoDB的雙活示例

    python實(shí)現(xiàn)MongoDB的雙活示例

    本文主要介紹了python實(shí)現(xiàn)MongoDB的雙活示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python基于httpx模塊實(shí)現(xiàn)發(fā)送請(qǐng)求

    Python基于httpx模塊實(shí)現(xiàn)發(fā)送請(qǐng)求

    這篇文章主要介紹了Python基于httpx模塊實(shí)現(xiàn)發(fā)送請(qǐng)求,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python基于QQ郵箱實(shí)現(xiàn)SSL發(fā)送

    Python基于QQ郵箱實(shí)現(xiàn)SSL發(fā)送

    這篇文章主要介紹了Python基于QQ郵箱實(shí)現(xiàn)SSL發(fā)送,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python最短路徑的求解Dijkstra算法示例代碼

    python最短路徑的求解Dijkstra算法示例代碼

    這篇文章主要給大家介紹了關(guān)于python最短路徑的求解Dijkstra算法的相關(guān)資料,并使用Python的heapq模塊實(shí)現(xiàn)該算法,通過示例展示了如何從節(jié)點(diǎn)0到節(jié)點(diǎn)8求解最短路徑,需要的朋友可以參考下
    2024-11-11
  • Python中數(shù)字類型內(nèi)置方法詳解

    Python中數(shù)字類型內(nèi)置方法詳解

    在?Python?編程里,數(shù)字類型是極為基礎(chǔ)且關(guān)鍵的數(shù)據(jù)類型,本文將深入介紹?Python?數(shù)字類型的內(nèi)置方法,同時(shí)輔以詳細(xì)的代碼示例,需要的可以了解下
    2025-04-04
  • Python3.10的一些新特性原理分析

    Python3.10的一些新特性原理分析

    由于采用了新的發(fā)行計(jì)劃:PEP 602 -- Annual Release Cycle for Python,我們可以看到更短的開發(fā)窗口,我們有望在 2021 年 10 月使用今天分享的這些新特性
    2021-09-09
  • python神經(jīng)網(wǎng)絡(luò)pytorch中BN運(yùn)算操作自實(shí)現(xiàn)

    python神經(jīng)網(wǎng)絡(luò)pytorch中BN運(yùn)算操作自實(shí)現(xiàn)

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)pytorch中BN運(yùn)算操作自實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

额济纳旗| 吉安市| 临沂市| 泰兴市| 禹城市| 读书| 甘孜县| 禄丰县| 海安县| 香格里拉县| 扎鲁特旗| 江城| 郯城县| 香格里拉县| 凤凰县| 翁牛特旗| 玉门市| 云安县| 滨海县| 邛崃市| 阿尔山市| 封丘县| 曲靖市| 乌鲁木齐县| 通江县| 册亨县| 防城港市| 宜章县| 龙游县| 舞阳县| 淳安县| 广平县| 花莲县| 海晏县| 廊坊市| 平乡县| 武功县| 新干县| 宝鸡市| 信阳市| 且末县|