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

Python自動化拆分Excel工作表的實戰(zhàn)教學(xué)

 更新時間:2026年06月30日 09:11:49   作者:楊利杰YJlio  
本文介紹了如何使用Python自動化拆分Excel工作表,按條件將一個總表拆分成多個獨立工作簿,提高辦公效率,關(guān)鍵在于使用字典完成數(shù)據(jù)分類,理解for循環(huán)逐組生成文件的核心邏輯

1. 問題背景:為什么要把一個總表拆成多個工作簿

本文主題是 按條件將一個工作表拆分為多個工作簿。這個案例在辦公自動化里非常實用,因為很多時候我們拿到的是一張“總表”,但實際分發(fā)時需要按產(chǎn)品、地區(qū)、門店、人員等字段拆成多份文件。

手工處理時,常見流程是先篩選,再復(fù)制,再新建工作簿,再粘貼,再保存。數(shù)據(jù)量少的時候還能忍,分類一多就很浪費時間。更麻煩的是,人工操作容易漏篩、漏復(fù)制、保存錯文件名,最后還要反復(fù)返工。

這張圖展示的是本文的核心目標(biāo):用 Python + Excel 自動化,把一個總表按分類條件拆分成多個獨立工作簿。

從圖中可以看出,左側(cè)是一份完整的 總表.xlsx,右側(cè)根據(jù)“類別”拆出了 背包.xlsx、行李箱.xlsx錢包.xlsx 等多個工作簿。這個過程的本質(zhì)不是簡單復(fù)制文件,而是先識別每一行屬于哪一類,再把同類數(shù)據(jù)分別寫入對應(yīng)的新工作簿。

原理說明:這類自動化任務(wù)的關(guān)鍵不在 Excel 表格本身,而在“分類規(guī)則”。只要分類字段確定,后面的處理就可以交給程序循環(huán)完成。

2. 場景說明:哪些業(yè)務(wù)適合按條件拆分

這個案例適合處理“同一張表,需要分發(fā)給不同對象”的場景。比如銷售總表按產(chǎn)品拆分給產(chǎn)品負(fù)責(zé)人,門店數(shù)據(jù)按門店拆分給店長,區(qū)域業(yè)績按地區(qū)拆分給區(qū)域經(jīng)理,員工績效按人員拆分給個人或主管。

這張圖展示的是按不同字段分發(fā)數(shù)據(jù)的典型應(yīng)用場景。

從圖中能看出,同一張銷售總表可以按照不同維度拆分:按產(chǎn)品輸出 背包.xlsx,按地區(qū)輸出 華北.xlsx,按門店輸出 門店A.xlsx,按人員輸出 張三.xlsx。這說明拆分邏輯并不局限于“產(chǎn)品名稱”,只要是表格中的某一列,都可以作為拆分條件。

推薦做法:實際工作中不要一上來就寫死“按產(chǎn)品拆分”,而是先確認(rèn)業(yè)務(wù)真正要按哪一列拆分。字段選錯了,腳本跑得再快也沒有意義。

我認(rèn)為這類需求最適合用 Python 處理,因為它有三個明顯優(yōu)勢:第一,批量生成文件穩(wěn)定;第二,文件命名規(guī)則清晰;第三,后續(xù)可以繼續(xù)加日志、校驗、異常處理,沉淀成可復(fù)用的小工具。

3. 核心原理:用字典完成分類分組

這節(jié)真正要吃透的是 dict()。如果只看代碼,很容易覺得這只是一個普通字典;但放到 Excel 拆分場景里看,字典就是“分類容器”。它負(fù)責(zé)把同一個類別的數(shù)據(jù)行集中放到一起。

這張圖展示的是字典分類的核心思路:key 是分類值,value 是該分類下的數(shù)據(jù)列表。

從圖中可以看出,源數(shù)據(jù)表中的每一行都會根據(jù)“類別”字段流向?qū)?yīng)的分組。例如“背包”相關(guān)的行會進(jìn)入 data["背包"],行李箱相關(guān)的行會進(jìn)入 data["行李箱"],錢包相關(guān)的行會進(jìn)入 data["錢包"]。

