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

Python批量合并多個Excel工作簿中同名工作表

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

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

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

比如華北、華東、華南三個分部各自提交一個 上半年.xlsx 文件,每個文件里都有一張叫 統(tǒng)計 的工作表。現在領導不想看三個文件,只想看一份 上半年匯總表.xlsx。如果手工處理,就要不斷打開文件、復制數據、粘貼到總表,這就是非常典型的“復制粘貼型加班”。

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

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

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

2. 應用場景:多個分部統(tǒng)計表合成一份匯總表

批量合并同名工作表,本質上解決的是“分散數據集中化”的問題。只要多個 Excel 文件結構相似,且目標工作表名稱一致,就可以考慮用腳本自動合并。

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

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

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

這張流程圖里最重要的是兩個判斷:第一,目標工作表是否存在;第二,當前是不是第一次讀取數據。前者決定文件要不要跳過,后者決定是否要讀取表頭。

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

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

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

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

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

header = None
all_data = []

if header is None:
    header = table[0]

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

這里的 table[0] 表示第一行,也就是表頭;table[1:] 表示從第二行開始的所有數據行。最終寫入匯總表時,用 [header] + all_data 拼成完整內容。

如果不區(qū)分表頭和數據,匯總表后期會很難用。重復表頭會影響篩選、排序、公式引用,也會讓數據看起來不干凈。這種問題不是語法錯誤,但屬于典型的數據質量問題。

4. 實現流程:遍歷文件、讀取同名表、寫入匯總簿

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

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

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

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

import os
import xlwings as xw

# ====== 需要根據實際情況修改的參數 ======
folder_path = r"e:\file\target"          # 多個工作簿所在目錄
sheet_name = "統(tǒng)計"                      # 需要合并的同名工作表
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. 跳過 Excel 臨時文件
        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. 判斷目標工作表是否存在
        sheet_names = [s.name for s in wb.sheets]
        if sheet_name not in sheet_names:
            wb.close()
            print(f"跳過:{file},不存在工作表:{sheet_name}")
            continue

        sht = wb.sheets[sheet_name]

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

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

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

        # 7. 后續(xù)只累積數據行
        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 = [["沒有讀取到任何有效數據"]]
    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()

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

5. 關鍵代碼拆解:為什么這樣寫

5.1 為什么要跳過臨時文件

Excel 打開文件時,目錄里可能出現 ~$ 開頭的臨時文件。這類文件不是正式工作簿,腳本如果嘗試打開它,很容易報錯。

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

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

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

并不是所有文件都一定有目標工作表。比如有些分部沒有提交 統(tǒng)計 表,或者表名寫成了 數據統(tǒng)計。如果不判斷直接讀取,就會報錯。

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

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

不要默認所有文件都符合模板。真實辦公里,文件命名、sheet 命名、字段順序經常會有偏差。腳本必須允許異常文件跳過,而不是因為一個文件異常導致整個任務中斷。

5.3 為什么用 expand(“table”)

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

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

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

5.4 為什么最后要 autofit()

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

out_sht.autofit()

推薦在生成結果文件時做基礎美化。辦公自動化不是只把數據寫進去,還要考慮別人打開文件時能不能直接看。

6. 效果驗證:匯總后必須檢查這幾項

批量合并腳本跑完后,不能只看控制臺有沒有報錯。更穩(wěn)的做法,是對輸出結果做基本校驗。

第一,要檢查輸出文件是否生成;第二,要檢查匯總表是否只有一行表頭;第三,要檢查數據行數是否符合預期;第四,要抽查幾條來源數據,看是否確實進入匯總表。

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

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

log_list = []

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

對于真實辦公場景,我更建議把處理日志也導出成 Excel。因為腳本輸出的結果文件可能會被別人復查,處理日志就是你的證據鏈。

7. 常見問題與踩坑提醒

7.1 表頭不一致會導致匯總結果變臟

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

合并前最好先校驗表頭是否一致。否則看起來合并成功,實際數據口徑可能已經錯了。

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

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

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

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

7.3 文件被打開可能導致保存異常

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

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

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

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

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

