Office 相互運用オブジェクトにアクセスする方法
C# には、Office API オブジェクトへのアクセスを容易にする機能があります。 新機能は、名前付き引数と省略可能な引数、dynamic
と呼ばれる新しい型、値パラメーターの場合と同様に COM メソッドの参照パラメーターに引数を渡す機能などです。
この記事では、新機能を使用して、Microsoft Office Excel ワークシートを作成および表示するコードを記述します。 Excel ワークシートにリンクされているアイコンを含む Office Word 文書を追加するコードを記述します。
このチュートリアルを実行するには、Microsoft Office Excel 2007 と Microsoft Office Word 2007 またはそれ以降のバージョンがコンピューターにインストールされている必要があります。
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「IDE をカスタマイズする」をご覧ください。
重要
VSTO は .NET Framework に依存しています。 COM アドインも .NET Framework を使用して記述することができます。 Office アドインは、.NET Core と .NET 5+ (.NET の最新バージョン) では作成できません。 これは、.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 アドインのサーバー側を作成できます。
新しいコンソール アプリケーションを作成するには
- Visual Studio を起動します。
- [ファイル] メニューの [新規作成]をポイントし、 [プロジェクト]をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
- [インストールされたテンプレート] ペインで [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 メソッドには、特定のテンプレートを指定する省略可能なパラメーターがあります。 オプションのパラメーターでは、パラメーターの既定値を使用する場合は、そのパラメーターの引数を省略することができます。 引数を指定していないため、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 particular 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();
C# では、アセンブリが EmbedInteropTypes コンパイラ オプションで参照される場合、または同等に、Excel の [相互運用機能型の埋め込み] プロパティが true の場合は、返される Object
が dynamic
に自動的に変換されます。 このプロパティの既定値は true です。
プロジェクトを実行するには
Main
の末尾に次の行を追加します。
// Display the list in an Excel spreadsheet.
DisplayInExcel(bankAccounts);
Ctrl キーを押しながら、F5 キーを押します。 2 つの口座からのデータを含む Excel ワークシートが表示されます。
Word 文書を追加するには
次のコードは、Word アプリケーションを開き、Excel ワークシートにリンクするアイコンを作成します。 この手順の後半で提供されている CreateIconInWordDoc
メソッドを Program
クラスに貼り付けます。 Add メソッドと PasteSpecial メソッドの呼び出しに伴う複雑さが、CreateIconInWordDoc
の名前付き引数と省略可能な引数によって軽減されます。 これらの呼び出しによって、参照パラメーターを持つ COM メソッドの呼び出しを簡略化する 2 つの他の機能が組み込まれます。 第一に、値パラメーターの場合と同様に参照パラメーターに引数を渡すことができます。 つまり、参照パラメーターごとに変数を作成することなく値を直接渡すことができます。 コンパイラは引数の値を保持する一時変数を生成し、呼び出しから戻るときに変数を破棄します。 第二に、引数リスト内の ref
キーワードを省略できます。
Add
メソッドには 4 つの参照パラメーターがあり、これらはすべてオプションです。 既定値を使用する場合は、任意またはすべてのパラメーターの引数を省略できます。
PasteSpecial
メソッドは、クリップボードの内容を挿入します。 このメソッドには 7 つの参照パラメーターがあり、これらはすべてオプションです。 次のコードでは、クリップボードの内容のソースへのリンクを作成する Link
とリンクをアイコンとして表示する DisplayAsIcon
の 2 つの参照パラメーターの引数を指定します。 これら 2 つの引数に名前付き引数を使用して、その他を省略できます。 これらの引数は参照パラメーターですが、ref
キーワードを使用したり、引数として渡す変数を作成したりする必要はありません。 値は直接渡すことができます。
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# 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);
}
次のステートメントを 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 を使用しないプログラミングのメリットの詳細については、「チュートリアル: マネージド アセンブリからの型の埋め込み」をご覧ください。
さらに、dynamic
型は COM メソッドで宣言される必須の型と戻り値の型を表すので、プログラミングがより簡単になります。 型が dynamic
の変数は、実行時まで評価されません。これにより明示的なキャストが不要になります。 詳細については、「dynamic 型の使用」を参照してください。
既定の動作では、PIA を使用せずに型情報を埋め込みます。 この既定値のため、前の例のいくつかが簡素化されます。 明示的なキャストは必要ありません。 たとえば、worksheet
での DisplayInExcel
の宣言は、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 キーを押します。 プロパティの一覧で [相互運用機能型の埋め込み] を見つけて、値を [False] に変更します。 同様に、コマンド プロンプトで EmbedInteropTypes の代わりに References コンパイラ オプションを使用してコンパイルすることができます。
テーブルに追加の書式設定を追加するには
AutoFit
の DisplayInExcel
への 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 列挙型に関するページに掲載されています。
例
コード例全体を次に示します。
using System.Collections.Generic;
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#. 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# 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; }
}
}