最終字典結(jié)構(gòu)大致是這樣的:

data = {
    "背包": [
        ["雙肩包", "背包", 10, 129, 1290],
        ["登山包", "背包", 5, 199, 995],
        ["單肩包", "背包", 7, 89, 623]
    ],
    "行李箱": [
        ["拉桿箱", "行李箱", 8, 299, 2392],
        ["旅行箱", "行李箱", 6, 399, 2394]
    ],
    "錢包": [
        ["錢包A", "錢包", 20, 59, 1180],
        ["錢包B", "錢包", 15, 69, 1035]
    ]
}

原理說明:key 決定輸出文件名,value 決定寫入該文件的數(shù)據(jù)內(nèi)容。理解這一點,就能看懂后面的 for key, value in data.items() 為什么可以逐類生成工作簿。

風(fēng)險提醒:分類字段不能隨便選。如果字段里有空值、錯別字、多余空格,比如“背包”和“背包 ”,程序會把它們當(dāng)成兩個不同分類,最終生成的文件也會被拆散。

4. 操作流程:讀取、分組、輸出、保存

在寫代碼之前,先把流程畫清楚。這個案例的穩(wěn)定寫法不是邊讀邊保存,而是先讀取總表,再分組,最后按分組結(jié)果批量輸出。這樣邏輯更清楚,也更方便排錯。

這張圖展示的是完整的執(zhí)行流程:讀取總表、按類別分組、新建工作簿、保存文件。

從圖中能看出,這個案例不是單步操作,而是一條完整的數(shù)據(jù)處理鏈路。先從 總表.xlsx 讀取數(shù)據(jù),再通過 data = dict() 完成分類,接著為每個分類新建一個工作簿,最后保存為對應(yīng)的 Excel 文件。

推薦做法:如果你是第一次寫這種腳本,建議先把流程跑通,不要急著做復(fù)雜封裝。先能正確拆出文件,再考慮日志、界面、異常處理。

5. 完整代碼:按分類字段拆分為多個工作簿

下面這段代碼使用 xlwings 讀取源工作簿,并按指定列拆分為多個新工作簿。這里假設(shè)按第 1 列進(jìn)行分類,實際使用時可以根據(jù)自己的表結(jié)構(gòu)修改 group_col_index。

import os
import re
import xlwings as xw


def safe_filename(name):
    """
    將分類值轉(zhuǎn)換成合法文件名,避免 Windows 文件名非法字符導(dǎo)致保存失敗
    """
    name = str(name).strip()
    name = re.sub(r'[\\/:*?"<>|]', "_", name)
    return name if name else "未分類"


# ====== 需要根據(jù)實際情況修改的參數(shù) ======
source_file = r"e:\file\總表.xlsx"
source_sheet = "Sheet1"
output_dir = r"e:\file\拆分結(jié)果"
group_col_index = 1  # 按哪一列拆分:0 表示 A 列,1 表示 B 列
# =====================================

os.makedirs(output_dir, exist_ok=True)

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

try:
    wb = app.books.open(source_file)
    sht = wb.sheets[source_sheet]

    # 讀取連續(xù)表格區(qū)域,包含表頭
    table = sht.range("A1").expand("table").value

    if not table or len(table) < 2:
        raise ValueError("源表數(shù)據(jù)為空,或只有表頭,沒有可拆分的數(shù)據(jù)行。")

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

    data = dict()

    for row in rows:
        key = row[group_col_index]

        if key is None or str(key).strip() == "":
            key = "未分類"

        key = str(key).strip()

        if key not in data:
            data[key] = []

        data[key].append(row)

    for key, value in data.items():
        file_name = safe_filename(key) + ".xlsx"
        out_path = os.path.join(output_dir, file_name)

        new_wb = app.books.add()
        new_sht = new_wb.sheets[0]
        new_sht.name = safe_filename(key)[:31]

        new_sht.range("A1").value = [header] + value

        new_wb.save(out_path)
        new_wb.close()

        print(f"已生成:{out_path},行數(shù):{len(value)}")

    wb.close()

