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

Python批量提取Excel工作簿中所有工作表的唯一值

 更新時(shí)間:2026年07月01日 08:59:44   作者:楊利杰YJlio  
本文詳細(xì)講解了使用Python批量提取Excel工作簿中所有工作表的唯一值值,并介紹了其適用場景、核心原理及常見問題,強(qiáng)調(diào)輸出結(jié)果驗(yàn)證的重要性,適合辦公自動(dòng)化初學(xué)者學(xué)習(xí)

1. 問題背景:為什么要批量提取所有工作表的唯一值

本文主題是 批量提取一個(gè)工作簿中所有工作表的唯一值。這個(gè)案例看起來像是“去重”,但在真實(shí)辦公場景里,它經(jīng)常對(duì)應(yīng)一個(gè)很高頻的需求:從多個(gè) sheet 中整理出一份標(biāo)準(zhǔn)清單。

比如一個(gè)工作簿里有 1 月、2 月、3 月、4 月等多個(gè)銷售表,每張表里都有“產(chǎn)品名稱”這一列?,F(xiàn)在我們不關(guān)心每一行銷量,只想整理出這個(gè)工作簿里出現(xiàn)過哪些產(chǎn)品。手工做法通常是:逐個(gè) sheet 復(fù)制產(chǎn)品列,粘貼到一張新表,再使用 Excel 的“刪除重復(fù)項(xiàng)”。如果 sheet 很多、文件很大,這個(gè)過程既慢,也容易漏。

這張圖展示了本文的核心目標(biāo):用 Python + Excel 自動(dòng)化,從一個(gè)工作簿的所有工作表中提取唯一值,并輸出為一份清單。

從這張圖中我們可以看出,數(shù)據(jù)來源不是單個(gè)工作表,而是一個(gè)工作簿內(nèi)的多個(gè)工作表。程序會(huì)從多個(gè) sheet 中收集“產(chǎn)品名稱”,經(jīng)過匯總、去重后,生成右側(cè)的“產(chǎn)品名稱清單”。這就是本文最核心的自動(dòng)化鏈路:多表掃描 → 列數(shù)據(jù)收集 → 去重 → 寫入新工作簿。

原理說明:這類任務(wù)的本質(zhì)不是“操作 Excel 界面”,而是把 Excel 表格看成結(jié)構(gòu)化數(shù)據(jù):工作簿是容器,工作表是數(shù)據(jù)塊,目標(biāo)列是字段,唯一值清單是最終輸出。

2. 適用場景:什么時(shí)候適合用這個(gè)腳本

這個(gè)腳本最適合用于“多個(gè)工作表結(jié)構(gòu)類似,并且都包含同一個(gè)目標(biāo)列”的場景。比如每個(gè)月一張銷售表,每個(gè)部門一張人員表,每個(gè)區(qū)域一張客戶表,只要表頭字段一致,就可以批量提取某一列的唯一值。

這張圖展示了一個(gè)典型場景:多張?jiān)露蠕N售表中都有產(chǎn)品名稱,現(xiàn)在需要整理出一份產(chǎn)品名稱清單。

從這張圖中我們可以看出,1 月、2 月、3 月、4 月這些工作表中都存在重復(fù)產(chǎn)品名稱,例如“背包”“水杯”“錢包”“耳機(jī)”等。最終我們并不需要重復(fù)記錄,而是只需要一份去重后的產(chǎn)品清單。這種場景如果靠復(fù)制粘貼,操作步驟很機(jī)械;用 Python 處理,則可以一次性完成。

適合使用這個(gè)方法的場景包括:

1. 從多張銷售表中提取產(chǎn)品名稱清單;

2. 從多個(gè)部門表中提取員工姓名清單;

3. 從多個(gè)客戶表中提取客戶名稱清單;

4. 從多個(gè)設(shè)備表中提取型號(hào)、城市、部門、資產(chǎn)類別等去重字段。

