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

Python批量合并多個(gè)Excel工作簿中同名工作表

 更新時(shí)間:2026年06月30日 09:17:05   作者:楊利杰YJlio  
本文介紹了使用Python批量合并多個(gè)Excel工作簿中同名工作表的方法,適用于財(cái)務(wù)、銷售等需要匯總數(shù)據(jù)的場(chǎng)景,通過(guò)自動(dòng)化處理,可避免手動(dòng)復(fù)制粘貼導(dǎo)致的重復(fù)表頭問(wèn)題,希望幫助用戶高效完成分散數(shù)據(jù)的集中化處理,

1. 問(wèn)題背景:為什么要批量合并同名工作表

本文主題是 批量合并多個(gè)工作簿中的同名工作表。這個(gè)場(chǎng)景在真實(shí)辦公里很常見(jiàn):多個(gè)部門、多個(gè)分部、多個(gè)項(xiàng)目分別提交 Excel 文件,每個(gè)文件里都有一張同名工作表,最后需要匯總成一份總表。

比如華北、華東、華南三個(gè)分部各自提交一個(gè) 上半年.xlsx 文件,每個(gè)文件里都有一張叫 統(tǒng)計(jì) 的工作表?,F(xiàn)在領(lǐng)導(dǎo)不想看三個(gè)文件,只想看一份 上半年匯總表.xlsx。如果手工處理,就要不斷打開(kāi)文件、復(fù)制數(shù)據(jù)、粘貼到總表,這就是非常典型的“復(fù)制粘貼型加班”。

這張圖展示的是本文的整體目標(biāo):把多個(gè)工作簿中的同名工作表,批量合并到一個(gè)新的匯總工作簿中。

從圖中可以看出,本文的重點(diǎn)不是處理單個(gè) Excel,而是把多個(gè)來(lái)源文件的數(shù)據(jù)統(tǒng)一匯入一個(gè)結(jié)果文件。這類任務(wù)的核心不是“會(huì)不會(huì)復(fù)制”,而是能不能穩(wěn)定地批量讀取、累積數(shù)據(jù)、生成匯總結(jié)果。

這里最容易翻車的地方,是把每個(gè)工作簿的表頭都一起復(fù)制進(jìn)去。如果每合并一個(gè)文件就追加一次表頭,最后的匯總表里會(huì)反復(fù)出現(xiàn)“日期、產(chǎn)品、銷量、金額”這樣的標(biāo)題行,后續(xù)篩選、排序都會(huì)受到影響。

2. 應(yīng)用場(chǎng)景:多個(gè)分部統(tǒng)計(jì)表合成一份匯總表

批量合并同名工作表,本質(zhì)上解決的是“分散數(shù)據(jù)集中化”的問(wèn)題。只要多個(gè) Excel 文件結(jié)構(gòu)相似,且目標(biāo)工作表名稱一致,就可以考慮用腳本自動(dòng)合并。

這張圖展示的是典型應(yīng)用場(chǎng)景:多個(gè)分部統(tǒng)計(jì)表,最終匯總成一份總表。

從圖中可以看到,這類需求常見(jiàn)于財(cái)務(wù)匯總、銷售匯總、庫(kù)存匯總等場(chǎng)景。每個(gè)分部都有自己的統(tǒng)計(jì)表,但管理層真正需要的是一份統(tǒng)一結(jié)果。Python 在這里的價(jià)值,就是把重復(fù)復(fù)制粘貼變成穩(wěn)定規(guī)則。

我更建議把這類任務(wù)理解成一個(gè)標(biāo)準(zhǔn)流程:先確定文件夾,再逐個(gè)打開(kāi)工作簿,找到指定同名工作表,讀取數(shù)據(jù),持續(xù)累積,最后統(tǒng)一寫入一個(gè)新的匯總工作簿。

這張流程圖里最重要的是兩個(gè)判斷:第一,目標(biāo)工作表是否存在;第二,當(dāng)前是不是第一次讀取數(shù)據(jù)。前者決定文件要不要跳過(guò),后者決定是否要讀取表頭。

3. 核心原理:表頭只取一次,數(shù)據(jù)持續(xù)累積