finally:
    app.quit()

這段代碼比最基礎(chǔ)版本多做了兩件事:第一,用 safe_filename() 處理非法文件名;第二,對空分類值做了兜底處理,避免分類字段為空時直接報錯。

注意:Excel 工作表名稱最長不能超過 31 個字符,所以這里使用 safe_filename(key)[:31] 做了截斷。如果不處理,分類值太長時可能導(dǎo)致工作表改名失敗。

原理說明:new_sht.range("A1").value = [header] + value 這句非常關(guān)鍵。它不是只寫數(shù)據(jù)行,而是把表頭也一起寫進(jìn)去。否則拆出來的文件雖然有數(shù)據(jù),但缺少字段名,后續(xù)閱讀和二次處理都會不方便。

6. 關(guān)鍵代碼理解:不要只會復(fù)制

這段代碼里最值得重點理解的是三處:一是 data = dict(),二是 data[key].append(row),三是 for key, value in data.items()

data = dict() 是創(chuàng)建一個空字典,用來存放分類結(jié)果。每遇到一個新的分類值,就在字典里新增一個鍵;如果這個分類已經(jīng)存在,就把當(dāng)前行追加到對應(yīng)列表中。

if key not in data:
    data[key] = []

data[key].append(row)

這兩句代碼可以理解成:如果還沒有這個分類,就先創(chuàng)建一個空文件夾;如果已經(jīng)有了,就把這一行數(shù)據(jù)放進(jìn)去。雖然實際結(jié)構(gòu)不是文件夾,但思路很像。

for key, value in data.items() 是輸出階段的核心。key 用來生成文件名,value 是該分類下所有數(shù)據(jù)行。每循環(huán)一次,就生成一個新的 Excel 工作簿。

for key, value in data.items():
    file_name = safe_filename(key) + ".xlsx"
    out_path = os.path.join(output_dir, file_name)

推薦做法:學(xué)習(xí)這類腳本時,不要一開始就盯著所有代碼看。先抓主線:數(shù)據(jù)從哪里來,按什么分組,最終輸出到哪里。主線清楚了,細(xì)節(jié)才有意義。

7. 常見問題:拆分前必須先檢查

按條件拆分工作表,真正容易翻車的地方往往不是語法,而是數(shù)據(jù)本身。字段為空、分類值不統(tǒng)一、文件名包含非法字符、輸出目錄不存在、生成結(jié)果沒有核對,這些問題都會影響最終交付。

這張圖展示的是拆分工作表前需要重點關(guān)注的幾個檢查點。

從圖中可以看出,拆分前至少要檢查四件事:關(guān)鍵字段不能為空,輸出目錄要提前創(chuàng)建,文件名要合法,結(jié)果要核對。尤其是文件名問題,在 Windows 下不能包含 \ / : * ? " < > | 等字符,否則保存文件時會失敗。

坑 1:分類字段為空。如果某些行的分類字段為空,腳本可能跳過這些行,也可能把它們歸到“未分類”。具體選擇要看業(yè)務(wù)要求,不能隨便處理。

坑 2:分類值表面相同,實際不同。比如“華北”和“華北 ”,后者多了一個空格。肉眼看起來差不多,但程序會認(rèn)為它們是兩個不同的分類。所以代碼里最好使用 strip() 清理前后空格。

坑 3:輸出文件名重復(fù)。如果多個分類值清洗后變成相同文件名,就可能覆蓋或保存失敗。嚴(yán)格場景下應(yīng)該在文件名后追加編號,避免沖突。

def get_unique_path(folder, filename):
    base, ext = os.path.splitext(filename)
    path = os.path.join(folder, filename)
    index = 1

    while os.path.exists(path):
        path = os.path.join(folder, f"{base}_{index}{ext}")
        index += 1

    return path

