方法: Visual C# の機能を使用して 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] をクリックします。
ソリューション エクスプローラーに新しいプロジェクトが表示されます。
参照を追加するには
ソリューション エクスプローラーで、プロジェクトの名前を右クリックし、[参照の追加] をクリックします。 [参照の追加] ダイアログ ボックスが表示されます。
[アセンブリ] ページで、[コンポーネント名] 一覧で [Microsoft.Office.Interop.Word] を選択し、Ctrl キーを押しながら [Microsoft.Office.Interop.Excel] を選択します。 アセンブリが表示されない場合は、アセンブリがインストールされ表示されることを確認する必要があります (「方法 : Office のプライマリ相互運用機能アセンブリをインストールする」を参照)。
[OK] をクリックします。
ディレクティブを使用して必要なものを追加するには
ソリューション エクスプローラーで、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 メソッドに追加して、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();
Visual C# 2010 およびそれ以降のバージョンでは、アセンブリが /link コンパイラ オプションで参照される場合、または同等に、Excel の [相互運用機能型の埋め込み] プロパティが true に設定されている場合は、返される 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 で導入された、参照パラメーターを持つ COM メソッドの呼び出しを簡略化する 2 つの他の新しい機能が組み込まれます。 第一に、値パラメーターの場合と同様に参照パラメーターに引数を渡すことができます。 つまり、参照パラメーターごとに変数を作成することなく値を直接渡すことができます。 コンパイラは引数の値を保持する一時変数を生成し、呼び出しから戻るときに変数を破棄します。 第二に、引数リスト内の ref キーワードを省略できます。
Add メソッドには 4 つの参照パラメーターがあり、これらはすべてオプションです。 Visual C# 2010 以降のバージョンでは、既定値を使用する場合は、任意またはすべてのパラメーターの引数を省略できます。 Visual C# 2008 以前のバージョンでは、各パラメーターの引数を提供する必要があり、パラメーターが参照パラメーターであるため、引数は変数である必要があります。
PasteSpecial メソッドは、クリップボードの内容を挿入します。 このメソッドには 7 つの参照パラメーターがあり、これらはすべてオプションです。 次のコードでは、クリップボードの内容のソースへのリンクを作成する Link とリンクをアイコンとして表示する DisplayAsIcon の 2 つの参照パラメーターの引数を指定します。 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) を必要としない COM 型を呼び出すときに、追加の拡張が可能です。 PIA への依存関係を削除することによって、バージョンに依存しない、より簡単な展開が実現されます。 PIA を使用しないプログラミングのメリットの詳細については、「チュートリアル: マネージ アセンブリからの型の埋め込み (C# および Visual Basic)」を参照してください。
また、Object ではなく dynamic 型を使用して、COM メソッドに必要とされ、COM メソッドによって返される型を簡単に表現できるため、プログラミングがより簡単になります。 型が 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 つの値のパラメーターがあり、これらはすべてオプションです。 名前付き引数と省略可能な引数を使用すると、一部またはすべてのパラメーターに引数を指定することができます。引数を指定しないこともできます。 前のステートメントでは、1 つのパラメーター 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# プログラミング ガイド)
関連項目
概念
名前付き引数と省略可能な引数 (C# プログラミング ガイド)