批量合并多個(gè)工作簿時(shí),最關(guān)鍵的邏輯不是打開(kāi)文件,而是處理表頭和數(shù)據(jù)的關(guān)系。正常情況下,每個(gè)工作簿里的同名工作表都有一行表頭,但最終匯總表只需要一份表頭。

這張圖展示的是本案例的核心邏輯:第一次讀取時(shí)保留表頭,后續(xù)工作簿只追加數(shù)據(jù)行。

從圖中可以看出,header = None 表示表頭還沒(méi)有被初始化,all_data = [] 表示先準(zhǔn)備一個(gè)空列表,用來(lái)持續(xù)累積后續(xù)讀取到的數(shù)據(jù)行。第一次遇到有效表格時(shí),取出表頭;之后每讀取一個(gè)文件,就只把數(shù)據(jù)部分追加到 all_data 中。

header = None 的語(yǔ)義是“還沒(méi)有拿到表頭”,而不是“表頭為空”。這個(gè)區(qū)別很重要。None 更像一個(gè)初始化標(biāo)記,表示后面第一次讀取到表格時(shí),需要把第一行保存為表頭。

header = None
all_data = []

if header is None:
    header = table[0]

values = table[1:]
all_data = all_data + values

這里的 table[0] 表示第一行,也就是表頭;table[1:] 表示從第二行開(kāi)始的所有數(shù)據(jù)行。最終寫入?yún)R總表時(shí),用 [header] + all_data 拼成完整內(nèi)容。

如果不區(qū)分表頭和數(shù)據(jù),匯總表后期會(huì)很難用。重復(fù)表頭會(huì)影響篩選、排序、公式引用,也會(huì)讓數(shù)據(jù)看起來(lái)不干凈。這種問(wèn)題不是語(yǔ)法錯(cuò)誤,但屬于典型的數(shù)據(jù)質(zhì)量問(wèn)題。

4. 實(shí)現(xiàn)流程:遍歷文件、讀取同名表、寫入?yún)R總簿

在看完整代碼之前,先把流程想清楚。這個(gè)案例可以拆成八個(gè)動(dòng)作:遍歷文件夾、跳過(guò)臨時(shí)文件、檢查是否存在目標(biāo)工作表、讀取表格數(shù)據(jù)、累積到 all_data、新建匯總工作簿、寫入表頭和數(shù)據(jù)、最后執(zhí)行 autofit() 自動(dòng)調(diào)整顯示效果。

這張圖展示的是完整實(shí)現(xiàn)流程,從文件遍歷一直到最終生成匯總表。

從圖中可以看出,真正穩(wěn)定的腳本不是“打開(kāi)文件然后復(fù)制”,而是每一步都有判斷。比如遇到 ~$ 臨時(shí)文件要跳過(guò);目標(biāo)工作表不存在要跳過(guò);數(shù)據(jù)為空也要跳過(guò)。批處理腳本越是面對(duì)多個(gè)文件,越不能假設(shè)每個(gè)文件都完全正常。

下面是一份可直接修改使用的完整代碼。實(shí)際使用時(shí),只需要改三個(gè)參數(shù):輸入文件夾、目標(biāo)工作表名稱、輸出文件路徑。

import os
import xlwings as xw

# ====== 需要根據(jù)實(shí)際情況修改的參數(shù) ======
folder_path = r"e:\file\target"          # 多個(gè)工作簿所在目錄
sheet_name = "統(tǒng)計(jì)"                      # 需要合并的同名工作表
out_file = r"e:\file\上半年匯總表.xlsx"   # 輸出匯總文件
# ======================================

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

header = None
all_data = []