推薦做法:正式輸出前先統(tǒng)計每個分類的行數(shù)。比如背包多少行、行李箱多少行、錢包多少行。這樣能提前發(fā)現(xiàn)“某一類數(shù)據(jù)異常偏少”或“分類值寫錯導(dǎo)致拆分異常”的問題。

8. 效果驗證:拆出來不等于拆對了

腳本運行完以后,不要只看控制臺有沒有報錯。對這種批量拆分任務(wù)來說,真正要確認(rèn)的是結(jié)果是否完整、分類是否正確、文件是否能正常打開。

我一般會從三個角度檢查。第一,檢查輸出文件數(shù)量是否等于分類數(shù)量。比如總表里有 3 個產(chǎn)品分類,輸出目錄里就應(yīng)該有 3 個工作簿。第二,抽查每個工作簿里的分類列,確認(rèn)里面沒有混入其他分類。第三,核對總行數(shù),所有輸出文件的數(shù)據(jù)行加起來,應(yīng)該等于源表數(shù)據(jù)行數(shù)。

total_output_rows = 0

for key, value in data.items():
    print(f"{key}:{len(value)} 行")
    total_output_rows += len(value)

print(f"源數(shù)據(jù)行數(shù):{len(rows)}")
print(f"輸出數(shù)據(jù)行數(shù)合計:{total_output_rows}")

原理說明:拆分驗證的核心是“守恒”。如果只是按條件拆分,而沒有刪除數(shù)據(jù),那么輸出文件中的總數(shù)據(jù)行數(shù)應(yīng)該和源表數(shù)據(jù)行數(shù)一致。只要行數(shù)對不上,就必須回頭查分類字段、空值處理和過濾邏輯。

不要犯的錯誤:看到輸出目錄里生成了幾個 Excel 文件,就以為任務(wù)完成了。文件生成只是第一步,拆分正確才是交付標(biāo)準(zhǔn)。

9. 總結(jié)提升:把它變成自己的辦公自動化模板

這一節(jié)看似只是“把一個工作表拆分為多個工作簿”,但背后其實是一個非常通用的數(shù)據(jù)處理模型:讀取總數(shù)據(jù)、按字段分組、逐組輸出結(jié)果。這個模型以后可以繼續(xù)擴展到銷售數(shù)據(jù)分發(fā)、資產(chǎn)清單拆分、人員績效拆分、門店報表拆分等場景。

我認(rèn)為這節(jié)最值得掌握的不是某一行代碼,而是三種判斷能力。

第一,先判斷拆分字段是否可靠。字段不可靠,后面的自動化都是放大錯誤。

第二,輸出前先做清洗和校驗。分類值去空格、文件名合法化、輸出目錄創(chuàng)建,這些都是批量處理的基本安全動作。

第三,結(jié)果必須核對。自動化不是腳本跑完就結(jié)束,而是要確認(rèn)輸出結(jié)果能交付、能復(fù)查、能復(fù)用。

如果后續(xù)把這段代碼繼續(xù)封裝,可以加上圖形界面,讓用戶選擇源文件、選擇拆分字段、選擇輸出目錄,再一鍵生成多個工作簿。這樣它就不只是讀書筆記,而是一個真正能用于辦公現(xiàn)場的小工具。

