連假回來,10 份 Excel 報表一次合併的實戰紀錄
連假回來,我發現累積了 10 天的報表需要處理。
問題很單純:
我該怎麼把 10 份格式完全相同的 Excel 報表,一次性抓到同一份 Excel 裡?於是,我決定和 AI 協作完成這件事。
第一回合:我給 AI 的原始 Prompt
我一開始是這樣描述需求的:
我現在手邊有 10 份檔案,每份檔案我想要找分頁叫做「OOO銀行資料」,
但每頁我想要找第九列開始的資料,把它們都貼在同一份 Excel 裡面, 他們的表頭都相同,可以幫我用 Jupyter Notebook 完成嗎?
Gemini 回答:「沒問題!」
它給了我一套用 pandas + glob + os 遍歷資料夾、讀取分頁、合併 DataFrame 的腳本,理論上,非常合理。
然後我就掉進無限錯誤迴圈.....
錯誤訊息長這樣:
❌ 處理 OOO銀行資料_20260213.xlsx 時仍發生錯誤: expected <class 'float'>
❌ 處理 OOO銀行資料_20260214.xlsx 時仍發生錯誤: expected <class 'float'>
❌ 處理 OOO銀行資料_20260215.xlsx 時仍發生錯誤: expected <class 'float'>
...
AI 告訴我:
openpyxl 無法正確解析這些報表的資料型態,導致卡在 float 錯誤裡。
於是它建議換引擎:pyxlsb。
再錯。
再換方法。
再錯。
我正式進入 「AI 很努力,但問題根本沒被解決」 的循環。
第 N 次錯誤後,我重新思考問題
我突然想到一件事:
把大象放進冰箱要幾個步驟?
我的任務其實是:
- 打開檔案
- 複製第二個工作表
- 貼到新的 Excel
而不是:
把 Excel 解析成完美 DataFrame 再進行數據結構轉換
我開始意識到——問題不是 AI 寫不出程式,問題是:我把「動作需求」錯誤轉換成了「資料分析需求」。
為什麼 pandas 一直出錯?
因為 pandas.read_excel() 的本質是:
👉 把 Excel 轉換成標準化的 DataFrame。
這意味著它會:
- 嘗試推斷欄位型別(float、datetime、int)
- 處理空白值
- 解讀隱藏格式
- 套用 Engine(openpyxl / calamine / pyxlsb)
但我的報表內部格式可能有:
- 空白儲存格
- 格式殘留
- 錯誤的數字標籤
- Excel 內部奇怪的 metadata
於是它一直報:
expected
<class 'float'>
我甚至嘗試:
dtype=str
關鍵轉折:不要「讀資料」,改成「操作 Excel」
我後來搜尋到一個工具: xlwings
這個工具的邏輯完全不同,它不是去解讀 Excel 的底層格式,而是直接呼叫電腦裡的 Excel 軟體,並來操控Excel!所以我開始測試:
import xlwings as xw
workbook = xw.Book()
Excel 視窗真的跳出一個全新的excel!ヽ(≧∀≦)ノ
那一刻我知道——這條路對了。
技術理解整理:三種不同層級的工具
1. pandas 是「圖書館 (Library)」沒錯
在程式世界裡,pandas 被稱為 Library,可以把它想像成一座「數據處理自動化圖書館」。這座圖書館不只藏書,它還提供一套標準化的作業流程(例如:怎麼借書、怎麼還書、怎麼把書裡面的資料填進表格)。
2. 核心任務:read_excel 出借工具的服務 (Function)
這是使用者走進圖書館最主要的目的,它的任務是:「把雜亂的原始檔案,轉化成整齊的圖書館標準格式(DataFrame)。」當我用python寫下:
read_excel()
其實是在下達一個複雜的綜合指令:
- 辨識格式:確認這是一本 .xlsx、.xls 還是 .xlsb 的書。
- 指派工人 (Engine):根據你的要求(或圖書館預設),指派 openpyxl / calamine / pyxlsb 去拆解書本。
- 數位化錄入:將資料轉為 DataFrame!把拆解出來的資料,一列一列、一欄一欄地填進 pandas 那張著名的「超級大表格 (DataFrame)」裡。
- 最終產出標準化資料型別:服務結束後,你手上就會拿到一份完全標準化、可以立刻進行加減乘除或繪圖的數據,而不需要再去管原始 Excel 長什麼樣子。
3. openpyxl、pyxlsb、Calamine 是「後勤轉檔機」
這些不是圖書館裡的普通工具,它們像是圖書館後勤室裡的「格式轉換引擎 (Engines)」,想像一下,Excel 檔案(.xlsx)就像是用一種加密方言寫成的古籍,圖書館員(pandas)看不懂。現在現在是圖書館後勤室有四位主要成員了:

