開發 Excel 增益集或自動化方案,繞不開龐大的 Excel 物件模型。官方統計超過 270 個物件、5000 多個屬性與方法,但實務上只需精通核心四大類別——Application、Workbook、Worksheet、Range——即能應對 90% 的開發場景。本文梳理物件階層結構,並針對高頻屬性、方法、事件給出實戰程式碼片段,助你快速定位所需 API。
Excel 物件模型完整映射 UI 階層:
ActiveWorkbook。ActiveSheet 處於編輯狀態。
批次寫入大量資料時,關閉畫面更新可大幅提升速度:
bool old = Application.ScreenUpdating;
try {
Application.ScreenUpdating = false;
// 大量填充儲存格...
} finally {
Application.ScreenUpdating = old;
}
ActiveCell、ActiveSheet、ActiveWindow、SelectionWorkbooks、Sheets、Charts 集合WorksheetFunction:呼叫 Excel 內建函數(如 Min、VLookup)Names:名稱管理器,便於參考固定區域// 建立新活頁簿
Workbook wb = Application.Workbooks.Add(Type.Missing);
// 開啟現有檔案
Workbook wbOpen = Application.Workbooks.Open(
@"C:\Path\File.xlsx", Type.Missing, Type.Missing, ...);
// 取得指定活頁簿(注意副檔名)
Workbook wbFind = Application.Workbooks["Book1"]; // 未儲存
Workbook wbFind = Application.Workbooks["Book1.xlsx"]; // 已儲存
Application 層級事件對所有活頁簿生效:SheetChange、WorkbookBeforeSave、WorkbookOpen、WindowActivate 等。若僅針對特定活頁簿,請改用 Workbook 物件的對應事件。
| 屬性/方法 | 用途 |
|---|---|
Name/FullName/Path | 取得檔案名稱、完整路徑、資料夾 |
Saved | 標記是否已儲存,避免關閉時彈出提示 |
Protect/Unprotect | 保護結構/視窗,防止使用者移動工作表 |
SaveAs | 另存新檔,可指定格式(XlFileFormat)、存取模式 |
SaveCopyAs | 備份副本,不影響目前開啟的活頁簿 |
BuiltInDocumentProperties/CustomDocumentProperties | 讀寫內建/自訂文件屬性,適合儲存中繼資料 |
Styles | 建立/套用命名樣式,統一格式化 |
注意:不存在獨立的 Sheet 類別,Sheets 集合元素可能是 Worksheet 或 Chart。
ws.Protect("pwd", Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing);
// 僅允許排序,其餘操作需解除保護
Range rng = ws.get_Range("A1");
if (rng.Comment != null) rng.Comment.Delete();
rng.AddComment("建立時間:" + DateTime.Now);
// 顯示/隱藏所有批註
foreach (Comment c in ws.Comments) c.Visible = true;
ws.Copy(Type.Missing, wb.Sheets[3]); // 複製到第 3 張之後
ws.Move(Type.Missing, wb.Sheets[wb.Sheets.Count]); // 移至最後
ws.PrintOut(1, 1, 2, true); // 列印第 1 頁、2 份、預覽
Range 可代表單一儲存格、矩形區域、整列/行、不連續區域(Union)或交集(Intersect)。
// 1. A1 參考
Range r = ws.get_Range("A1", "C5");
// 2. Cells 索引(列、行)
Range r = (Range)ws.Cells[1, 1];
// 3. 名稱管理器
Range r = Application.get_Range("MyNamedRange");
// 4. 整列/整行
Range r = (Range)ws.Rows["1:3"];
Range r = (Range)ws.Columns[3];
// 5. 偏移
Range r = baseRange.get_Offset(2, 1); // 向下 2 列、向右 1 行
// 6. 邊界擴展
Range r = baseRange.get_End(XlDirection.xlDown); // 向下延伸至資料區邊緣
// 自動填充(日期、數列、格式)
rng.AutoFill(targetRange, XlAutoFillType.xlFillMonths);
// 查找
Range found = rng.Find("關鍵字", Type.Missing, XlFindLookIn.xlValues,
XlLookAt.xlPart, XlSearchOrder.xlByRows, XlSearchDirection.xlNext, false);
// 排序
rng.Sort(rng.Columns[1], XlSortOrder.xlAscending,
rng.Columns[2], Type.Missing, XlSortOrder.xlAscending,
Type.Missing, XlSortOrder.xlAscending, XlYesNoGuess.xlNo,
Type.Missing, Type.Missing, XlSortOrientation.xlSortColumns,
XlSortMethod.xlPinYin, XlSortDataOption.xlSortNormal,
XlSortDataOption.xlSortNormal, XlSortDataOption.xlSortNormal);
// 避免使用 Select/Selection,改直接操作 Range 物件,效能更好且不干擾使用者選取
rng.ClearContents(); // 優於 Selection.ClearContents()
掌握 Application、Workbook、Worksheet、Range 四大核心物件及其高頻成員,即可從容應對 Excel 開發大多數需求。完整物件模型請參考 MSDN 文件,下一篇將介紹 Excel 開發另一大核心——自訂函數 (UDF) 開發。