到此這篇關(guān)于Python自動化拆分Excel工作表的實戰(zhàn)教學(xué)的文章就介紹到這了,更多相關(guān)Python拆分Excel工作表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Python創(chuàng)建一個視頻管理器并實現(xiàn)視頻截圖功能

    使用Python創(chuàng)建一個視頻管理器并實現(xiàn)視頻截圖功能

    在這篇博客中,我將向大家展示如何使用 wxPython 創(chuàng)建一個簡單的圖形用戶界面 (GUI) 應(yīng)用程序,該應(yīng)用程序可以管理視頻文件列表、播放視頻,并生成視頻截圖,我們將逐步實現(xiàn)這些功能,并確保代碼易于理解和擴展,感興趣的小伙伴跟著小編一起來看看吧
    2024-08-08
  • 詳解Python如何在Web環(huán)境中使用Matplotlib進(jìn)行數(shù)據(jù)可視化

    詳解Python如何在Web環(huán)境中使用Matplotlib進(jìn)行數(shù)據(jù)可視化

    數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)和分析中一個至關(guān)重要的部分,它能幫助我們更好地理解和解釋數(shù)據(jù),在現(xiàn)代應(yīng)用中,越來越多的開發(fā)者希望能夠?qū)?shù)據(jù)可視化結(jié)果展示在網(wǎng)頁上,本文將介紹如何在 Web 環(huán)境中使用 Matplotlib 進(jìn)行可視化,包括基本概念、集成方式以及實用示例
    2024-11-11
  • Python監(jiān)控主機是否存活并以郵件報警

    Python監(jiān)控主機是否存活并以郵件報警

    本文是利用python腳本寫的簡單測試主機是否存活,此腳本有個缺點不適用線上,由于網(wǎng)絡(luò)延遲、丟包現(xiàn)象會造成誤報郵件,感興趣的朋友一起看看Python監(jiān)控主機是否存活并以郵件報警吧
    2015-09-09
  • Python ConfigParser模塊的使用示例

    Python ConfigParser模塊的使用示例

    這篇文章主要介紹了Python ConfigParser模塊的使用示例,幫助大家更好的理解和學(xué)習(xí)Python ConfigParser模塊的用法,感興趣的朋友可以了解下
    2020-10-10
  • Django操作cookie的實現(xiàn)

    Django操作cookie的實現(xiàn)

    很多網(wǎng)站都會使用Cookie。本文主要介紹了Django操作cookie的實現(xiàn),結(jié)合實例形式詳細(xì)分析了Django框架針對cookie操作的各種常見技巧與操作注意事項,需要的朋友可以參考下
    2021-05-05
  • Python中的xlrd模塊使用整理

    Python中的xlrd模塊使用整理

    今天給大家?guī)淼奈恼率顷P(guān)于Python的相關(guān)知識,文章圍繞著xlrd模塊的使用展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python函數(shù)調(diào)用追蹤實現(xiàn)代碼

    Python函數(shù)調(diào)用追蹤實現(xiàn)代碼

    這篇文章主要介紹了Python函數(shù)調(diào)用追蹤實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • python入門課程第一講之安裝與優(yōu)缺點介紹

    python入門課程第一講之安裝與優(yōu)缺點介紹

    這篇文章主要介紹了python入門課程第一講之安裝與優(yōu)缺點,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Pycharm打印大數(shù)據(jù)文件顯示不全的解決方法

    Pycharm打印大數(shù)據(jù)文件顯示不全的解決方法

    這篇文章主要介紹了Pycharm打印大數(shù)據(jù)文件顯示不全的解決方法,昨晚寫了個小爬蟲,簡單分析下發(fā)現(xiàn)可以修改請求的url,直接獲取所有目標(biāo)的數(shù)據(jù),想先打印在控制臺看看,發(fā)現(xiàn)打印的數(shù)據(jù)不全,所以本文記錄了一下解決方法,需要的朋友可以參考下
    2024-03-03
  • python調(diào)用bash?shell腳本方法

    python調(diào)用bash?shell腳本方法

    這篇文章主要給大家分享了額python調(diào)用bash?shell腳本方法,os.system(command)、os.popen(command)等方法,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2021-12-12

最新評論

三都| 玛曲县| 连江县| 张北县| 朝阳市| 临沂市| 海盐县| 东乌珠穆沁旗| 胶南市| 九龙县| 平武县| 永川市| 正安县| 横峰县| 准格尔旗| 奇台县| 台山市| 彰化市| 城口县| 东辽县| 乐平市| 松溪县| 鄂托克旗| 闽清县| 汝南县| 历史| 五寨县| 望奎县| 丹东市| 偏关县| 阿克苏市| 博白县| 石林| 米林县| 吴堡县| 甘德县| 合山市| 闸北区| 上林县| 东丰县| 咸宁市|