# 純 Excel 公式法與 Python 解法比較分析

## 分析目的

本報告比較兩種處理員工出勤工時計算問題的方法：

1. 純 Excel 公式法
2. Python 自動化解法

比較重點包含實作方式、建置成本、是否能不靠程式自動完成，以及在面對類似但不完全相同的隨機輸入 Excel 檔時，各自的適用性。

## 一、純 Excel 公式法

純 Excel 公式法適合用來教學、示範與人工稽核。它的最大優點是計算邏輯直接留在活頁簿中，使用者可以一格一格檢查公式，理解每個欄位如何從原始資料推導出結果。

在目前這個出勤資料問題中，純 Excel 解法通常會建立一張 `計算明細` 工作表，逐列引用原始 `員工出勤明細表`，再用公式處理以下任務：

- 找出目前列屬於哪一位員工。
- 判斷某一列是不是有效日期列。
- 解析文字日期，例如 `2026/06/08`。
- 從 `遲到08:25`、`早退15:39`、`病假12:23` 這類文字中抓出最後的時間。
- 排除星期六、星期日。
- 將下班時間限制在 `19:30`。
- 同一位員工同一天只計算一次工作天數。
- 同一天多筆有效出勤紀錄仍可加總工作時數。
- 將員工編號與姓名馬賽克。
- 在 `算工作數` 彙整每位員工每月的工作天數與工作總時數。

## 二、純 Excel 公式法的實作成本

純 Excel 公式法的實作成本屬於中高。

表面上看，這個問題只是計算工作天數與總時數；但實際資料並不是乾淨的一張表，而是區段式報表：

- 員工資料列與出勤資料列混在同一張工作表。
- 每位員工都有自己的區段標題。
- 每個區段會重複欄位標題。
- 日期可能是文字，不一定是 Excel 日期格式。
- 上班、下班欄位可能混有文字註記。
- 同一位員工同一天可能有多筆出勤紀錄。
- 成果中還需要隱藏真實員工姓名與編號。

因此，純 Excel 公式不能只靠簡單的 `SUMIFS` 或 `COUNTIFS` 完成。它需要多個輔助欄位，例如來源列、員工、日期、解析後上班時間、解析後下班時間、計算下班、工作時數、工作日鍵、每日計數、月份、馬賽克員工名稱等。

這些公式一旦完成後很容易稽核，但第一次建立時需要仔細處理欄位參照、日期格式、文字時間解析與填滿範圍。對一般使用者而言，維護成本也不低。

## 三、純 Excel 能否不靠 Script 自動完成

如果目標是處理固定格式的活頁簿，純 Excel 可以做到半自動。

可行做法是建立一份固定模板：

1. 使用者把原始出勤資料貼入或匯入指定工作表。
2. `計算明細` 事先放好公式。
3. `算工作數` 事先放好彙總公式。
4. 使用者重新計算活頁簿後得到結果。

但是，若輸入檔是「類似但不完全相同」的隨機 Excel，例如工作表名稱不同、欄位順序不同、列數不同、日期格式不同、員工標題格式略有差異，純 Excel 模板就會變得脆弱。

Excel 公式可以寫得很複雜，也可以用動態陣列公式改善自動化程度，但它不適合扮演通用解析器。它比較適合固定格式、人工可檢查的情境。

因此，純 Excel 公式法的合理定位是：

- 適合教學。
- 適合讓非程式背景使用者理解計算過程。
- 適合單一已知格式的活頁簿。
- 適合需要在 Excel 內部完整稽核公式的場景。

不適合：

- 大量批次處理。
- 隨機格式輸入。
- 欄位自動偵測。
- 長期自動化流程。
- 希望完全免人工設定的場景。

## 四、Python 解法

Python 解法比較適合作為正式自動化工具。它把 Excel 活頁簿視為輸入資料，透過程式解析員工區段、日期列、上下班時間與欄位位置，再輸出整理後的結果活頁簿。

目前的 Python 解法可以處理以下情況：

