在日常辦公與數據分析中,Excel 文件(尤其是 .xlsx 格式)是信息交換的常見載體。Python 提供了多種處理 Excel 的工具,其中 openpyxlpandas 是最主流的選擇。它們各有側重:openpyxl 專注於原生操作 Excel 文件結構(如樣式、公式、多工作表),而 pandas 則擅長以數據框形式高效處理表格內容。本文將通過多工作表讀寫場景,對比兩者的使用方式與適用邊界。

1. 安裝依賴

pip install openpyxl pandas

⚠️ 注意:pandas 讀寫 Excel 需要 openpyxl.xlsx)或 xlrd(舊版 .xls)作為引擎。


2. 場景一:讀取多個工作表

使用 pandas(簡潔高效)

import pandas as pd

# 一次性讀取所有工作表為字典 {sheet_name: DataFrame}
all_sheets = pd.read_excel("report.xlsx", sheet_name=None)

# 訪問特定工作表
sales_df = all_sheets["銷售數據"]
inventory_df = all_sheets["庫存"]

print(sales_df.head())

✅ 優點:一行代碼加載全部,直接獲得結構化 DataFrame,便於後續分析。
❌ 缺點:無法獲取單元格樣式、合併區域、公式等元信息。

使用 openpyxl(精細控制)

from openpyxl import load_workbook

wb = load_workbook("report.xlsx")
print(wb.sheetnames)  # ['銷售數據', '庫存']

# 讀取“銷售數據”工作表
ws = wb["銷售數據"]
for row in ws.iter_rows(min_row=1, max_row=5, values_only=True):
    print(row)

✅ 優點:可訪問每個單元格的值、字體、顏色、註釋等完整屬性。
❌ 缺點:需手動解析為結構化數據,代碼更冗長。


3. 場景二:寫入多個工作表

使用 pandas(適合純數據輸出)

with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
    sales_df.to_excel(writer, sheet_name="銷售數據", index=False)
    inventory_df.to_excel(writer, sheet_name="庫存", index=False)

✅ 優點:自動將 DataFrame 寫入指定工作表,支持格式化(如日期、數字)。
❌ 缺點:無法設置單元格樣式(如加粗、背景色),且會覆蓋整個工作表。

使用 openpyxl(保留格式與佈局)

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill

wb = Workbook()
wb.remove(wb.active)  # 刪除默認Sheet

# 創建“銷售數據”工作表
ws1 = wb.create_sheet("銷售數據")
ws1.append(["產品", "銷售額"])
ws1.append(["A", 1000])
ws1["A1"].font = Font(bold=True)
ws1["A1"].fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")

# 創建“庫存”工作表
ws2 = wb.create_sheet("庫存")
ws2.append(["產品", "數量"])

wb.save("styled_output.xlsx")

✅ 優點:完全控制單元格樣式、合併單元格、圖表、公式等。
❌ 缺點:需逐行寫入,處理大數據時效率低於 pandas。


4. 關鍵對比總結

功能

pandas + openpyxl 引擎

openpyxl 原生

讀取為結構化數據

✅ 極簡(DataFrame)

❌ 需手動轉換

寫入 DataFrame

✅ 一行代碼

❌ 需循環遍歷

保留/設置單元格樣式

❌ 不支持

✅ 完全支持

操作公式、圖表、批註

❌ 僅讀取公式結果

✅ 可讀寫公式與對象

處理大型數據集

✅ 高效(向量化)

⚠️ 較慢(逐單元格操作)

多工作表管理

✅ 通過 ExcelWriter

✅ 通過 Workbook 對象


5. 實戰建議:如何選擇?

  • 選 pandas 當
  • 你只關心表格中的數值和文本數據
  • 需要快速進行統計、過濾、合併等分析操作
  • 輸出目標是“乾淨的數據表”,無需花哨格式。
  • 選 openpyxl 當
  • 需要保留或生成帶格式的報表(如公司模板);
  • 要操作公式、條件格式、圖表等 Excel 特有功能;
  • 處理非標準佈局(如標題跨多行、混合文本與表格)。

💡 混合使用技巧:先用 pandas 處理數據,再用 openpyxl 加載其輸出文件進行樣式美化:

# 1. 用 pandas 寫入數據
df.to_excel("temp.xlsx", index=False)

# 2. 用 openpyxl 加載並美化
from openpyxl import load_workbook
wb = load_workbook("temp.xlsx")
ws = wb.active
ws["A1"].font = Font(bold=True, color="FF0000")
wb.save("final_report.xlsx")

pandasopenpyxl 並非互斥,而是互補的工具。前者是數據分析的“瑞士軍刀”,後者是 Excel 自動化的“精密鑷子”。理解它們的邊界,能讓你在面對不同 Excel 任務時遊刃有餘——用 pandas 快速提煉信息,用 openpyxl 精雕細琢呈現。掌握這一組合,你就擁有了 Python 處理 Excel 的完整武器庫。