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 (Visual Studio Tools for Office) は、.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 OfficeProgrammingWalkthruComplete
{
    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 particular 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; }
    }
}

関連項目