try:
    for file in os.listdir(folder_path):

        # 1. 跳過(guò) Excel 臨時(shí)文件
        if file.startswith("~$"):
            continue

        # 2. 只處理 Excel 文件
        if not file.lower().endswith((".xlsx", ".xls", ".xlsm")):
            continue

        full_path = os.path.join(folder_path, file)
        wb = app.books.open(full_path)

        # 3. 判斷目標(biāo)工作表是否存在
        sheet_names = [s.name for s in wb.sheets]
        if sheet_name not in sheet_names:
            wb.close()
            print(f"跳過(guò):{file},不存在工作表:{sheet_name}")
            continue

        sht = wb.sheets[sheet_name]

        # 4. 從 A1 開(kāi)始擴(kuò)展讀取表格區(qū)域
        table = sht.range("A1").expand("table").value

        # 5. 判斷是否有有效數(shù)據(jù)
        if not table or len(table) < 2:
            wb.close()
            print(f"跳過(guò):{file},數(shù)據(jù)為空或只有表頭")
            continue

        # 6. 第一次讀取表頭
        if header is None:
            header = table[0]

        # 7. 后續(xù)只累積數(shù)據(jù)行
        values = table[1:]
        all_data = all_data + values

        wb.close()
        print(f"已讀?。簕file} -> [{sheet_name}]")

    # 8. 新建匯總工作簿
    out_wb = app.books.add()
    out_sht = out_wb.sheets[0]
    out_sht.name = "匯總"

    if header is None:
        out_sht.range("A1").value = [["沒(méi)有讀取到任何有效數(shù)據(jù)"]]
    else:
        out_sht.range("A1").value = [header] + all_data
        out_sht.autofit()

    out_wb.save(out_file)
    out_wb.close()

    print(f"匯總完成:{out_file}")

finally:
    app.quit()

這段代碼的骨架很清楚:外層負(fù)責(zé)遍歷文件,內(nèi)層負(fù)責(zé)讀取指定工作表,最后統(tǒng)一寫入?yún)R總工作簿。它不是一次性腳本,而是一個(gè)可以復(fù)用的批量合并模板。

5. 關(guān)鍵代碼拆解:為什么這樣寫

5.1 為什么要跳過(guò)臨時(shí)文件

Excel 打開(kāi)文件時(shí),目錄里可能出現(xiàn) ~$ 開(kāi)頭的臨時(shí)文件。這類文件不是正式工作簿,腳本如果嘗試打開(kāi)它,很容易報(bào)錯(cuò)。

if file.startswith("~$"):
    continue

推薦所有批量處理 Excel 的腳本都加上這個(gè)判斷。這不是多余代碼,而是穩(wěn)定性保障。

5.2 為什么要判斷同名工作表是否存在

并不是所有文件都一定有目標(biāo)工作表。比如有些分部沒(méi)有提交 統(tǒng)計(jì) 表,或者表名寫成了 數(shù)據(jù)統(tǒng)計(jì)。如果不判斷直接讀取,就會(huì)報(bào)錯(cuò)。

sheet_names = [s.name for s in wb.sheets]

if sheet_name not in sheet_names:
    wb.close()
    print(f"跳過(guò):{file},不存在工作表:{sheet_name}")
    continue

不要默認(rèn)所有文件都符合模板。真實(shí)辦公里,文件命名、sheet 命名、字段順序經(jīng)常會(huì)有偏差。腳本必須允許異常文件跳過(guò),而不是因?yàn)橐粋€(gè)文件異常導(dǎo)致整個(gè)任務(wù)中斷。

5.3 為什么用 expand(“table”)

sht.range("A1").expand("table").value 的意思是從 A1 單元格開(kāi)始,自動(dòng)擴(kuò)展讀取連續(xù)的數(shù)據(jù)區(qū)域。只要表格從 A1 開(kāi)始,并且中間沒(méi)有完全空白行列,這種寫法就比較方便。

table = sht.range("A1").expand("table").value

這里有一個(gè)前提:表格必須從 A1 附近開(kāi)始,并且數(shù)據(jù)區(qū)域要連續(xù)。如果表格上方有標(biāo)題說(shuō)明、空行、合并單元格,expand("table") 可能無(wú)法讀到你想要的區(qū)域。這類文件需要先規(guī)范模板,或者改用更明確的讀取范圍。

5.4 為什么最后要 autofit()

寫入 Excel 后,列寬可能不合適,長(zhǎng)文本會(huì)被遮住,數(shù)字也可能顯示成 #######。所以寫完數(shù)據(jù)后執(zhí)行 autofit(),能讓匯總表更接近可閱讀狀態(tài)。

out_sht.autofit()

推薦在生成結(jié)果文件時(shí)做基礎(chǔ)美化。辦公自動(dòng)化不是只把數(shù)據(jù)寫進(jìn)去,還要考慮別人打開(kāi)文件時(shí)能不能直接看。

