如何:使用 Visual C# 功能存取 Office Interop 物件 (C# 程式設計指南)
Visual C# 2010 開始採用可簡化 Office API 物件存取的新功能。 新功能包括具名引數和選擇性引數、稱為 dynamic 的新類型,以及傳遞引數以像是實值參數的形式,參考 COM 方法中參數的能力。
在本主題中,您將使用新的功能撰寫可建立及顯示 Microsoft Office Excel 工作表的程式碼。 接著,您將要撰寫可加入 Office Word 文件的程式碼,而該文件包含連結至 Excel 工作表的圖示。
若要完成這個逐步解說,電腦上必須安裝 Microsoft Office Excel 2007 和 Microsoft Office Word 2007 或更新版本。
如果您使用 Windows Vista 以前的作業系統,請確定已安裝 .NET Framework 2.0。
注意事項 |
---|
您的電腦對於下列指示中某些 Visual Studio 使用者介面項目的名稱或位置,可能會顯示不同的資訊:您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱<Visual Studio 中的自訂開發設定>。 |
建立新的主控台應用程式
啟動 Visual Studio。
在 [檔案] 功能表中,指向 [新增],然後按一下 [專案]。 [新增專案] 對話方塊隨即出現。
在 [已安裝的範本] 窗格中,展開 [Visual C#],然後按一下 [Windows]。
查看 [新增專案] 對話方塊頂端,確定已選取 [.NET Framework 4] (或更新版本) 做為目標架構。
按一下 [範本] 窗格中的 [主控台應用程式]。
在 [名稱] 欄位中,輸入您專案的名稱。
按一下 [確定]。
新的專案隨即會出現在 [方案總管] 中。
加入參考
在 [方案總管] 中,於專案名稱上按一下滑鼠右鍵,然後按一下 [加入參考]。 [加入參考] 對話方塊隨即出現。
在 [組件] 頁面的 [元件名稱] 清單中,選取 [Microsoft.Office.Interop.Word],然後按住 CTRL 鍵並選取 [Microsoft.Office.Interop.Excel]。 如果看不到組件,則可能需要確定組件已安裝及顯示 (請參閱如何:安裝 Office 主要 Interop 組件)。
按一下 [確定]。
加入必要的 using 指示詞
在 [方案總管] 中,於 [Program.cs] 檔案上按一下滑鼠右鍵,然後按一下 [檢視程式碼]。
將下列 using 指示詞加入程式碼檔案頂端。
using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word;
建立銀行帳戶清單
將下列類別定義貼入 Program.cs 的 Program 類別下方。
public class Account { public int ID { get; set; } public double Balance { get; set; } }
將下列程式碼加入 Main 方法,以建立含有兩個帳戶的 bankAccounts 清單。
// Create a list of accounts. var bankAccounts = new List<Account> { new Account { ID = 345678, Balance = 541.27 }, new Account { ID = 1230221, Balance = -127.44 } };
宣告將帳戶資訊匯出至 Excel 的方法
將下列方法加入 Program 類別,以設定 Excel 試算表。
方法 Add (英文) 有選擇性參數,可指定特定範本。 如果您想要使用參數的預設值,則可利用選擇性參數 (Visual C# 2010 中的新功能) 省略該參數的引數。 因為下列程式碼中未傳送引數,所以 Add 使用預設範本並建立新的活頁簿。 舊版 C# 中對等的陳述式需要有預留位置引數:ExcelApp.Workbooks.Add(Type.Missing)。
static void DisplayInExcel(IEnumerable<Account> accounts) { var excelApp = new Excel.Application(); // Make the object visible. excelApp.Visible = true; // Create a new, empty workbook and add it to the collection returned // by property Workbooks. The new workbook becomes the active workbook. // Add has an optional parameter for specifying a praticular template. // Because no argument is sent in this example, Add creates a new workbook. excelApp.Workbooks.Add(); // This example uses a single workSheet. The explicit type casting is // removed in a later procedure. Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet; }
在 DisplayInExcel 結尾,加入下列程式碼。 程式碼會將值插入工作表第一個資料列的前兩個資料行。
// Establish column headings in cells A1 and B1. workSheet.Cells[1, "A"] = "ID Number"; workSheet.Cells[1, "B"] = "Current Balance";
在 DisplayInExcel 結尾,加入下列程式碼。 foreach 迴圈會將帳戶清單中的資訊,放入工作表連續資料列的前兩個資料行。
var row = 1; foreach (var acct in accounts) { row++; workSheet.Cells[row, "A"] = acct.ID; workSheet.Cells[row, "B"] = acct.Balance; }
在 DisplayInExcel 結尾加入下列程式碼,以調整資料行寬度以容納內容。
workSheet.Columns[1].AutoFit(); workSheet.Columns[2].AutoFit();
舊版 C# 需要這些作業的明確轉型,因為 ExcelApp.Columns[1] 會傳回 Object,而 AutoFit 是 Excel Range (英文) 方法。 下列各行會顯示轉型。
((Excel.Range)workSheet.Columns[1]).AutoFit(); ((Excel.Range)workSheet.Columns[2]).AutoFit();
如果 /link 編譯器選項參考組件,或者,同樣地,如果 Excel [內嵌 Interop 類型] 屬性設定為 true,則 Visual C# 2010 和更新版本會自動將傳回的 Object 轉換為 dynamic。 這個屬性的預設值為 True。
執行專案
在 Main 結尾,加入下行。
// Display the list in an Excel spreadsheet. DisplayInExcel(bankAccounts);
按下 CTRL+F5。
隨即會出現內含兩個帳戶資料的 Excel 工作表。
加入 Word 文件
為了說明 Visual C# 2010 和更新版本中加強 Office 程式設計的其他方法,下列程式碼會開啟 Word 應用程式,並建立 Excel 工作表連結的圖示。
將本步驟稍後提供的 CreateIconInWordDoc 方法,貼入 Program 類別。 CreateIconInWordDoc 使用具名引數和選擇性引數,降低呼叫 Add (英文) 和 PasteSpecial (英文) 方法的複雜度。 這些呼叫採用 Visual C# 2010 引進的兩個其他新功能,簡化了具有參考參數之 COM 方法的呼叫。 首先,您可以將引數以實值參數的形式傳送到參考參數。 也就是說,可以直接傳送值而無須建立每個參考參數的變數。 編譯器會產生暫存變數來保存引數值,並在從呼叫返回時捨棄變數。 其次,您可以省略引數清單中的 ref 關鍵字。
Add 方法有四個參考參數,而且都是選擇性參數。 在 Visual C# 2010 或更新版本中,如果想要使用其預設值,可以省略任何或所有參數的引數。 在 Visual C# 2008 和舊版本中,必須為每個參數提供引數,且引數必須是變數,因為參數是參考參數。
PasteSpecial 方法會將內容插入剪貼簿。 此方法有七個參考參數,且都是選擇性參數。 下列程式碼指定其中兩個的引數:Link 可建立剪貼簿的內容的來源連結,以及 DisplayAsIcon 可將連結顯示為圖示。 在 Visual C# 2010 中,可以為這兩者使用具名引數,並省略其他引數。 雖然這些是參考參數,但是您不需要使用 ref 關鍵字,或建立傳送為引數的變數。 可以直接傳送值。 在 Visual C# 2008 和舊版本中,必須為每個參考參數傳送變數引數。
static void CreateIconInWordDoc() { var wordApp = new Word.Application(); wordApp.Visible = true; // The Add method has four reference parameters, all of which are // optional. Visual C# 2010 allows you to omit arguments for them if // the default values are what you want. wordApp.Documents.Add(); // PasteSpecial has seven reference parameters, all of which are // optional. This example uses named arguments to specify values // for two of the parameters. Although these are reference // parameters, you do not need to use the ref keyword, or to create // variables to send in as arguments. You can send the values directly. wordApp.Selection.PasteSpecial( Link: true, DisplayAsIcon: true); }
在 Visual C# 2008 或舊版語言中,需要有下列更為複雜的程式碼。
static void CreateIconInWordDoc2008() { var wordApp = new Word.Application(); wordApp.Visible = true; // The Add method has four parameters, all of which are optional. // In Visual C# 2008 and earlier versions, an argument has to be sent // for every parameter. Because the parameters are reference // parameters of type object, you have to create an object variable // for the arguments that represents 'no value'. object useDefaultValue = Type.Missing; wordApp.Documents.Add(ref useDefaultValue, ref useDefaultValue, ref useDefaultValue, ref useDefaultValue); // PasteSpecial has seven reference parameters, all of which are // optional. In this example, only two of the parameters require // specified values, but in Visual C# 2008 an argument must be sent // for each parameter. Because the parameters are reference parameters, // you have to contruct variables for the arguments. object link = true; object displayAsIcon = true; wordApp.Selection.PasteSpecial( ref useDefaultValue, ref link, ref useDefaultValue, ref displayAsIcon, ref useDefaultValue, ref useDefaultValue, ref useDefaultValue); }
在 Main 結尾,加入下列陳述式。
// Create a Word document that contains an icon that links to // the spreadsheet. CreateIconInWordDoc();
在 DisplayInExcel 結尾,加入下列陳述式。 Copy 方法會將工作表加入剪貼簿。
// Put the spreadsheet contents on the clipboard. The Copy method has one // optional parameter for specifying a destination. Because no argument // is sent, the destination is the Clipboard. workSheet.Range["A1:B3"].Copy();
按下 CTRL+F5。
隨即會出現含有圖示的 Word 文件。 按兩下圖示,即可將該工作表帶到前景。
設定內嵌 Interop 類型屬性
當您在執行階段呼叫不需要主要 Interop 組件 (PIA) 的 COM 類型時,可以使用其他增強功能。 移除與 PIA 的相依性,可達成版本獨立且更容易進行部署。 如需沒有 PIA 的程式設計優點詳細資訊,請參閱逐步解說:從 Managed 組件內嵌類型 (C# 和 Visual Basic)。
此外,程式設計會更為容易,因為 COM 方法所需和所傳回的類型可以使用類型 dynamic 而非 Object 加以呈現。 除非處於執行階段,否則不會評估類型為 dynamic 的變數,如此即無須明確轉型。 如需詳細資訊,請參閱使用動態類型 (C# 程式設計手冊)。
在 Visual C# 2010 中,預設行為是內嵌類型資訊,而非使用 PIA。 因為使用該預設值,已簡化了數個先前的範例,因為明確轉型已非必要。 例如,DisplayInExcel 中的 worksheet 宣告,撰寫為 Excel._Worksheet workSheet = excelApp.ActiveSheet,而非 Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet。 如果沒有預設值,則相同方法中的 AutoFit 呼叫也需要明確轉型,因為 ExcelApp.Columns[1] 會傳回 Object,而 AutoFit 是 Excel 方法。 下列程式碼會顯示轉型。
((Excel.Range)workSheet.Columns[1]).AutoFit(); ((Excel.Range)workSheet.Columns[2]).AutoFit();
若要變更預設值,並使用 PIA 而非內嵌類型資訊,請展開 [方案總管] 中的 [參考] 節點,然後選取 [Microsoft.Office.Interop.Excel] 或 [Microsoft.Office.Interop.Word]。
如果看不到 [屬性] 視窗,請按 F4 鍵。
在屬性清單中尋找 [內嵌 Interop 類型],並將其值變更為 [False]。 同樣地,也可以在命令提示字元處使用 /reference 編譯器選項,而非 /link 進行編譯。
加入表格的其他格式
將 DisplayInExcel 中對兩個 AutoFit 的呼叫,取代為下列陳述式。
// Call to AutoFormat in Visual C# 2010. workSheet.Range["A1", "B3"].AutoFormat( Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
AutoFormat (英文) 方法具有七個實值參數,且全都是選擇性參數。 您可利用具名引數和選擇性引數,提供零個引數、數個引數或所有引數。 在前述陳述式中,只為其中一個參數 (Format) 提供引數。 因為 Format 是參數清單中的第一個參數,所以無須提供參數名稱。 但如果包含參數名稱,則可能較容易了解該陳述式,如下列程式碼所示。
// Call to AutoFormat in Visual C# 2010. workSheet.Range["A1", "B3"].AutoFormat(Format: Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
按 CTRL + F5 鍵查看結果。 其他格式會列在 XlRangeAutoFormat (英文) 列舉中。
請比較步驟 1 中的陳述式與下列程式碼,這樣會顯示 Visual C# 2008 或舊版本中所需的引數。
// The AutoFormat method has seven optional value parameters. The // following call specifies a value for the first parameter, and uses // the default values for the other six. // Call to AutoFormat in Visual C# 2008. This code is not part of the // current solution. excelApp.get_Range("A1", "B4").AutoFormat(Excel.XlRangeAutoFormat.xlRangeAutoFormatTable3, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
範例
下列程式碼顯示完整範例。
using System;
using System.Collections.Generic;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
namespace OfficeProgramminWalkthruComplete
{
class Walkthrough
{
static void Main(string[] args)
{
// Create a list of accounts.
var bankAccounts = new List<Account>
{
new Account {
ID = 345678,
Balance = 541.27
},
new Account {
ID = 1230221,
Balance = -127.44
}
};
// Display the list in an Excel spreadsheet.
DisplayInExcel(bankAccounts);
// Create a Word document that contains an icon that links to
// the spreadsheet.
CreateIconInWordDoc();
}
static void DisplayInExcel(IEnumerable<Account> accounts)
{
var excelApp = new Excel.Application();
// Make the object visible.
excelApp.Visible = true;
// Create a new, empty workbook and add it to the collection returned
// by property Workbooks. The new workbook becomes the active workbook.
// Add has an optional parameter for specifying a praticular template.
// Because no argument is sent in this example, Add creates a new workbook.
excelApp.Workbooks.Add();
// This example uses a single workSheet.
Excel._Worksheet workSheet = excelApp.ActiveSheet;
// Earlier versions of C# require explicit casting.
//Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
// Establish column headings in cells A1 and B1.
workSheet.Cells[1, "A"] = "ID Number";
workSheet.Cells[1, "B"] = "Current Balance";
var row = 1;
foreach (var acct in accounts)
{
row++;
workSheet.Cells[row, "A"] = acct.ID;
workSheet.Cells[row, "B"] = acct.Balance;
}
workSheet.Columns[1].AutoFit();
workSheet.Columns[2].AutoFit();
// Call to AutoFormat in Visual C# 2010. This statement replaces the
// two calls to AutoFit.
workSheet.Range["A1", "B3"].AutoFormat(
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
// Put the spreadsheet contents on the clipboard. The Copy method has one
// optional parameter for specifying a destination. Because no argument
// is sent, the destination is the Clipboard.
workSheet.Range["A1:B3"].Copy();
}
static void CreateIconInWordDoc()
{
var wordApp = new Word.Application();
wordApp.Visible = true;
// The Add method has four reference parameters, all of which are
// optional. Visual C# 2010 allows you to omit arguments for them if
// the default values are what you want.
wordApp.Documents.Add();
// PasteSpecial has seven reference parameters, all of which are
// optional. This example uses named arguments to specify values
// for two of the parameters. Although these are reference
// parameters, you do not need to use the ref keyword, or to create
// variables to send in as arguments. You can send the values directly.
wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
}
}
public class Account
{
public int ID { get; set; }
public double Balance { get; set; }
}
}
請參閱
工作
如何:在 Office 程式設計中使用具名和選擇性引數 (C# 程式設計手冊)