限制條件:如果每張工作表的表頭名稱不統(tǒng)一,例如有的叫“產(chǎn)品名稱”,有的叫“商品名稱”,有的叫“產(chǎn)品名”,腳本就需要額外做字段映射,否則會(huì)漏掉部分工作表。

推薦做法:正式運(yùn)行前,先統(tǒng)一表頭字段。如果業(yè)務(wù)表格確實(shí)來源混亂,也可以在代碼里維護(hù)一個(gè)候選字段列表,例如 ["產(chǎn)品名稱", "商品名稱", "產(chǎn)品名"],逐個(gè)匹配。

3. 核心原理:set() 去重 + 縱向?qū)懭?Excel

這一節(jié)真正要理解的不是某一行代碼,而是數(shù)據(jù)從“重復(fù)列表”變成“唯一值清單”的過程。腳本會(huì)先把所有工作表中的目標(biāo)列數(shù)據(jù)收集到一個(gè)列表里,這個(gè)列表允許重復(fù);然后用 set() 去掉重復(fù)值;最后再寫入新的 Excel 工作簿。

這張圖展示了本文的關(guān)鍵原理:左側(cè)是含重復(fù)的原始數(shù)據(jù),中間通過 set() 去重,右側(cè)得到唯一值清單,并通過縱向?qū)懭敕绞捷敵龅?Excel。

從這張圖中我們可以看出,原始數(shù)據(jù)中“背包”“行李箱”等值可能出現(xiàn)多次,但經(jīng)過 set() 后,每個(gè)值只保留一份。隨后使用 insert(0, 表頭) 在列表最前面加入表頭,再用 options(transpose=True) 按列縱向?qū)懭?Excel。

原理說明:set 的特點(diǎn)是天然不允許重復(fù)元素,所以它非常適合做唯一值提取。但 set 去重后默認(rèn)不保證原始順序,因此如果希望輸出結(jié)果更整齊,通常會(huì)再配合 sorted() 做排序。

values = ["背包", "行李箱", "背包", "錢包", "水杯", "行李箱"]

unique_values = list(set(values))
unique_values = sorted(unique_values)

unique_values.insert(0, "產(chǎn)品名稱")

注意:如果你需要保留“第一次出現(xiàn)的順序”,不要直接依賴 set()??梢允褂?dict.fromkeys() 保留原始順序。

values = ["背包", "行李箱", "背包", "錢包", "水杯", "行李箱"]

unique_values = list(dict.fromkeys(values))

這兩個(gè)寫法沒有絕對(duì)誰更好。set() 簡單直接,適合只關(guān)心唯一值;dict.fromkeys() 更適合保留原始出現(xiàn)順序。真實(shí)寫腳本時(shí),要根據(jù)業(yè)務(wù)結(jié)果選擇。

4. 實(shí)現(xiàn)流程:遍歷、收集、去重、寫入

在寫代碼之前,先把流程拆開看。這個(gè)案例可以分成四步:遍歷工作表、收集目標(biāo)列、去重、寫入新工作簿。只要這四步理解清楚,后面的代碼就不難。

這張圖展示了完整執(zhí)行流程:從左側(cè)多工作表開始,經(jīng)過目標(biāo)列收集和 set() 去重,最后寫入新的工作簿。

從這張圖中我們可以看出,腳本不是直接“刪除重復(fù)項(xiàng)”,而是先把每張表的目標(biāo)列值全部收集起來,再統(tǒng)一去重。這個(gè)順序很重要:先完整收集,再統(tǒng)一處理,比邊遍歷邊零散處理更清晰,也更方便排查問題。

推薦做法:第一次運(yùn)行腳本時(shí),建議先打印每張工作表是否命中目標(biāo)列,以及提取到了多少個(gè)值。這樣能快速發(fā)現(xiàn)表頭不一致、空表、隱藏表等問題。

5. 完整代碼:xlwings 批量提取唯一值