6. 效果驗(yàn)證:匯總后必須檢查這幾項(xiàng)

批量合并腳本跑完后,不能只看控制臺(tái)有沒(méi)有報(bào)錯(cuò)。更穩(wěn)的做法,是對(duì)輸出結(jié)果做基本校驗(yàn)。

第一,要檢查輸出文件是否生成;第二,要檢查匯總表是否只有一行表頭;第三,要檢查數(shù)據(jù)行數(shù)是否符合預(yù)期;第四,要抽查幾條來(lái)源數(shù)據(jù),看是否確實(shí)進(jìn)入?yún)R總表。

print(f"匯總數(shù)據(jù)行數(shù):{len(all_data)}")
print(f"輸出文件:{out_file}")

如果希望日志更清楚,可以記錄每個(gè)文件的處理狀態(tài)。比如哪些文件成功讀取,哪些文件缺少目標(biāo) sheet,哪些文件為空。這樣后續(xù)復(fù)盤更方便。

log_list = []

log_list.append({
    "文件名": file,
    "目標(biāo)工作表": sheet_name,
    "處理結(jié)果": "已讀取",
    "數(shù)據(jù)行數(shù)": len(values)
})

對(duì)于真實(shí)辦公場(chǎng)景,我更建議把處理日志也導(dǎo)出成 Excel。因?yàn)槟_本輸出的結(jié)果文件可能會(huì)被別人復(fù)查,處理日志就是你的證據(jù)鏈。

7. 常見(jiàn)問(wèn)題與踩坑提醒

7.1 表頭不一致會(huì)導(dǎo)致匯總結(jié)果變臟

如果不同工作簿里的 統(tǒng)計(jì) 表字段不一致,比如有的叫 銷售額,有的叫 金額,腳本雖然可能能合并,但最終結(jié)果會(huì)出現(xiàn)字段含義不統(tǒng)一的問(wèn)題。

合并前最好先校驗(yàn)表頭是否一致。否則看起來(lái)合并成功,實(shí)際數(shù)據(jù)口徑可能已經(jīng)錯(cuò)了。

if header is not None and table[0] != header:
    print(f"表頭不一致:{file}")

7.2 空行和合并單元格會(huì)影響讀取范圍

expand("table") 適合連續(xù)表格。如果 Excel 里有空行、合并單元格、額外標(biāo)題、說(shuō)明文字,讀取范圍可能不符合預(yù)期。

推薦先統(tǒng)一模板,再批量合并。如果模板混亂,腳本只是把混亂放大,不能自動(dòng)把所有臟數(shù)據(jù)變干凈。

7.3 文件被打開(kāi)可能導(dǎo)致保存異常

如果某個(gè)源文件正在被打開(kāi),或者輸出匯總文件已經(jīng)被打開(kāi),腳本可能無(wú)法保存。尤其是在共享盤、同步盤、企業(yè)網(wǎng)盤目錄中,這個(gè)問(wèn)題很常見(jiàn)。

建議先把待處理文件復(fù)制到本地臨時(shí)目錄,例如 C:\Temp\excel_merge,確認(rèn)無(wú)人占用后再執(zhí)行腳本。

7.4 xlwings 依賴 Excel 環(huán)境

xlwings 的優(yōu)勢(shì)是能像人工一樣操作 Excel,但它通常依賴本機(jī)安裝的 Excel。如果電腦沒(méi)有安裝 Excel,或者 Excel 插件、彈窗、權(quán)限策略異常,腳本也可能運(yùn)行失敗。

如果只是讀取和合并數(shù)據(jù),后續(xù)也可以考慮用 pandas + openpyxl 做無(wú)界面處理。但本文沿用書(shū)中思路,重點(diǎn)練習(xí)的是 xlwings 操控工作簿和工作表的能力。

8. 舉一反三:一個(gè)工作簿內(nèi)合并 1月 到 6月

前面的案例是多個(gè)工作簿合并到一個(gè)匯總簿。其實(shí)同樣的思路也可以用于一個(gè)工作簿內(nèi)部,比如一個(gè) 年度數(shù)據(jù).xlsx 中有 1月、2月、3月、4月、5月、6月 這些工作表,現(xiàn)在要合并成一張 上半年匯總。