- 自動偵測出勤明細工作表。
- 解析員工區段標題，例如 `員工代號:00337  吳宗恩`。
- 支援文字日期與 Excel 日期儲存格。
- 支援文字時間與 Excel 時間儲存格。
- 支援 `遲到08:25`、`早退15:39`、`病假12:23` 這類文字加時間格式。
- 可在欄位標題可辨識時支援欄位順序調整。
- 排除六日。
- 套用下班時間上限，預設為 `19:30`。
- 同一位員工同一天只計算一次工作天數。
- 同一天多筆有效紀錄可加總工時。
- 輸出時自動馬賽克員工姓名與編號。

Python 解法會產生新的輸出活頁簿，不會覆蓋原始資料。輸出通常包含：

- `算工作數`：每位員工每月彙總結果。
- `計算明細`：逐筆解析與計算紀錄。
- `處理說明`：來源檔案、來源工作表、計算規則與時間上限。

## 五、Python 解法的實作成本

Python 解法的初期實作成本比單次 Excel 操作高，因為需要寫程式處理各種資料邊界條件。

需要處理的細節包括：

- 如何辨識正確工作表。
- 如何辨識員工標題列。
- 如何辨識欄位標題。
- 如何解析文字日期與 Excel 日期。
- 如何解析文字時間與 Excel 時間。
- 如何處理缺漏資料。
- 如何避免同日重複計算工作天。
- 如何保護員工資料隱私。
- 如何產生可讀、可交付的輸出活頁簿。

不過，一旦程式完成，後續每處理一份新檔案的成本就很低。使用者只要執行一次指令，即可得到新的計算結果。

這使 Python 解法更適合重複使用、批次處理與處理隨機但相似的輸入檔。

## 六、兩種方法比較

| 面向 | 純 Excel 公式法 | Python 解法 |
| --- | --- | --- |
| 主要用途 | 教學、稽核、手動解題 | 自動化、重複處理、泛用輸入 |
| 初期實作成本 | 中高 | 高 |
| 後續使用成本 | 中，需要維護模板與公式範圍 | 低，執行指令即可 |
| 是否容易理解 | 對 Excel 使用者較直觀 | 需要看程式或說明文件 |
| 是否容易稽核 | 高，公式在活頁簿內 | 中，結果可查，但邏輯在程式內 |
| 是否適合隨機輸入檔 | 低到中，取決於模板設計 | 高，可透過程式偵測與容錯 |
| 是否可完全不靠 Script 自動化 | 只能在固定模板中半自動 | 可以 |
| 是否適合批次處理 | 不適合 | 適合 |
| 隱私處理 | 可用公式達成，但容易漏掉輔助欄 | 可集中處理並統一輸出 |
| 維護風險 | 公式錯位、欄位變動、範圍不足 | 程式 bug、環境依賴 |

## 七、建議使用情境

如果目標是讓學生或使用者理解出勤工時計算邏輯，應使用純 Excel 公式法。它可以讓學習者看到每一個中間步驟，理解為什麼週末不算、為什麼 `20:36` 只算到 `19:30`，以及同一天多筆紀錄如何處理。

如果目標是實務上處理多份類似但不完全相同的 Excel 檔，應使用 Python 解法。它能把規則集中在程式中，降低人工貼公式、調整範圍與檢查欄位的時間。

比較務實的安排是同時保留兩種方法：

1. 純 Excel 公式法作為教學版與人工稽核參考。
2. Python 解法作為正式自動化處理流程。

這樣可以兼顧學習與實務效率。

## 八、結論

純 Excel 可以解這個問題，但比較像是「把一次性的複雜清理與計算流程放進活頁簿」。它的價值在於透明、可看、可教學。

Python 則是把同一套規則變成可重複執行的資料處理流程。它的價值在於穩定、可重用、可擴充，尤其適合處理隨機產生或來源不完全一致的類似出勤檔。

因此，若只看單一檔案，純 Excel 公式法已經足夠；若看長期使用與不同輸入檔的適應能力，Python 解法明顯更合適。