下面是一個(gè)完整可運(yùn)行版本。這個(gè)版本會(huì)遍歷源工作簿中的所有工作表,查找指定表頭列,把該列非空值收集起來,去除重復(fù)后輸出到新的 Excel 文件中。

import xlwings as xw

# ====== 需要根據(jù)實(shí)際情況修改的參數(shù) ======
file_path = r"e:\file\銷售數(shù)據(jù).xlsx"       # 源工作簿
target_col = "產(chǎn)品名稱"                    # 要提取唯一值的列名
out_file = r"e:\file\產(chǎn)品名稱清單.xlsx"    # 輸出文件
# =====================================

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

try:
    wb = app.books.open(file_path)

    all_values = []

    for sht in wb.sheets:
        table = sht.range("A1").current_region.value

        if not table or len(table) < 2:
            print(f"跳過:{sht.name},沒有可處理的數(shù)據(jù)")
            continue

        header = table[0]
        rows = table[1:]

        if target_col not in header:
            print(f"跳過:{sht.name},未找到列:{target_col}")
            continue

        col_idx = header.index(target_col)
        count = 0

        for row in rows:
            if col_idx >= len(row):
                continue

            value = row[col_idx]

            if value is None or str(value).strip() == "":
                continue

            all_values.append(str(value).strip())
            count += 1

        print(f"已讀?。簕sht.name},提取 {count} 個(gè)值")

    wb.close()

    # 去重并排序
    unique_values = sorted(list(set(all_values)))

    # 插入表頭
    unique_values.insert(0, target_col)

    # 寫入新工作簿
    out_wb = app.books.add()
    out_sht = out_wb.sheets[0]
    out_sht.name = "唯一值清單"

    # 按列縱向?qū)懭?
    out_sht.range("A1").options(transpose=True).value = unique_values
    out_sht.autofit()

    out_wb.save(out_file)
    out_wb.close()

    print(f"清單生成完成:{out_file}")
    print(f"唯一值數(shù)量:{len(unique_values) - 1}")

finally:
    app.quit()

這段代碼里最關(guān)鍵的是 all_values.append(str(value).strip())。我在這里做了兩個(gè)處理:第一,把值轉(zhuǎn)成字符串,避免不同類型混在一起;第二,使用 strip() 去掉前后空格,避免“背包”和“背包 ”被識(shí)別成兩個(gè)不同值。

風(fēng)險(xiǎn)提醒:如果你的目標(biāo)列里既有純數(shù)字,又有文本編號(hào),比如 001、1、1.0,直接轉(zhuǎn)字符串可能會(huì)影響結(jié)果判斷。遇到編號(hào)類字段時(shí),要先確認(rèn) Excel 中的真實(shí)數(shù)據(jù)格式。

原理說明:out_sht.range("A1").options(transpose=True).value = unique_values 的作用是把 Python 列表縱向?qū)懭?Excel。如果不加 transpose=True,列表默認(rèn)會(huì)橫向?qū)懭胍恍?,不符合清單類表格的閱讀習(xí)慣。

6. 效果驗(yàn)證:清單生成不代表結(jié)果一定正確

腳本運(yùn)行完成后,不要只看控制臺(tái)是否提示成功。對(duì)唯一值提取任務(wù)來說,真正要驗(yàn)證的是:目標(biāo)列是否全部掃描到了,空值是否正確排除,重復(fù)值是否真正去掉,輸出清單數(shù)量是否符合預(yù)期。

我一般會(huì)從三個(gè)角度驗(yàn)證:

第一,檢查每個(gè) sheet 是否都被讀取。控制臺(tái)輸出里應(yīng)該能看到每張工作表的處理情況。如果某張表提示“未找到列”,就要回頭看表頭是否寫錯(cuò)。

