方法: Visual C# 2010 の機能を使用して Office 相互運用オブジェクトにアクセスする (C# プログラミング ガイド)
Visual C# 2010 では、Office API オブジェクトへのアクセスを簡単にする新機能が導入されています。新機能は、名前付き引数と省略可能な引数、dynamic という新しい型、および COM メソッドの参照パラメーターに (値パラメーターと同様に) 引数を渡すことができる機能です。
このトピックでは、新機能を使用して、Microsoft Office Excel ワークシートを作成および表示するコードを記述します。次に、Excel ワークシートにリンクされているアイコンを含む Office Word 文書を追加するコードを記述します。
このチュートリアルを実行するには、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] がターゲット フレームワークとして選択されていることを確認します。
[テンプレート] ペインの [コンソール アプリケーション] をクリックします。
[名前] フィールドにプロジェクトの名前を入力します。
[OK] をクリックします。
ソリューション エクスプローラーに新しいプロジェクトが表示されます。
参照を追加するには
ソリューション エクスプローラーで、プロジェクト名を右クリックし、[参照の追加] をクリックします。[参照の追加] ダイアログ ボックスが表示されます。
[.NET] ページで、[コンポーネント名] リストにある [Microsoft.Office.Interop.Word] を選択してから、Ctrl キーを押しながら [Microsoft.Office.Interop.Excel] を選択します。
[OK] をクリックします。
必要な using ディレクティブを追加するには
ソリューション エクスプローラーで、Program.cs ファイルを右クリックし、[コードの表示] をクリックします。
コード ファイルの先頭に、次の using ディレクティブを追加します。
using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word;
銀行口座の一覧を作成するには
次のクラス定義を Program クラスの Program.cs に貼り付けます。
public class Account { public int ID { get; set; } public double Balance { get; set; } }
Main メソッドに次のコードを追加して、2 つの口座を含む 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 の最後に次のコードを追加します。このコードではワークシートの最初の行の最初の 2 列に値を挿入します。
// Establish column headings in cells A1 and B1. workSheet.Cells[1, "A"] = "ID Number"; workSheet.Cells[1, "B"] = "Current Balance";
DisplayInExcel の最後に次のコードを追加します。foreach ループではワークシートの連続した行の最初の 2 列に口座の一覧の情報を挿入します。
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 の [相互運用型の埋め込み] プロパティが True に設定されている場合、Visual C# 2010 は返された Object を dynamic に自動的に変換します。True は、このプロパティの既定値です。
プロジェクトを実行するには
Main の最後に次の行を追加します。
// Display the list in an Excel spreadsheet. DisplayInExcel(bankAccounts);
Ctrl + F5 キーを押します。
2 つの口座のデータを含む Excel ワークシートが表示されます。
Word 文書を追加するには
次のコードでは、Visual C# 2010 によって Office プログラミングを拡張するその他の方法を説明するために、Word アプリケーションを開き、Excel ワークシートにリンクするアイコンを作成します。
この手順の後半で指定する CreateIconInWordDoc メソッドを Program クラスに貼り付けます。CreateIconInWordDoc では、名前付き引数と省略可能な引数を使用することで、Add および PasteSpecial のメソッド呼び出しの複雑さが軽減されています。これらの呼び出しには、Visual C# 2010 の新機能がさらに 2 つ組み込まれており、参照パラメーターを使用する COM メソッドの呼び出しが簡素化されています。1 つ目は、参照パラメーターに対して、値パラメーターの場合と同様に引数を渡せる機能です。つまり、各参照パラメーターの変数を作成することなく、値を直接渡すことができます。コンパイラは、引数の値を保持する一時変数を生成し、呼び出しから戻るときに変数を破棄します。2 つ目は、引数リストで ref キーワードを省略できる機能です。
Add メソッドには 4 つの参照パラメーターがあり、それらはすべて省略可能です。 Visual C# 2010 では、いずれかのパラメーターまたはすべてのパラメーターの既定値を使用する場合、パラメーターの引数を省略できます。以前のバージョンの Visual C# 2008 では、各パラメーターに引数を指定する必要があります。また、パラメーターが参照パラメーターであるため、引数は変数である必要があります。
PasteSpecial メソッドはクリップボードの内容を挿入します。メソッドには 7 つの参照パラメーターがあり、それらはすべて省略可能です。次のコードでは、そのうちの 2 つのパラメーターに引数を指定しています。Link はクリップボードの内容のソースへのリンクを作成し、DisplayAsIcon はアイコンとしてリンクを表示します。Visual C# 2010 では、上記の 2 つのパラメーターに名前付き引数を使用して、その他を省略できます。これらは参照パラメーターですが、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 の文書が表示されます。このアイコンをダブルクリックし、ワークシートを前面に表示します。
[相互運用型の埋め込み] プロパティを設定するには
プライマリ相互運用機能アセンブリ (PIA: Primary Interop Assembly) を実行時に必要としない COM 型を呼び出す場合、さらなる機能拡張を利用できます。PIA に対する依存関係を取り除くことによって、バージョンに依存しない、より簡単な配置を行うことができます。PIA を使用しないプログラミングの利点の詳細については、「チュートリアル: マネージ アセンブリからの型の埋め込み (C# および Visual Basic)」を参照してください。
また、COM メソッドから返される COM メソッドに必要な型を、Object 型ではなく dynamic 型を使用して表すことができるため、プログラミングがより簡単です。dynamic 型を持つ変数は実行時まで評価されないので、明示的なキャストの必要がありません。 詳細については、「dynamic 型の使用 (C# プログラミング ガイド)」を参照してください。
Visual C# 2010 では、PIA を使用するのではなく型情報を埋め込むことが既定の動作になります。その既定動作では明示的なキャストが必要ないので、前に示した例のうちいくつかは簡素化されます。たとえば、DisplayInExcel の worksheet の宣言は、Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet ではなく Excel._Worksheet 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 キーを押します。
プロパティの一覧で [相互運用型の埋め込み] を見つけ、値を False に変更します。同様に、コマンド プロンプトでコンパイラ オプションとして /link ではなく /reference を使用してコンパイルできます。
他の書式設定を表に追加するには
DisplayInExcel の AutoFit への 2 つの呼び出しを次のステートメントに置き換えます。
// Call to AutoFormat in Visual C# 2010. workSheet.Range["A1", "B3"].AutoFormat( Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
AutoFormat メソッドには 7 つの値パラメーターがありますが、すべて省略可能です。名前付き引数と省略可能な引数を使用して、すべてまたは一部のパラメーターに引数を指定できます。どのパラメーターにも引数を指定しないことも可能です。前に示したステートメントでは、Format という 1 つのパラメーターのみに対して引数を指定しています。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# プログラミング ガイド)
関連項目
概念
名前付き引数と省略可能な引数 (C# プログラミング ガイド)