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 アドインのサーバー側を作成できます。

新しいコンソール アプリケーションを作成するには

  1. Visual Studio を起動します。
  2. [ファイル] メニューの [新規作成]をポイントし、 [プロジェクト]をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
  3. [インストールされたテンプレート] ペインで [C#] を展開し、[Windows] を選択します。
  4. [新しいプロジェクト] ダイアログ ボックスの上部で、.NET Framework 4 (またはそれ以降のバージョン) がターゲット フレームワークとして選択されていることを確認します。
  5. [テンプレート] ペインで [コンソール アプリケーション] をクリックします。
  6. [名前] フィールドに、プロジェクトの名前を入力します。
  7. [OK] を選択します。

ソリューション エクスプローラーに新しいプロジェクトが表示されます。

参照を追加するには

  1. ソリューション エクスプローラーで、プロジェクトの名前を右クリックし、[参照の追加] を選択します。 [参照の追加] ダイアログ ボックスが表示されます。
  2. [アセンブリ] ページの [コンポーネント名] 一覧で [Microsoft.Office.Interop.Word] を選択し、Ctrl キーを押しながら [Microsoft.Office.Interop.Excel] を選択します。 アセンブリが表示されない場合は、インストールする必要がある場合があります。 「方法:Office のプライマリ相互運用機能アセンブリをインストールする」を参照してください。
  3. [OK] を選択します。

ディレクティブを使用して必要なものを追加するには

ソリューション エクスプローラーで、Program.cs ファイルを右クリックし、[コードの表示] を選択します。 次の using ディレクティブをコード ファイルの先頭に追加します。

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;

銀行口座の一覧を作成するには

次のクラス定義を Program.csProgram クラスの下に貼り付けます。

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 にエクスポートするメソッドを宣言するには

  1. 次のメソッドを 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 の場合は、返される Objectdynamic に自動的に変換されます。 このプロパティの既定値は 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 コンパイラ オプションを使用してコンパイルすることができます。

テーブルに追加の書式設定を追加するには

AutoFitDisplayInExcel への 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; }
    }
}

関連項目