C# 提供可改善 Microsoft Office 程式設計的功能。 有助益的 C# 功能包括具名和選擇性引數以及類型為 dynamic 的傳回值。 在 COM 程式設計中,您可以省略 ref 關鍵字並存取索引的屬性。
這兩種語言都會啟用類型資訊的內嵌,以允許部署與 COM 元件互動的組件,而不需要將主要 Interop 組件 (PIA) 部署至使用者電腦。 如需詳細資訊,請參閱逐步解說:從 Managed 組件內嵌類型 (C# 和 Visual Basic)。
這個逐步解說會示範 Office 程式設計內容中的這些功能,但其中大部分也適用於一般的程式設計。 在這個逐步解說中,您會使用 Excel 增益集應用程式來建立 Excel 活頁簿。 接著,建立含有活頁簿連結的 Word 文件。 最後,了解如何啟用和停用 PIA 相依性。
重要
VSTO (Visual Studio Tools for Office) 需依賴 .NET Framework。 COM 增益集也可以使用 .NET Framework 撰寫。 無法使用 .NET Core 與 .NET 5+、最新版本的 .NET 來建立 Office 增益集。 這是因為 .NET Core/.NET 5+ 無法與相同處理序中的 .NET Framework 一起執行,而且可能會導致增益集載入失敗。 您可以繼續使用 .NET Framework 為 Office 撰寫 VSTO 和 COM 增益集。 Microsoft 不會更新 VSTO 或 COM 增益集平台,以使用 .NET Core 或 .NET 5+。 您可以利用 .NET Core 與 .NET 5+ (包括 ASP.NET Core) 來建立 Office Web 增益集的伺服器端。
必要條件
電腦上必須安裝 Microsoft Office Excel 和 Microsoft Office Word 才能完成此逐步解說。
注意
在下列指示的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置: 您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。 如需詳細資訊,請參閱將 Visual Studio IDE 個人化。
設定 Excel 增益集應用程式
- 啟動 Visual Studio。
- 在 [檔案] 功能表上,指向 [新增],然後選取 [專案]。
- 在 [已安裝的範本] 窗格中,展開 [C#] 及 [Office],接著選取該 Office 產品的版本年份。
- 在 [範本] 窗格中,選取 [Excel <版本> 增益集]。
- 查看 [範本] 窗格頂端,確定 .NET Framework 4 或更新版本出現在 [目標 Framework] 方塊中。
- 視需要在 [名稱] 方塊中,輸入您專案的名稱。
- 選取 [確定]。
- 新的專案隨即會出現在方案總管中。
新增參考
- 在 [方案總管] 中,於專案名稱上按一下滑鼠右鍵,然後選取 [新增參考]。 [新增參考] 對話方塊隨即出現。
- 在 [組件] 索引標籤上,選取 Microsoft.Office.Interop.Excel
<version>.0.0.0版 (如需 Office 產品版本號碼的金鑰,請參閱 Microsoft 版本),並在 [元件名稱] 清單中,按住 CTRL 鍵,然後選取 Microsoft.Office.Interop.Wordversion <version>.0.0.0。 如果看不到組件,則可能需要進行安裝 (請參閱如何:安裝 Office 主要 Interop 組件)。 - 選取 [確定]。
新增必要的 Imports 陳述式或使用指示詞
在 [方案總管]中,以滑鼠右鍵按一下 ThisAddIn.cs 檔案,然後選取 [檢視程式碼]。 如果尚未顯示,請將下列 using 指示詞 (C#) 加入程式碼檔案頂端。
using System.Collections.Generic;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
建立銀行帳戶清單
在 [方案總管]中,於專案名稱上按一下滑鼠右鍵,選取 [新增],然後選取 [類別]。 將類別命名為 Account.cs。 選取新增。 將 Account 類別的定義取代為下列程式碼。 類別定義使用「自動實作屬性」。
class Account
{
public int ID { get; set; }
public double Balance { get; set; }
}
若要建立含有兩個帳戶的 bankAccounts 清單,請將下列程式碼新增至 ThisAddIn.cs 中的 ThisAddIn_Startup 方法。 清單宣告使用「集合初始設定式」。
var bankAccounts = new List<Account>
{
new Account
{
ID = 345,
Balance = 541.27
},
new Account
{
ID = 123,
Balance = -127.44
}
};
匯出資料至 Excel
在相同的檔案中,將下列方法加入 ThisAddIn 類別。 這個方法會設定 Excel 活頁簿,並將資料匯出到 Excel 活頁簿。
void DisplayInExcel(IEnumerable<Account> accounts,
Action<Account, Excel.Range> DisplayFunc)
{
var excelApp = this.Application;
// Add a new Excel workbook.
excelApp.Workbooks.Add();
excelApp.Visible = true;
excelApp.Range["A1"].Value = "ID";
excelApp.Range["B1"].Value = "Balance";
excelApp.Range["A2"].Select();
foreach (var ac in accounts)
{
DisplayFunc(ac, excelApp.ActiveCell);
excelApp.ActiveCell.Offset[1, 0].Select();
}
// Copy the results to the Clipboard.
excelApp.Range["A1:B3"].Copy();
}
- Add 方法提供用來指定特定範本的選擇性參數。 若您希望使用參數的預設值,可利用選擇性參數來省略該參數的引數。 因為上一個範例中沒有引數,所以
Add會使用預設範本並建立新的活頁簿。 舊版 C# 中對等的陳述式需要有預留位置引數:excelApp.Workbooks.Add(Type.Missing)。 如需詳細資訊,請參閱具名和選擇性引數。 - Range 物件的
Range和Offset屬性會使用「編製過索引的屬性」功能。 您可利用這項功能使用下列一般 C# 語法,來使用 COM 類型的這些屬性。 您可利用編製過索引的屬性,使用Value物件的Range屬性,而不需要使用Value2屬性。Value屬性編製過索引,但您可選擇是否要編製索引。 在下列範例中,同時使用了選擇性引數與編製過索引的屬性。
// Visual C# 2010 provides indexed properties for COM programming.
excelApp.Range["A1"].Value = "ID";
excelApp.ActiveCell.Offset[1, 0].Select();
您無法建立自己本身的編製過索引屬性。 這個功能僅支援使用現有已編製過索引的屬性。
在 DisplayInExcel 結尾加入下列程式碼,以調整資料行寬度以容納內容。
excelApp.Columns[1].AutoFit();
excelApp.Columns[2].AutoFit();
這些新增內容可示範 C# 中的另一項功能:將 COM 主機 (例如 Office) 傳回的 Object 值,視為具有 dynamic 類型。 當您使用 EmbedInteropTypes 編譯器選項參考組件時,COM 物件會在「內嵌 Interop 類型」具有其預設值 True 時自動視為 dynamic 。 如需內嵌 Interop 型別的詳細資訊,請參閱本文稍後將提到的「尋找 PIA 參考」和「還原 PIA 相依性」程序。 如需 dynamic 的詳細資訊,請參閱 dynamic 或使用動態類型。
叫用 DisplayInExcel
在 ThisAddIn_StartUp 方法的結尾,加入下列程式碼。 DisplayInExcel 呼叫包含兩個引數。 第一個引數是要處理的帳戶清單名稱。 第二個引數是定義如何處理資料的多行 Lambda 運算式。 每個帳戶的 ID 和 balance 值都會顯示在相鄰的儲存格中,而且如果餘額小於零,則會以紅色顯示資料列。 如需詳細資訊,請參閱 Lambda 運算式。
DisplayInExcel(bankAccounts, (account, cell) =>
// This multiline lambda expression sets custom processing rules
// for the bankAccounts.
{
cell.Value = account.ID;
cell.Offset[0, 1].Value = account.Balance;
if (account.Balance < 0)
{
cell.Interior.Color = 255;
cell.Offset[0, 1].Interior.Color = 255;
}
});
若要執行程式,請按 F5 鍵。 隨即會出現內含帳戶資料的 Excel 工作表。
新增 Word 文件
在 ThisAddIn_StartUp 方法的結尾加入下列程式碼,可以建立內含 Excel 活頁簿連結的 Word 文件。
var wordApp = new Word.Application();
wordApp.Visible = true;
wordApp.Documents.Add();
wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
此程式碼示範 C# 中的數個功能:在 COM 程式設計、具名引數和選擇性引數中省略 ref 關鍵字的能力。PasteSpecial 方法有七個參數,全部都是選擇性參考參數。 您可利用具名引數和選擇性引數,指定想要依名稱存取的參數,以及將引數只傳送給那些參數。 在此範例中,引數表示在剪貼簿上建立活頁簿的連結 (參數 Link),並將 Word 文件中的連結顯示為圖示 (參數 DisplayAsIcon)。 在 C# 中也可省略這些引數的 ref 關鍵字。
執行應用程式
按 F5 執行應用程式。 隨即會啟動 Excel,並會顯示含有 bankAccounts 中兩個帳戶資訊的資料表。 然後,會出現包含 Excel 資料表連結的 Word 文件。
清除已完成的專案
在 Visual Studio 中,選取 [建置] 功能表上的 [清除方案]。 否則,每次在電腦上開啟 Excel 時,都會執行增益集。
尋找 PIA 參考
- 重新執行應用程式,但不選取 [清除方案]。
- 選取 [開始]。 找出 Microsoft Visual Studio <版本>,並開啟開發人員命令提示字元。
- 在 [Visual Studio 開發人員命令提示字元] 視窗中鍵入
ildasm,然後按 ENTER。 隨即會出現 IL DASM 視窗。 - 在 IL DASM 視窗的 [檔案] 功能表上,選取 [檔案]>[開啟]。 按兩下 [Visual Studio <版本>],然後按兩下 [專案]。 開啟您專案的資料夾,並查看 bin/Debug 資料夾中的 <您的專案名稱>.dll。 按兩下 <您的專案名稱>.dll。 新的視窗除了顯示會其他模組和組件的參考之外,還會顯示您專案的屬性。 組件包含命名空間
Microsoft.Office.Interop.Excel和Microsoft.Office.Interop.Word。 在 Visual Studio 中,編譯器預設會將您所需要的類型從參考的 PIA 匯入組件。 如需詳細資訊,請參閱如何:檢視組件內容。 - 按兩下資訊清單圖示。 隨即會出現一個視窗,內含專案所參考之項目的組件清單。
Microsoft.Office.Interop.Excel和Microsoft.Office.Interop.Word不在清單中。 由於您已將專案所需的類型匯入組件中,因此不需要安裝 PIA 的參考。 將類型匯入組件可讓您更輕鬆地進行部署。 PIA 不需要出現在使用者的電腦上。 應用程式不需要部署特定版本的 PIA。 應用程式可以使用多個 Office 版本,前提是所有版本都存在必要的 API。 因為不再需要部署 PIA,所以您可以在使用多個版本 Office (包括舊版本) 的進階情況下,建立應用程式。 如果您在所用的 Office 版本中無法使用某個 API,則您的程式碼無法使用該 API。 有時無法確定特定 API 是否可在舊版中使用。 不建議使用舊版 Office。 - 關閉資訊清單視窗和組件視窗。
還原 PIA 相依性
- 在 [方案總管] 中,選取 [顯示所有檔案] 按鈕。 展開 [參考] 資料夾,然後選取 Microsoft.Office.Interop.Excel。 按 F4 顯示 [屬性] 視窗。
- 在 [屬性] 視窗中,將 [內嵌 Interop 類型] 屬性從 [True] 變更為 [False]。
- 為
Microsoft.Office.Interop.Word,重複本程序中的步驟 1 和 2。 - 在 C# 中,將
Autofit方法結尾的兩個DisplayInExcel呼叫標為註解。 - 按 F5 鍵,確認專案仍然正確地執行。
- 重複前一個程序中的步驟 1-3,開啟組件視窗。 請注意,
Microsoft.Office.Interop.Word和Microsoft.Office.Interop.Excel已不在內嵌的組件清單中。 - 按兩下資訊清單圖示,並捲動所參考之組件的清單。
Microsoft.Office.Interop.Word和Microsoft.Office.Interop.Excel都在清單中。 由於應用程式會參考 Excel 和 Word PIA,而且 [內嵌 Interop 類型] 屬性為 [False],所以使用者電腦上必須具有這兩個組件。 - 在 Visual Studio 中,選取 [建置] 功能表上的 [清除方案],清除已完成的專案。