第二,檢查唯一值數(shù)量。如果原數(shù)據(jù)里大概只有 20 個(gè)產(chǎn)品,結(jié)果輸出了 200 個(gè),那大概率是字段里有空格、錯(cuò)別字、編碼差異或表頭選錯(cuò)了。

第三,打開輸出文件,確認(rèn)清單是縱向排列,并且第一行有表頭。如果表頭缺失,后續(xù)別人拿到這個(gè)文件時(shí)會(huì)不知道這一列代表什么。

print(f"原始收集值數(shù)量:{len(all_values)}")
print(f"去重后唯一值數(shù)量:{len(unique_values) - 1}")

推薦做法:如果是正式交付文件,可以額外輸出一份“處理日志”,記錄每張工作表讀取到多少條數(shù)據(jù)、是否存在目標(biāo)列、最終唯一值數(shù)量是多少。這樣后續(xù)別人質(zhì)疑結(jié)果時(shí),可以回溯。

7. 舉一反三:唯一值后再做統(tǒng)計(jì)匯總

提取唯一值只是第一層能力。很多時(shí)候,業(yè)務(wù)真正要的不是“有哪些產(chǎn)品”,而是“每個(gè)產(chǎn)品的銷量是多少”。這時(shí)就要從 set() 去重升級(jí)到 dict 統(tǒng)計(jì)。

這張圖展示了進(jìn)階思路:先從多個(gè)工作表中提取產(chǎn)品名稱,再用字典累計(jì)銷量,最后輸出產(chǎn)品銷量匯總表。

從這張圖中我們可以看出,set() 適合回答“有哪些”,而 dict 更適合回答“每個(gè)有多少”。如果只做唯一值清單,輸出結(jié)果只有產(chǎn)品名稱;如果繼續(xù)做統(tǒng)計(jì)匯總,就可以得到“產(chǎn)品名稱 + 累計(jì)銷量”的報(bào)表。

下面是一個(gè)按“產(chǎn)品名稱”累計(jì)“銷量”的示例:

import xlwings as xw

file_path = r"e:\file\銷售數(shù)據(jù).xlsx"
col_product = "產(chǎn)品名稱"
col_qty = "銷量"
out_file = r"e:\file\產(chǎn)品銷量匯總.xlsx"

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

try:
    wb = app.books.open(file_path)

    stat = {}

    for sht in wb.sheets:
        table = sht.range("A1").current_region.value

        if not table or len(table) < 2:
            continue

        header = table[0]
        rows = table[1:]

        if col_product not in header or col_qty not in header:
            continue

        idx_p = header.index(col_product)
        idx_q = header.index(col_qty)

        for row in rows:
            if idx_p >= len(row) or idx_q >= len(row):
                continue

            product = row[idx_p]
            qty = row[idx_q]

            if product is None or str(product).strip() == "":
                continue

            product = str(product).strip()

            if qty is None or qty == "":
                qty = 0

            qty = float(qty)

            stat[product] = stat.get(product, 0) + qty

    wb.close()

    out_wb = app.books.add()
    out_sht = out_wb.sheets[0]
    out_sht.name = "產(chǎn)品銷量匯總"

    out_sht.range("A1").value = [["產(chǎn)品名稱", "累計(jì)銷量"]]

    result = sorted(stat.items(), key=lambda x: x[0])
    out_sht.range("A2").value = result
    out_sht.autofit()

    out_wb.save(out_file)
    out_wb.close()

    print(f"統(tǒng)計(jì)完成:{out_file}")
    print(f"產(chǎn)品數(shù)量:{len(stat)}")

finally:
    app.quit()

原理說明:stat.get(product, 0) + qty 是字典累計(jì)的常用寫法。如果產(chǎn)品第一次出現(xiàn),就從 0 開始累計(jì);如果已經(jīng)出現(xiàn)過,就在原有銷量基礎(chǔ)上繼續(xù)加。