8. 舉一反三:一個工作簿內合并 1月 到 6月

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

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

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

import xlwings as xw

file_path = r"e:\file\年度數據.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"跳過:不存在工作表 {name}")
            continue

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

        if not table or len(table) < 2:
            print(f"跳過:{name} 數據為空或只有表頭")
            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 = [["沒有讀取到任何有效數據"]]
    else:
        sum_sht.range("A1").value = [header] + all_data
        sum_sht.autofit()

    wb.save()
    wb.close()

finally:
    app.quit()

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

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

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

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

真正可復用的腳本,不是只會在一次練習文件上跑通,而是能處理異常、能跳過無效文件、能輸出清晰結果。這才是辦公自動化和簡單代碼練習之間的區(qū)別。

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

以上就是Python批量合并多個Excel工作簿中同名工作表的詳細內容,更多關于Python合并多個Excel同名工作表的資料請關注腳本之家其它相關文章!

相關文章

  • Pandas提高數據分析效率的13個技巧匯總

    Pandas提高數據分析效率的13個技巧匯總

    這篇文章主要是為大家歸納整理了13個工作中常用到的pandas使用技巧,方便更高效地實現數據分析,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-05-05
  • 如何用python批量調整視頻聲音

    如何用python批量調整視頻聲音

    這篇文章主要介紹了如何用python批量調整視頻聲音,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Matplotlib 生成不同大小的subplots實例

    Matplotlib 生成不同大小的subplots實例

    今天小編就為大家分享一篇Matplotlib 生成不同大小的subplots實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python+PyQt5來實現文件高速查找

    Python+PyQt5來實現文件高速查找

    這篇文章主要為大家詳細介紹了如何模擬Everything,即通過python+PyQt5來實現可視化文件的高速查找,文中的示例代碼講解詳細,需要的可以參考一下
    2023-07-07
  • 6行Python代碼實現進度條效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI庫)

    6行Python代碼實現進度條效果(Progress、tqdm、alive-progress​​

    這篇文章主要介紹了6行Python代碼實現進度條效果(Progress、tqdm、alive-progress和PySimpleGUI庫),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Pytorch限制或增加CPU使用的核數方式

    Pytorch限制或增加CPU使用的核數方式

    這篇文章主要介紹了Pytorch限制或增加CPU使用的核數方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 三個Python自動化辦公好用到爆的模塊分享

    三個Python自動化辦公好用到爆的模塊分享

    本文小編來給大家推薦幾個在自動化辦公領域當中非常好用的Python模塊,可以幫助大家在工作當中及大地提高效率,避免重復機械化地操作流程
    2022-07-07
  • Python中特殊函數集錦

    Python中特殊函數集錦

    這篇文章主要介紹了Python中特殊函數,主要介紹一下四個函數:1 過濾函數filter 2 映射和歸并函數map/reduce 3 裝飾器@ 4 匿名函數lamda,需要的朋友可以參考下
    2015-07-07
  • python用win32gui遍歷窗口并設置窗口位置的方法

    python用win32gui遍歷窗口并設置窗口位置的方法

    今天小編就為大家分享一篇python用win32gui遍歷窗口并設置窗口位置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python ftfy庫處理金融方面文件編碼錯誤實例詳解

    python ftfy庫處理金融方面文件編碼錯誤實例詳解

    這篇文章主要為大家介紹了使用python ftfy庫處理金融方面文件編碼錯誤實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論

常州市| 天门市| 潍坊市| 芜湖市| 翁牛特旗| 静海县| 珠海市| 临安市| 恩施市| 高台县| 宁波市| 当阳市| 定州市| 双辽市| 闵行区| 临安市| 平昌县| 天水市| 嫩江县| 海盐县| 宕昌县| 盐津县| 南宫市| 额尔古纳市| 专栏| 建平县| 嵊泗县| 漳浦县| 蒲江县| 平原县| 凤山市| 四川省| 高邑县| 通海县| 石家庄市| 隆子县| 江山市| 监利县| 辽中县| 缙云县| 南城县|