3-2. 特別介紹:xlwings —— 遠端遙控機器手臂
為什麼說 xlwings 是機器手臂?
- 它的原理:其他的引擎(如 Calamine)是直接去解讀檔案的二進制代碼;而
xlwings則是打開電腦上裝的 Excel 程式,像有一隻隱形的雙手操作 Excel。 - 優勢:若使用的Excel 檔案裡有複雜的 VBA 巨集、特殊的公式,或者是那種需要「活生生」開著 Excel 才能抓到的數據,
xlwings就是唯一的救星。 - 缺點:因為它必須啟動整個 Excel 軟體,所以它是所有方法中最慢、最耗資源的。
4. 總結任務流程,改用 xlwings:
- 將所有檔案放入同一資料夾
- 用程式打開每一個檔案
- 複製第二個工作表
- 貼到新的合併檔案
- 存檔
沒有解析 DataFrame、沒有處理型別推斷、沒有 dtype 戰爭。
單純複製,任務完成!
實際解決的流程
(1) 先安裝xlwing
pip install xlwings
(2) 測試將資料試著跑跑看,打開一個新的excel檔案
#匯入 xlwings套件
import xlwings as wx
#讓 xlwings 開啟一個新的excel檔案
workbook = wx.Book()
(3)測試將資料試著跑跑看,打開一個既有的excel檔案
import xlwings as wx
import os
# 定義檔案
file_path = r'C:\Users\c\Downloads\CCP-0213-22\OOOO明細_20260222.xlsx'
# 檢查檔案是否存在 (預防路徑打錯報錯)
if os.path.exists(file_path):
# 打開指定的 Excel 檔案
workbook = wx.Book(file_path)
print("檔案已成功開啟!")
else:
print("找不到檔案,請檢查路徑或檔名是否正確。")
(4)將資料全部放到同一個檔案夾內,盡量以英文命名資料夾 (中文會有全形半形的問題)

(5)在VS code裡面使用下列的code
- 右上角 1 按下去是運算,但按下去之前記得游標移動到 2 要先ctrl + s 存檔案 (存成.py)
- 最後可以在 terminal 也就是3的地方看到有沒有在跑

import xlwings as xw
import os
# 1. 設定路徑
folder_path = r'C:\Users\cynthia.hsu\Downloads\CCP-0213-22'
output_name = "全部日報合併檔.xlsx"
output_path = os.path.join(folder_path, output_name)
# 取得資料夾內所有檔案清單,過濾出 .xlsx 且排除 ~$ 開頭的暫存檔
all_files = [f for f in os.listdir(folder_path)
if f.endswith('.xlsx') and not f.startswith('~$') and f != output_name]
print(f"預計處理 {len(all_files)} 個檔案...")
# 2. 啟動 Excel
app = xw.App(visible=False, add_book=False)
app.display_alerts = False
try:
# 建立一個新的空白活頁簿作為容器
combined_wb = app.books.add()
for file_name in all_files:
file_path = os.path.join(folder_path, file_name)
print(f"正在提取: {file_name} ...")
try:
# 開啟原始檔
source_wb = app.books.open(file_path)
# 檢查是否有第二個工作表 (索引 1)
if len(source_wb.sheets) >= 2:
source_sheet = source_wb.sheets[1]
# 幫 Sheet 取個名字(取檔名的後 8 碼日期,避免重複)
new_name = file_name.replace(".xlsx", "")[-8:]
# 複製整張 Sheet 到新檔案的最前面
source_sheet.copy(before=combined_wb.sheets[0], name=f"明細_{new_name}")
print(f" --> ✅ 已成功加入 [明細_{new_name}]")
else:
print(f" --> ⚠️ 跳過:此檔案沒有第二個工作表")
source_wb.close()
except Exception as e:
print(f" --> ❌ 處理 {file_name} 時出錯: {e}")
# 3. 刪除新檔案建立時預設的 "Sheet1"
try:
if len(combined_wb.sheets) > 1:
combined_wb.sheets['Sheet1'].delete()
except:
pass
# 4. 儲存結果
combined_wb.save(output_path)
combined_wb.close()
print(f"\n--- 任務完成!共合併 {len(all_files)} 個檔案 ---")
print(f"儲存路徑: {output_path}")
except Exception as e:
print(f"發生嚴重錯誤: {e}")
finally:
app.quit()
這次我學到的「與 AI 協作」關鍵
❌ AI 不是問題拆解者
✅ 人類才是問題定義者
如果我把問題定義錯誤,AI 會非常努力地在錯誤方向優化,但卻永遠解不開問題,到不了終點....
當問題被定義錯誤,AI 只會在錯的方向上不斷優化....
看起來很努力,卻永遠到不了終點。
因為再強的模型,也救不了錯誤的框架,
工具只是放大器,人類才是方向盤。
與 AI 協作,真正重要的從來不是 Prompt 技巧,
而是——你是否看清楚問題的本質。
