注意:統(tǒng)計(jì)金額、銷量、數(shù)量這類字段時(shí),一定要確認(rèn)數(shù)據(jù)能轉(zhuǎn)成數(shù)字。如果單元格里混入“無”“-”“N/A”等文本,float() 會(huì)報(bào)錯(cuò),需要提前清洗。

8. 常見問題與踩坑記錄

這個(gè)案例雖然代碼不長,但真實(shí)使用時(shí)容易踩幾個(gè)坑。第一個(gè)坑是表頭不一致。腳本是按表頭名稱查找列索引的,如果表頭寫錯(cuò),代碼不會(huì)自動(dòng)知道你想要哪一列。

坑 1:目標(biāo)列不存在。如果某張工作表沒有“產(chǎn)品名稱”列,腳本會(huì)跳過。這個(gè)行為本身沒問題,但你必須知道它跳過了哪些表。否則最后清單少數(shù)據(jù),你還以為腳本正常完成了。

坑 2:空格導(dǎo)致重復(fù)。“背包”和“背包 ”肉眼看起來差不多,但程序會(huì)認(rèn)為是兩個(gè)不同值。所以讀取時(shí)建議統(tǒng)一使用 strip()。

坑 3:set 去重后順序變化。如果你希望結(jié)果按字母、拼音或原始順序展示,不能只寫 list(set(values))??梢允褂?sorted() 排序,或者使用 dict.fromkeys() 保留首次出現(xiàn)順序。

坑 4:隱藏工作表也會(huì)被遍歷。如果工作簿中存在隱藏 sheet,for sht in wb.sheets 也可能遍歷到。正式場景下要確認(rèn)是否需要處理隱藏表。

for sht in wb.sheets:
    print(sht.name)

推薦做法:處理正式文件前先復(fù)制一份測試文件,避免腳本寫入異常影響原始數(shù)據(jù)。雖然本文主要是讀取源文件、輸出新文件,但養(yǎng)成備份習(xí)慣沒有壞處。

9. 總結(jié)提升:把“唯一值提取”變成通用清單工具

這一節(jié)的核心,不是記住 set() 這個(gè)函數(shù),而是掌握一種清單類自動(dòng)化思路:從多個(gè)工作表中提取目標(biāo)列,統(tǒng)一收集,去重處理,最后輸出為標(biāo)準(zhǔn)清單。

這類腳本非常適合沉淀成通用工具。只要把源文件路徑、目標(biāo)列名、輸出文件路徑做成參數(shù),就可以復(fù)用到產(chǎn)品清單、客戶清單、部門清單、城市清單、設(shè)備型號(hào)清單等多個(gè)場景。

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

第一,先明確目標(biāo)列。腳本不是魔法,它只能按你指定的字段提取數(shù)據(jù)。字段選錯(cuò),結(jié)果一定錯(cuò)。

第二,先清洗再去重。去重之前要處理空格、空值、類型差異,否則輸出清單看似去重,實(shí)際仍然混亂。

第三,輸出后必須驗(yàn)證。唯一值數(shù)量、表頭、縱向?qū)懭敫袷?、是否遺漏工作表,這些都要檢查。自動(dòng)化不是跑完就結(jié)束,而是要能交付、能復(fù)查、能復(fù)用。

從辦公自動(dòng)化學(xué)習(xí)路徑看,這一節(jié)已經(jīng)從“操作 Excel”進(jìn)入了“整理數(shù)據(jù)結(jié)構(gòu)”的階段。后續(xù)如果繼續(xù)擴(kuò)展,可以把唯一值提取、分類統(tǒng)計(jì)、數(shù)據(jù)匯總、異常值檢查組合起來,形成一個(gè)真正可用的 Excel 數(shù)據(jù)清洗工具箱。

