逐步解說:Office 程式設計 (C# 和 Visual Basic)
Visual Studio 2010 在 C# 和 Visual Basic 引進新功能,用以改善 Microsoft Office 程式設計能力。 這兩種語言也分別新增了另一種語言的既有功能。
C# 的新功能包括具名和選擇性引數、型別為 dynamic 的傳回值,以及在 COM 程式設計中,省略 ref 關鍵字和存取索引屬性的能力。 Visual Basic 的新功能包括自動實作的屬性、Lambda 運算式中的陳述式,以及集合初始設定式。
兩種語言現在都能內嵌型別資訊,如此可以部署與 COM 元件互動的組件,而不需部署主要 Interop 組件至使用者電腦。 如需詳細資訊,請參閱 逐步解說:從 Managed 組件內嵌型別 (C# 和 Visual Basic)。
本逐步解說將示範 Office 程式設計環境中的新功能,但其中許多功能也適用於一般的程式設計情形。 在逐步解說中,首先使用 Excel 增益集應用程式建立 Excel 活頁簿。 接著建立一份 Word 文件,其中包含上述活頁簿的連結。 最後,您可以觀察如何開啟及關閉 PIA 相依性。
必要條件
您的電腦必須安裝 Microsoft Office Excel 2010 或 2007 和 Microsoft Office Word 2010 或 2007,才能完成本逐步解說。
如果您使用的作業系統比 Windows Vista 舊,請務必安裝 .NET Framework 2.0。
注意事項 |
---|
您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 Visual Studio 使用者介面項目。 您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。 如需詳細資訊,請參閱 Visual Studio 設定。 |
若要安裝 Excel 增益集應用程式
啟動 Visual Studio。
在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。
在 [已安裝的範本] 窗格中,展開 [Visual Basic] 或 [Visual C#],再展開 [Office],然後按一下 [2010] (如果使用 Office 2007 則為 [2007])。
在 [範本] 窗格中,按一下 [Excel 2010 增益集] (或 [Excel 2007 增益集])。
查看 [範本] 窗格的頂端,確定 [.NET Framework 4] 顯示在 [目標 Framework] 方塊中。
視需要在 [名稱] 方塊中輸入專案的名稱。
按一下 [確定]。
新專案即會出現於 [方案總管] 中。
若要加入參考
在 [方案總管] 中,以滑鼠右鍵按一下您的專案名稱,然後按一下 [加入參考]。 [加入參考] 對話方塊隨即出現。
在 [.NET] 索引標籤的 [元件名稱] 清單中選取 [Microsoft.Office.Interop.Excel] 版本 14.0.0.0 (如果是 Excel 2007 則為版本 12.0.0.0),然後按住 CTRL 鍵並選取 [Microsoft.Office.Interop.Word] 版本 14.0.0.0 (如果是 Word 2007 則為版本 12.0.0.0)。
按一下 [確定]。
若要加入必要的 Imports 陳述式或 using 指示詞
在 [方案總管] 中,以滑鼠右鍵按一下 ThisAddIn.vb 或 ThisAddIn.cs 檔,然後按一下 [檢視程式碼]。
將下列 Imports 陳述式 (Visual Basic) 或 using 指示詞 (C#) 陳述式加入至程式碼檔案頂端 (如果尚未加入)。
Imports Microsoft.Office.Interop
using System.Collections.Generic; using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word;
若要建立銀行帳戶清單
在 [方案總管] 中,以滑鼠右鍵按一下專案名稱、按一下 [加入],然後按一下 [類別]。 如果您使用的是 Visual Basic,請將此類別命名為 Account.vb,如果您使用的是 C# 則請命名 Account.cs。 按一下 [加入]。
以下列程式碼取代 Account 類別的定義。 Visual Studio 2010 中的類別定義會使用 Visual Basic 新增功能的「自動實作屬性」(Auto-implemented Property)。 如需詳細資訊,請參閱 自動實作的屬性 (Visual Basic)。
Public Class Account Property ID As Integer = -1 Property Balance As Double End Class
class Account { public int ID { get; set; } public double Balance { get; set; } }
若要建立包含兩個帳戶的 bankAccounts 清單,請將下列程式碼加入至 ThisAddIn.vb 或 ThisAddIn.cs 的 ThisAddIn_Startup 方法中。 Visual Studio 2010 中的清單宣告會使用 Visual Basic 新增功能的「集合初始設定式」(Collection Initializer)。 如需詳細資訊,請參閱集合初始設定式概觀 (Visual Basic)。
Dim bankAccounts As New List(Of Account) From { New Account With { .ID = 345, .Balance = 541.27 }, New Account With { .ID = 123, .Balance = -127.44 } }
var bankAccounts = new List<Account> { new Account { ID = 345, Balance = 541.27 }, new Account { ID = 123, Balance = -127.44 } };
若要將資料匯出至 Excel
將下列方法加入至同一個檔案的 ThisAddIn 類別。 此方法會設定 Excel 活頁簿並將資料匯出至此活頁簿。
Sub DisplayInExcel(ByVal accounts As IEnumerable(Of Account), ByVal DisplayAction As Action(Of Account, Excel.Range)) With Me.Application ' Add a new Excel workbook. .Workbooks.Add() .Visible = True .Range("A1").Value = "ID" .Range("B1").Value = "Balance" .Range("A2").Select() For Each ac In accounts DisplayAction(ac, .ActiveCell) .ActiveCell.Offset(1, 0).Select() Next ' Copy the results to the Clipboard. .Range("A1:B3").Copy() End With End Sub
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(); }
這個方法用到兩個 C# 新功能。 Visual Basic 已有這些功能。
方法 Add 有一個「選擇性參數」(Optional Parameter),可以用來指定特定範本。 選擇性參數是 Visual C# 2010 的新增功能,如果您想使用參數的預設值,即可省略該參數的引數。 由於以上範例並未傳送引數,所以 Add 將使用預設範本並建立新活頁簿。 舊版 C# 中的相等陳述式需要替代符號引數:excelApp.Workbooks.Add(Type.Missing)。
如需詳細資訊,請參閱具名和選擇性引數 (C# 程式設計手冊)。
Range 物件的 Range 和 Offset 屬性使用「索引屬性」(Indexed Property) 功能。 這個功能可讓您透過下列典型 C# 語法,使用 COM 型別的上述屬性。 索引屬性也能讓您使用 Range 物件的 Value 屬性,因此不再需要使用 Value2 屬性。 Value 屬性是索引屬性,但索引是選擇性的。 以下為選擇性引數和索引屬性搭配使用的範例。
// Visual C# 2010 provides indexed properties for COM programming. excelApp.Range["A1"].Value = "ID"; excelApp.ActiveCell.Offset[1, 0].Select();
在舊版語言中,需要下列特殊語法。
// In Visual C# 2008, you cannot access the Range, Offset, and Value // properties directly. excelApp.get_Range("A1").Value2 = "ID"; excelApp.ActiveCell.get_Offset(1, 0).Select();
您不能建立自己的索引屬性。 此功能僅支援使用現有的索引屬性。
如需詳細資訊,請參閱 HOW TO:在 COM Interop 程式設計中使用索引的屬性 (C# 程式設計手冊)。
將下列程式碼加入至 DisplayInExcel 的結尾,調整資料行寬度以符合內容。
' Add the following two lines at the end of the With statement. .Columns(1).AutoFit() .Columns(2).AutoFit()
excelApp.Columns[1].AutoFit(); excelApp.Columns[2].AutoFit();
這些新增項目也示範了 C# 2010 的另一個新功能:將 COM 主應用程式 (例如 Office) 傳回的 Object 值視同擁有 dynamic 型別。 當 [內嵌 Interop 型別] 設為其預設值 True,或相當於組件被 /link 編譯器選項參考時,以上行為就會自動發生。 型別 dynamic 允許晚期繫結 (Visual Basic 已有此功能),且省去 Visual C# 2008 和舊版語言中為必要的明確轉型。
例如,excelApp.Columns[1] 會傳回 Object,而 AutoFit 是 Excel Range 方法。 如果沒有 dynamic,則在呼叫方法 AutoFit 前,需將 excelApp.Columns[1] 傳回的物件轉型為 Range 的執行個體。
// Casting is required in Visual C# 2008. ((Excel.Range)excelApp.Columns[1]).AutoFit(); // Casting is not required in Visual C# 2010. excelApp.Columns[1].AutoFit();
如需內嵌 Interop 型別的詳細資訊,請參閱本主題稍後的程序<若要尋找 PIA 參考>和<若要還原 PIA 相依性>。 如需 dynamic 的詳細資訊,請參閱 dynamic (C# 參考) 或使用動態型別 (C# 程式設計手冊)。
若要叫用 DisplayInExcel
將下列程式碼加入 ThisAddIn_StartUp 方法的結尾。 呼叫 DisplayInExcel 包含兩個引數。 第一個引數是要處理之帳戶清單的名稱。 第二個引數是多行 Lambda 運算式,定義處理資料的方式。 每個帳戶的 ID 和 balance 值顯示在相鄰儲存格中,如果餘額小於零,該資料列會以紅色顯示。 多行 Lambda 運算式是 Visual Basic 2010 的新功能。 如需詳細資訊,請參閱 Lambda 運算式 (Visual Basic)。
DisplayInExcel(bankAccounts, Sub(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 Then cell.Interior.Color = RGB(255, 0, 0) cell.Offset(0, 1).Interior.Color = RGB(255, 0, 0) End If End Sub)
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 文件。
Dim wordApp As New Word.Application wordApp.Visible = True wordApp.Documents.Add() wordApp.Selection.PasteSpecial(Link:=True, DisplayAsIcon:=True)
var wordApp = new Word.Application(); wordApp.Visible = true; wordApp.Documents.Add(); wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
此程式碼示範 C# 的數項新功能:在 COM 程式設計中省略 ref 關鍵字的能力、具名引數和選擇性引數。 Visual Basic 已有這些功能。 PasteSpecial 方法有 7 個參數,全都定義為選擇性參考參數。 在 Visual C# 2010 之前版本中,必須定義物件變數以做為這 7 個參數的引數,無論您是否要傳送有意義的值給這些引數。 具名和選擇性引數則可讓您以名稱指定您要存取的參數,並僅傳送引數給這些參數。 這個範例會傳送引數,指定應在剪貼簿中建立連往活頁簿的連結 (參數 Link),且該連結會在 Word 文件中顯示為圖示 (參數 DisplayAsIcon)。 Visual C# 2010 也允許您省略這些引數的 ref 關鍵字。 您可將下列 Visual C# 2008 的程式碼片段,與 Visual C# 2010 所需的單行程式碼進行比較:
// Call to PasteSpecial in Visual C# 2008. object iconIndex = Type.Missing; object link = true; object placement = Type.Missing; object displayAsIcon = true; object dataType = Type.Missing; object iconFileName = Type.Missing; object iconLabel = Type.Missing; wordApp.Selection.PasteSpecial(ref iconIndex, ref link, ref placement, ref displayAsIcon, ref dataType, ref iconFileName, ref iconLabel); // Call to PasteSpecial in Visual C# 2010. wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
若要執行應用程式
- 按下 F5 執行應用程式。 Excel 便會啟動並顯示一個資料表,其中包含 bankAccounts 中兩個帳戶的資料。 接著會出現一份 Word 文件,其中包含 Excel 資料表的連結。
若要清除已完成專案
- 在 Visual Studio 中,按一下 [建置] 功能表上的 [清除方案]。 否則,每次在電腦上開啟 Excel 時,增益集都會執行。
若要尋找 PIA 參考
再次執行應用程式,但是不要按一下 [清除方案]。
在 [開始] 功能表上按一下 [所有程式]。 接著依序按一下 [Microsoft Visual Studio 2010]、[Visual Studio Tools] 和 [Visual Studio 命令提示字元 (2010)]。
在 [Visual Studio 命令提示字元 (2010)] 視窗中輸入 ildasm,然後按 ENTER。 [IL DASM] 視窗隨即出現。
在 [IL DASM] 視窗的 [檔案] 功能表上,按一下 [開啟]。 按兩下 [Visual Studio 2010],接著按兩下 [專案]。 開啟您專案的資料夾,在 bin/Debug 資料夾中尋找 <您的專案名稱>.dll。 按兩下 <您的專案名稱>.dll。 隨即出現新視窗,其中顯示您的專案屬性,以及對其他模組和組件的參考。 請注意,組件中包含命名空間 Microsoft.Office.Interop.Excel 和 Microsoft.Office.Interop.Word。 在 Visual Studio 2010 中,編譯器依預設會從受參考 PIA 將您需要的型別匯入至組件。
如需詳細資訊,請參閱 HOW TO:檢視組件內容。
按兩下 [MANIFEST] 圖示。 隨即出現一個視窗,列出包含專案所參考項目之組件的清單。 清單中不會包含 Microsoft.Office.Interop.Excel 和 Microsoft.Office.Interop.Word。 由於專案所需型別都已匯入至組件,因此對 PIA 的參考不是必要項目。 如此可讓部署更為容易。 使用者電腦上不需要有 PIA,而且應用程式不需部署特定版本的 PIA,因此可將應用程式設計為與多種 Office 版本搭配使用,只要所有版本都有必要 API 即可。
因為不再需要部署 PIA,所以您可以建立進階案例的應用程式,以便與多種 Office 版本搭配使用,甚至包括舊版 Office。 不過,前提是您的程式碼不能使用到 Office 搭配版本中未包含的任何 API。 由於難以得知舊版中是否包含某個特定 API,因此,不建議與舊版 Office 搭配使用。
注意事項 Office 2003 之前的 Office 未發行 PIA。 所以,為 Office 2002 (含) 以前版本產生 Interop 組件的唯一方法,就是匯入 COM 參考。
關閉資訊清單視窗和組件視窗。
若要還原 PIA 相依性
在 [方案總管] 中按一下 [顯示所有檔案] 按鈕。 展開 [參考] 資料夾並選取 [Microsoft.Office.Interop.Excel]。 按 F4 顯示 [屬性] 視窗。
在 [屬性] 視窗中,將 [內嵌 Interop 型別] 屬性的值從 [True] 變更為 [False]。
為 Microsoft.Office.Interop.Word 重複此程序的步驟 1 到 2。
在 C# 中,將 DisplayInExcel 方法結尾處對兩個 Autofit 的呼叫標記為註解。
按 F5 驗證專案是否仍正確運作。
重複先前程序的步驟 1 到 3,開啟組件視窗。 注意 Microsoft.Office.Interop.Word 和 Microsoft.Office.Interop.Excel 不再出現於內嵌組件清單中。
按兩下 [MANIFEST] 圖示並捲動參考組件清單。 Microsoft.Office.Interop.Word 和 Microsoft.Office.Interop.Excel 都會在清單中。 由於應用程式會參考 Excel 和 Word PIA,而且 [內嵌 Interop 型別] 屬性設為 [False],所以這兩個組件都必須存在於使用者電腦上。
在 Visual Studio,按一下 [建置] 功能表上的 [清除方案],清除已完成的專案。
請參閱
工作
逐步解說:從 Managed 組件內嵌型別 (C# 和 Visual Basic)
參考
概念
其他資源
HOW TO:在 COM Interop 程式設計中使用索引的屬性 (C# 程式設計手冊)