Python實現(xiàn)一鍵合并N個Excel工作表/文件
數(shù)據(jù)散落在不同Excel,手動整合耗時又易錯!
在日常工作中,你是不是經常遇到這樣的場景?
每個月,銷售部門會給你發(fā)一份Excel報表,每個月的文件名都不同。你需要把過去12個月的數(shù)據(jù)合并到一張總表里。
公司不同業(yè)務線的數(shù)據(jù)分散在幾十個Excel文件或不同的工作表里,但它們之間又有關聯(lián)(比如都包含“客戶ID”)。你需要把它們聯(lián)接起來,進行全面分析。
手動打開、復制、粘貼……這個過程不僅耗時耗力,還極易出錯,一個Ctrl+C/V的失誤,就可能導致整個報表前功盡棄!

我們將手把手教你如何利用數(shù)據(jù)處理的andas庫,輕松實現(xiàn):
秒速合并: 將多個Excel工作表或文件按行堆疊,瞬間整合海量數(shù)據(jù)。
精準聯(lián)接: 像拼圖一樣,根據(jù)共同的列,精確匹配和聯(lián)接不同表格的數(shù)據(jù)。
最終,你將擁有一個強大的 Excel萬能數(shù)據(jù)整合器,讓你的數(shù)據(jù)處理和數(shù)據(jù)分析 工作效率翻倍!
1.Pandas核心:表格數(shù)據(jù)處理的瑞士軍刀入門
要實現(xiàn)高效的Python合并Excel和Excel多表整合,我們離不開Python數(shù)據(jù)處理的明星庫——Pandas。它以其強大的DataFrame結構,成為處理表格數(shù)據(jù)的行業(yè)標準,堪稱數(shù)據(jù)處理領域的“瑞士軍刀”!
安裝Pandas:
pip install pandas openpyxl # openpyxl用于Pandas讀寫xlsx文件
1.1 安裝與核心組件:DataFrame,你的數(shù)據(jù)“容器”
在深入合并之前,我們先了解Pandas最核心的概念:
DataFrame: 你可以把它想象成一個加強版的Excel表格。它有行和列,每一列都有名字,每一行也有索引。但它比Excel更強大、更靈活,更適合用代碼進行高效操作。
Series: DataFrame中的一列,可以看作一個帶索引的列表。
1.2 讀取Excel數(shù)據(jù):Pandas讓數(shù)據(jù)“活”起來
場景: 你需要將Excel表格中的數(shù)據(jù),導入到Python程序中進行處理。
作用: Pandas可以非常方便地讀取Excel文件,將其內容轉換為DataFrame對象,讓數(shù)據(jù)在Python中“活”起來,為數(shù)據(jù)自動化處理奠定基礎。
代碼:
import pandas as pd
import os
def read_excel_to_dataframe(file_path):
"""
使用Pandas讀取Excel文件,轉換為DataFrame。
這是Python數(shù)據(jù)分析入門和Excel自動化處理的基礎。
:param file_path: Excel文件路徑
:return: 讀取到的DataFrame對象
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path) # 核心代碼:一行命令讀取Excel
print(f"? 成功讀取Excel文件:'{os.path.basename(file_path)}'")
print(" --- DataFrame頭部數(shù)據(jù)(前5行):---")
print(df.head()) # 打印DataFrame的前5行
print("\n --- DataFrame信息概覽:---")
print(df.info()) # 打印DataFrame的概要信息(列名、非空值數(shù)量、數(shù)據(jù)類型)
return df
except Exception as e:
print(f"? 讀取Excel失?。簕e}")
return None
if __name__ == "__main__":
# 準備一個測試Excel文件,例如 'products.xlsx'
# 內容可以簡單一點,如:
# ProductID | ProductName | Category
# 001 | Laptop | Electronics
# 002 | Mouse | Accessories
test_excel_path = os.path.expanduser("~/Desktop/products.xlsx")
os.makedirs(os.path.dirname(test_excel_path), exist_ok=True)
# 確保有測試Excel文件存在
if not os.path.exists(test_excel_path):
# 簡單創(chuàng)建測試文件(實際用戶需手動創(chuàng)建)
pd.DataFrame({'ProductID': ['001', '002'],
'ProductName': ['Laptop', 'Mouse'],
'Category': ['Electronics', 'Accessories']}).to_excel(test_excel_path, index=False)
print(f"臨時測試文件 '{os.path.basename(test_excel_path)}' 已創(chuàng)建。")
df_products = read_excel_to_dataframe(test_excel_path)
if df_products is not None:
print("\nDataFrame讀取成功,你可以開始你的數(shù)據(jù)自動化處理了!")
步驟:
準備Excel文件: 在桌面創(chuàng)建一個名為products.xlsx的Excel文件,輸入一些簡單的數(shù)據(jù)(如產品ID、名稱、類別)。
修改代碼路徑: 復制上方代碼到VS Code,保存為pandas_excel_read.py。修改 test_excel_path。
運行: 在VS Code終端運行 python pandas_excel_read.py。
效果:

1.3 基礎數(shù)據(jù)查看:快速預覽,心中有數(shù)
一旦數(shù)據(jù)加載到DataFrame,Pandas提供了多種方法讓你快速預覽數(shù)據(jù)結構和內容。
- df.head():查看前N行(默認5行)。
- df.tail():查看后N行。
- df.info():查看列名、非空值數(shù)量、數(shù)據(jù)類型、內存占用等。
- df.describe():對數(shù)值列進行統(tǒng)計描述(均值、標準差等)。
- df.columns:查看所有列名。
這是你進行任何數(shù)據(jù)自動化處理前,快速了解數(shù)據(jù)的“體檢報告”!
表格:Pandas DataFrame常用查看方法
| 方法 | 作用 | 示例代碼 |
|---|---|---|
| df.head() | 查看前5行數(shù)據(jù) | df.head() |
| df.info() | 查看數(shù)據(jù)框概要信息(列名、類型、非空計數(shù)) | df.info() |
| df.describe() | 數(shù)值列統(tǒng)計描述(均值、最大值等) | df.describe() |
| df.shape | 獲取數(shù)據(jù)框的行數(shù)和列數(shù) | df.shape |
| 圖注:Pandas DataFrame常用查看方法一覽,快速了解你的數(shù)據(jù)! |
2.秒速合并:pd.concat合并多個工作表/文件
場景: 你每月都會收到一份銷售數(shù)據(jù)Excel,或者一個Excel文件里分了Q1、Q2、Q3、Q4四個工作表?,F(xiàn)在你需要把這些數(shù)據(jù)全部堆疊到一張大表里,進行年終總計。手動復制粘貼?太慢了!
方案: pd.concat()函數(shù)是Pandas中實現(xiàn)Python合并Excel、進行數(shù)據(jù)自動化處理的利器,它能將多個結構相似的DataFrame按行(或列)“堆疊”起來,實現(xiàn)Excel多表整合的秒速合并!
作用: pd.concat()像膠水一樣,將多個DataFrame簡單地拼接在一起。
2.1 按行堆疊:多個結構相同表格的簡單合并
代碼:
import pandas as pd
import os
def merge_excel_rows_concat(file_paths, output_file_path):
"""
使用pd.concat按行合并多個Excel文件或工作表。
這是Python合并Excel的基礎,適合結構相同的表格堆疊。
:param file_paths: 包含要合并的Excel文件路徑列表
:param output_file_path: 合并后Excel文件的輸出路徑
"""
all_dfs = []
print("?? 正在讀取并準備合并文件...")
for f_path in file_paths:
if os.path.exists(f_path):
df = pd.read_excel(f_path)
all_dfs.append(df)
print(f" ? 已讀取:{os.path.basename(f_path)}")
else:
print(f"? 文件不存在,跳過:{os.path.basename(f_path)}")
if not all_dfs:
print("?? 沒有找到任何文件可供合并。")
return
# **核心操作:pd.concat按行合并DataFrame**
# axis=0 表示按行合并(默認值),ignore_index=True 重新生成索引
merged_df = pd.concat(all_dfs, ignore_index=True)
os.makedirs(os.path.dirname(output_file_path), exist_ok=True)
merged_df.to_excel(output_file_path, index=False) # 保存合并后的DataFrame到Excel
print(f"? 成功合并 {len(all_dfs)} 個文件到:'{os.path.basename(output_file_path)}'")
print(" --- 合并后數(shù)據(jù)頭部 ---")
print(merged_df.head())
print(f" 總行數(shù):{len(merged_df)}")
if __name__ == "__main__":
# 準備測試數(shù)據(jù):創(chuàng)建兩個或更多結構相同的Excel文件
# 例如:
# sales_q1.xlsx (Product, Sales)
# sales_q2.xlsx (Product, Sales)
q1_path = os.path.expanduser("~/Desktop/sales_q1.xlsx")
q2_path = os.path.expanduser("~/Desktop/sales_q2.xlsx")
output_merged_path = os.path.expanduser("~/Desktop/annual_sales_report.xlsx")
# 簡單創(chuàng)建測試文件
pd.DataFrame({'Product': ['Laptop', 'Mouse'], 'Sales': [100, 150]}).to_excel(q1_path, index=False)
pd.DataFrame({'Product': ['Monitor', 'Keyboard'], 'Sales': [200, 120]}).to_excel(q2_path, index=False)
file_list = [q1_path, q2_path]
merge_excel_rows_concat(file_list, output_merged_path)
步驟:
準備Excel文件: 在桌面創(chuàng)建sales_q1.xlsx和sales_q2.xlsx,確保它們的列結構相同。
修改代碼路徑: 修改 file_list 和 output_merged_path。
運行: 運行 python merge_concat.py。
展示:

2.2 批量合并:一鍵整合文件夾下所有Excel文件
如果一個文件夾里有幾十個Excel文件,逐個指定路徑就太麻煩了!Python合并Excel的威力在于批量處理。
場景: 你需要將某個文件夾(如“每月銷售數(shù)據(jù)”)下所有Excel文件(如202301.xlsx, 202302.xlsx…)全部合并到一個總表。
方案: 結合os模塊遍歷文件夾,pd.read_excel()讀取,pd.concat()合并,輕松實現(xiàn)Excel多表整合的自動化。
代碼:
import pandas as pd
import os
def merge_all_excels_in_folder(folder_path, output_file_name="merged_all_data.xlsx"):
"""
一鍵合并指定文件夾下所有Excel文件。
這是高效的Python合并Excel和數(shù)據(jù)自動化處理腳本。
:param folder_path: 包含Excel文件的文件夾路徑
:param output_file_name: 合并后Excel文件的名稱
"""
if not os.path.exists(folder_path): return print(f"? 文件夾不存在:{folder_path}")
all_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith(('.xls', '.xlsx'))]
if not all_files: return print(f"?? 文件夾 '{folder_path}' 中沒有找到Excel文件。")
all_dfs = []
print(f"?? 正在合并文件夾 '{folder_path}' 下的所有Excel文件...")
for f_path in all_files:
try:
df = pd.read_excel(f_path)
all_dfs.append(df)
print(f" ? 已讀?。簕os.path.basename(f_path)}")
except Exception as e:
print(f"? 讀取文件 '{os.path.basename(f_path)}' 失敗:{e}。跳過。")
if not all_dfs: return print("?? 沒有成功讀取任何Excel文件。")
merged_df = pd.concat(all_dfs, ignore_index=True)
output_path = os.path.join(os.path.dirname(folder_path), output_file_name)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
merged_df.to_excel(output_path, index=False)
print(f"? 成功合并所有Excel文件到:'{os.path.basename(output_path)}'")
print(f" 總行數(shù):{len(merged_df)}")
if __name__ == "__main__":
# 準備測試數(shù)據(jù):在桌面創(chuàng)建 'MonthlySales' 文件夾,并在其中放入多個Excel文件
# 例如:
# MonthlySales/Jan_2023.xlsx (Product, Sales)
# MonthlySales/Feb_2023.xlsx (Product, Sales)
input_folder = os.path.expanduser("~/Desktop/MonthlySales")
os.makedirs(input_folder, exist_ok=True)
# 示例創(chuàng)建文件
# pd.DataFrame({'Product': ['A'], 'Sales': [10]}).to_excel(os.path.join(input_folder, 'Jan_2023.xlsx'), index=False)
# pd.DataFrame({'Product': ['B'], 'Sales': [20]}).to_excel(os.path.join(input_folder, 'Feb_2023.xlsx'), index=False)
merge_all_excels_in_folder(input_folder, "YearlySalesSummary.xlsx")
步驟:
準備Excel文件: 在桌面創(chuàng)建一個名為MonthlySales的文件夾,放入多個列結構相同的Excel文件。
修改代碼路徑: 修改 input_folder。
運行: 運行 python merge_all_excels.py。
效果展示:

3.精準聯(lián)接:pd.merge實現(xiàn)多表聯(lián)立查詢與數(shù)據(jù)匹配
pd.concat()適用于簡單堆疊,但當你的數(shù)據(jù)分散在不同Excel文件,且這些文件之間存在某種“關聯(lián)”(如客戶ID、訂單號),你需要將它們“拼圖”一樣組合起來,這時就需要pd.merge(),它能實現(xiàn)Excel多表整合中的精準聯(lián)接,是Python數(shù)據(jù)分析入門的必備技能!
作用: pd.merge()類似于SQL數(shù)據(jù)庫中的JOIN操作,根據(jù)一個或多個共同的列,將兩個DataFrame的數(shù)據(jù)進行匹配和組合。
3.1 核心講解:像拼圖一樣匹配數(shù)據(jù)
場景: 你有一個“客戶信息表”(客戶ID、姓名、地址),另一個是“客戶訂單表”(客戶ID、訂單號、商品)。你希望將這兩張表通過“客戶ID”關聯(lián)起來,生成一份包含客戶姓名和其對應訂單的完整列表。
方案: pd.merge()的內連接(inner join)模式,只會保留兩個表中共同存在的匹配項。
代碼:
import pandas as pd
import os
def inner_merge_example(customers_path, orders_path, output_path):
"""
使用pd.merge進行內連接,根據(jù)共同列匹配數(shù)據(jù)。
這是Python合并Excel,實現(xiàn)精準數(shù)據(jù)匹配的核心。
:param customers_path: 客戶信息Excel文件路徑
:param orders_path: 客戶訂單Excel文件路徑
:param output_path: 合并后輸出Excel文件路徑
"""
if not (os.path.exists(customers_path) and os.path.exists(orders_path)):
print(f"? 缺少一個或多個源文件。")
return
try:
df_customers = pd.read_excel(customers_path)
df_orders = pd.read_excel(orders_path)
print("?? 正在執(zhí)行內連接:")
print(" --- 客戶信息表 ---")
print(df_customers.head())
print("\n --- 客戶訂單表 ---")
print(df_orders.head())
# **核心操作:pd.merge 內連接**
# on='CustomerID' 表示根據(jù) CustomerID 列進行匹配
merged_df = pd.merge(df_customers, df_orders, on='CustomerID', how='inner')
os.makedirs(os.path.dirname(output_path), exist_ok=True)
merged_df.to_excel(output_path, index=False)
print(f"\n? 內連接成功!結果保存到:'{os.path.basename(output_path)}'")
print(" --- 合并后數(shù)據(jù)頭部 ---")
print(merged_df.head())
print(f" 總行數(shù):{len(merged_df)}")
except Exception as e:
print(f"? 內連接失?。簕e}")
if __name__ == "__main__":
# 準備測試數(shù)據(jù)
customers_file = os.path.expanduser("~/Desktop/customers.xlsx")
orders_file = os.path.expanduser("~/Desktop/orders.xlsx")
output_merged_file = os.path.expanduser("~/Desktop/customer_orders_inner.xlsx")
# 簡單創(chuàng)建測試文件
pd.DataFrame({'CustomerID': [1, 2, 3],
'Name': ['Alice', 'Bob', 'Charlie'],
'City': ['NY', 'LA', 'SF']}).to_excel(customers_file, index=False)
pd.DataFrame({'OrderID': ['A001', 'A002', 'A003'],
'CustomerID': [1, 2, 4], # 注意:CustomerID 4 不在客戶表中
'Amount': [100, 150, 200]}).to_excel(orders_file, index=False)
inner_merge_example(customers_file, orders_file, output_merged_file)
步驟:
準備Excel文件: 在桌面創(chuàng)建customers.xlsx和orders.xlsx,確保有共同列CustomerID。
修改代碼路徑: 修改 customers_file, orders_file, output_merged_file。
運行: 運行 python merge_inner.py。
效果:

3.2 深度應用:左右連接,數(shù)據(jù)匹配更靈活
除了內連接,pd.merge()還支持外連接(outer join)、左連接(left join)和右連接(right join),讓你在數(shù)據(jù)自動化處理中,無論數(shù)據(jù)缺失與否,都能靈活組合!
左連接 (Left Join): 以左邊表(df_customers)為基準,保留左表所有行,并嘗試匹配右表數(shù)據(jù)。如果右表沒有匹配項,則顯示NaN(Not a Number)。
右連接 (Right Join): 與左連接相反,以右邊表(df_orders)為基準。
外連接 (Outer Join): 包含所有表中所有的行,無論它們是否匹配。
代碼:
import pandas as pd
import os
def flexible_merge_example(customers_path, orders_path, output_prefix="merged_data"):
"""
使用pd.merge進行左連接、右連接和外連接,實現(xiàn)更靈活的數(shù)據(jù)匹配。
:param customers_path: 客戶信息Excel文件路徑
:param orders_path: 客戶訂單Excel文件路徑
:param output_prefix: 輸出文件名前綴
"""
if not (os.path.exists(customers_path) and os.path.exists(orders_path)):
print(f"? 缺少一個或多個源文件。")
return
try:
df_customers = pd.read_excel(customers_path)
df_orders = pd.read_excel(orders_path)
# 左連接 (Left Join)
left_merged_df = pd.merge(df_customers, df_orders, on='CustomerID', how='left')
left_output_path = os.path.expanduser(f"~/Desktop/{output_prefix}_left.xlsx")
left_merged_df.to_excel(left_output_path, index=False)
print(f"\n? 左連接成功!結果保存到:'{os.path.basename(left_output_path)}'")
print(left_merged_df.head())
# 右連接 (Right Join)
right_merged_df = pd.merge(df_customers, df_orders, on='CustomerID', how='right')
right_output_path = os.path.expanduser(f"~/Desktop/{output_prefix}_right.xlsx")
right_merged_df.to_excel(right_output_path, index=False)
print(f"\n? 右連接成功!結果保存到:'{os.path.basename(right_output_path)}'")
print(right_merged_df.head())
# 外連接 (Outer Join)
outer_merged_df = pd.merge(df_customers, df_orders, on='CustomerID', how='outer')
outer_output_path = os.path.expanduser(f"~/Desktop/{output_prefix}_outer.xlsx")
outer_merged_df.to_excel(outer_output_path, index=False)
print(f"\n? 外連接成功!結果保存到:'{os.path.basename(outer_output_path)}'")
print(outer_merged_df.head())
except Exception as e:
print(f"? 靈活連接失?。簕e}")
if __name__ == "__main__":
customers_file = os.path.expanduser("~/Desktop/customers.xlsx")
orders_file = os.path.expanduser("~/Desktop/orders.xlsx")
# 確保測試文件存在,且包含非匹配的 CustomerID 以便演示 Left/Right/Outer Join
# (與3.1節(jié)創(chuàng)建的文件類似,但需要確保有非匹配項)
flexible_merge_example(customers_file, orders_file, "customer_orders")
步驟:
準備Excel文件: 使用與3.1節(jié)相同或類似的數(shù)據(jù),但確保CustomerID有不匹配的情況,以演示NaN值。
修改代碼路徑: 修改 customers_file, orders_file。
運行: 運行 python merge_flexible.py。
展示:

4.階段性總結:你的“Excel萬能數(shù)據(jù)整合器”!
恭喜你!通過本篇文章,你已經掌握了Python合并Excel的精髓,親手打造了一個能夠秒合并N個Excel工作表/文件的**“Excel萬能數(shù)據(jù)整合器”**!
我們深入學習了Pandas庫,它堪稱表格數(shù)據(jù)處理的瑞士軍刀,實現(xiàn)了:
數(shù)據(jù)讀?。?輕松將Excel數(shù)據(jù)導入Python DataFrame。
秒速合并 (pd.concat): 無論是幾個Excel文件,還是一個文件夾下所有的Excel文件,都能一鍵按行堆疊,實現(xiàn)Excel多表整合。
精準聯(lián)接 (pd.merge): 像數(shù)據(jù)庫查詢一樣,根據(jù)共同的列,實現(xiàn)精確的數(shù)據(jù)匹配(內連接、左連接、右連接),解決數(shù)據(jù)散落在不同Excel的痛點。
5.后話:數(shù)據(jù)大融合,開啟智能數(shù)據(jù)分析新篇章!
通過本篇文章,你已經掌握了Python合并Excel的強大能力,為你的辦公自動化之旅又增添了一個重量級技能!你學會了如何利用Pandas這個Python實用工具,高效地進行Excel的數(shù)據(jù)合并與聯(lián)接
到此這篇關于Python實現(xiàn)一鍵合并N個Excel工作表/文件的文章就介紹到這了,更多相關Python合并Excel內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python用selenium打開瀏覽器后秒關閉瀏覽器的解決辦法
最近朋友在學Selenium的時候遇到一個問題,當執(zhí)行完selenium程序后,瀏覽器會閃退也就是自動關閉,這篇文章主要給大家介紹了關于python用selenium打開瀏覽器后秒關閉瀏覽器的解決辦法,需要的朋友可以參考下2023-07-07
深入探究Python如何實現(xiàn)100個并發(fā)請求
在Web開發(fā)和數(shù)據(jù)抓取等領域,并發(fā)請求是提高效率和性能的重要手段,本文將深入探討如何使用Python實現(xiàn)100個并發(fā)請求,感興趣的小伙伴可以了解下2025-02-02
Face++ API實現(xiàn)手勢識別系統(tǒng)設計
這篇文章主要為大家詳細介紹了Face++ API實現(xiàn)手勢識別系統(tǒng)設計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11
Python3+OpenCV實現(xiàn)簡單交通標志識別流程分析
這篇文章主要介紹了Python3+OpenCV實現(xiàn)簡單交通標志識別,主要思路是解析XML文檔,根據(jù)<name>標簽進行分類,如果是直行、右轉、左轉、停止就把它從原圖中裁剪下來并重命名,感謝的朋友跟隨小編一起看看示例代碼2021-12-12
python實現(xiàn)截取屏幕保存文件,刪除N天前截圖的例子
今天小編就為大家分享一篇python實現(xiàn)截取屏幕保存文件,刪除N天前截圖的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08