以上就是Python批量提取Excel工作簿中所有工作表的唯一值的詳細(xì)內(nèi)容,更多關(guān)于Python提取Excel工作表唯一值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python使用coloredlogso庫打造彩色日志的全攻略

    Python使用coloredlogso庫打造彩色日志的全攻略

    想象一下,當(dāng)你的服務(wù)突然報(bào)錯(cuò)時(shí),在一堆灰色文本中快速定位到那個(gè)鮮紅的ERROR信息,能節(jié)省多少排查時(shí)間?這就是coloredlogs庫的價(jià)值所在,下面我們就來看看它的具體使用吧
    2026-02-02
  • 淺析Python?WSGI的使用

    淺析Python?WSGI的使用

    WSGI也稱之為web服務(wù)器通用網(wǎng)關(guān)接口,全稱是web?server?gateway?interface。這篇文章主要為大家介紹了Python?WSGI的使用,希望對(duì)大家有所幫助
    2023-04-04
  • 強(qiáng)烈推薦好用的python庫合集(全面總結(jié))

    強(qiáng)烈推薦好用的python庫合集(全面總結(jié))

    這篇文章主要為大家介紹了強(qiáng)烈推薦非常好用的python庫合集(全面總結(jié)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • python機(jī)器學(xué)習(xí)基礎(chǔ)線性回歸與嶺回歸算法詳解

    python機(jī)器學(xué)習(xí)基礎(chǔ)線性回歸與嶺回歸算法詳解

    這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)基礎(chǔ)線性回歸與嶺回歸算法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Python之Sklearn使用入門教程

    Python之Sklearn使用入門教程

    這篇文章主要介紹了Python之Sklearn使用入門教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python實(shí)現(xiàn)顏色rgb和hex相互轉(zhuǎn)換的函數(shù)

    python實(shí)現(xiàn)顏色rgb和hex相互轉(zhuǎn)換的函數(shù)

    這篇文章主要介紹了python實(shí)現(xiàn)顏色rgb和hex相互轉(zhuǎn)換的函數(shù),可實(shí)現(xiàn)將rgb表示的顏色轉(zhuǎn)換成hex值的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • python項(xiàng)目--使用Tkinter的日歷GUI應(yīng)用程序

    python項(xiàng)目--使用Tkinter的日歷GUI應(yīng)用程序

    在 Python 中,我們可以使用 Tkinter 制作 GUI。如果你非常有想象力和創(chuàng)造力,你可以用 Tkinter 做出很多有趣的東西,希望本篇文章能夠幫到你
    2021-08-08
  • Pandas導(dǎo)入導(dǎo)出excel、csv、txt文件教程

    Pandas導(dǎo)入導(dǎo)出excel、csv、txt文件教程

    Pandas?是一個(gè)強(qiáng)大的數(shù)據(jù)分析和處理庫,可以用來讀取和處理多種數(shù)據(jù)格式,本文主要介紹了Pandas導(dǎo)入導(dǎo)出excel、csv、txt文件教程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Python matplotlib可視化繪圖詳解

    Python matplotlib可視化繪圖詳解

    這篇文章主要介紹了Python matplotlib繪圖可視化知識(shí)點(diǎn)整理(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • Python實(shí)現(xiàn)滑動(dòng)平均(Moving Average)的例子

    Python實(shí)現(xiàn)滑動(dòng)平均(Moving Average)的例子

    今天小編就為大家分享一篇Python實(shí)現(xiàn)滑動(dòng)平均(Moving Average)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評(píng)論

万全县| 合阳县| 南充市| 隆安县| 柯坪县| 宜良县| 门源| 手游| 新干县| 德惠市| 资中县| 桦川县| 班玛县| 枣强县| 泉州市| 和平区| 漳平市| 平安县| 大宁县| 桐城市| 石泉县| 西乌珠穆沁旗| 巴楚县| 莱西市| 景泰县| 当雄县| 甘孜| 铜山县| 齐齐哈尔市| 定陶县| 金塔县| 阿克苏市| 香格里拉县| 嘉黎县| 潮州市| 如皋市| 澄城县| 徐闻县| 龙海市| 临泽县| 连云港市|