這張圖展示的是擴(kuò)展案例:在同一個(gè)工作簿中,把 1月 到 6月 的工作表合并到一張新表中。

從圖中可以看出,雖然合并范圍從“多個(gè)文件”變成了“一個(gè)文件里的多個(gè) sheet”,但底層邏輯沒(méi)有變:第一次取表頭,后續(xù)只取數(shù)據(jù),最后寫入新的匯總工作表。

import xlwings as xw

file_path = r"e:\file\年度數(shù)據(jù).xlsx"
month_sheets = ["1月", "2月", "3月", "4月", "5月", "6月"]

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

header = None
all_data = []

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

    for name in month_sheets:
        sheet_names = [s.name for s in wb.sheets]

        if name not in sheet_names:
            print(f"跳過(guò):不存在工作表 {name}")
            continue

        sht = wb.sheets[name]
        table = sht.range("A1").expand("table").value

        if not table or len(table) < 2:
            print(f"跳過(guò):{name} 數(shù)據(jù)為空或只有表頭")
            continue

        if header is None:
            header = table[0]

        all_data = all_data + table[1:]

    if "上半年匯總" not in [s.name for s in wb.sheets]:
        wb.sheets.add("上半年匯總")

    sum_sht = wb.sheets["上半年匯總"]
    sum_sht.clear()

    if header is None:
        sum_sht.range("A1").value = [["沒(méi)有讀取到任何有效數(shù)據(jù)"]]
    else:
        sum_sht.range("A1").value = [header] + all_data
        sum_sht.autofit()

    wb.save()
    wb.close()

finally:
    app.quit()

這個(gè)擴(kuò)展案例非常適合練習(xí)“同一邏輯遷移到不同場(chǎng)景”。如果能把多個(gè)文件合并、同文件多 sheet 合并都理解清楚,后續(xù)處理月報(bào)、季度報(bào)、分部報(bào)表會(huì)輕松很多。

9. 總結(jié)提升:合并不是復(fù)制,合并是規(guī)則化處理

這一篇的核心,不是簡(jiǎn)單記住 all_data = all_data + values,而是理解批量合并背后的自動(dòng)化思維。多個(gè)工作簿中的同名工作表,本質(zhì)上是多個(gè)結(jié)構(gòu)相似的數(shù)據(jù)源;匯總工作簿,則是統(tǒng)一輸出結(jié)果。

本文最關(guān)鍵的判斷有三點(diǎn):第一,目標(biāo)工作表是否存在;第二,是否第一次讀取表頭;第三,讀取到的數(shù)據(jù)是否有效。只要這三點(diǎn)處理好,腳本的穩(wěn)定性就會(huì)明顯提高。

真正可復(fù)用的腳本,不是只會(huì)在一次練習(xí)文件上跑通,而是能處理異常、能跳過(guò)無(wú)效文件、能輸出清晰結(jié)果。這才是辦公自動(dòng)化和簡(jiǎn)單代碼練習(xí)之間的區(qū)別。

最后提醒一句:批量合并前一定要備份源文件,并用少量樣本先測(cè)試。尤其是涉及財(cái)務(wù)、庫(kù)存、資產(chǎn)、人事等數(shù)據(jù)時(shí),腳本跑得快不是優(yōu)點(diǎn),跑得穩(wěn)、結(jié)果可驗(yàn)證才是優(yōu)點(diǎn)。

以上就是Python批量合并多個(gè)Excel工作簿中同名工作表的詳細(xì)內(nèi)容,更多關(guān)于Python合并多個(gè)Excel同名工作表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

和政县| 碌曲县| 汶上县| 滦南县| 乌拉特中旗| 靖远县| 碌曲县| 柳州市| 西城区| 松滋市| 宜宾市| 霍城县| 门头沟区| 门源| 博兴县| 苍山县| 柘荣县| 宜黄县| 上犹县| 鞍山市| 开鲁县| 青海省| 本溪| 祁连县| 勃利县| 蒙城县| 靖宇县| 阿勒泰市| 洛南县| 嘉鱼县| 阿拉善右旗| 卓尼县| 河曲县| 泽库县| 马边| 和龙市| 米脂县| 乌鲁木齐县| 武平县| 镇雄县| 仪征市|