次の方法で共有


ドキュメント レベルのカスタマイズにおける XML スキーマとデータ

重要 このトピックに記載されている Microsoft Word 関連の情報は、米国およびその領土外に居住しているか、2010 年 1 月 (Microsoft によって、カスタム XML に関連する特定の機能の実装が Microsoft Word から削除された月) 以前に Microsoft によってライセンス供与された Microsoft Word 製品上でプログラムを使用または開発している、個人または組織のみに向けたものです。 Microsoft Word に関するこの情報は、2010 年 1 月 10 日以降に Microsoft によってライセンス供与された Microsoft Word 製品を使用している、またはその上で実行されるプログラムを開発している米国内の個人または組織は対象外であり、使用することはできません。それらの製品は、その日付より前にライセンス供与された製品または米国外で使用するために購入およびライセンス供与された製品と同様に動作することはありません。

適用対象: このトピックの情報は、Excel および Word のドキュメント レベルのプロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

Microsoft Office Excel と Microsoft Office Word には、ドキュメントにスキーマをマップする機能が用意されています。 この機能を使用すると、ドキュメント内の XML データのインポートとエクスポートを簡単に行うことができます。

Visual Studio では、ドキュメント レベルのカスタマイズ内のマップされたスキーマ要素が、プログラミング モデルのコントロールとして公開されます。 Excel に関しては、Visual Studio では、データベース、Web サービス、およびオブジェクト内のデータにコントロールをバインドするためのサポートが追加されます。 Word と Excel に関しては、Visual Studio では、操作ウィンドウのサポートが追加されます。これをスキーマ マップ ドキュメントと共に使用することで、ソリューションのエンドユーザー エクスペリエンスを向上させることができます。 詳しくは、「操作ウィンドウの概要」をご覧ください。

Note

Excel ソリューションでは、マルチパート XML スキーマを使用することはできません。

Excel ブックにスキーマがアタッチされるときに作成されるオブジェクト

ブックにスキーマをアタッチすると、Visual Studio によって複数のオブジェクトが自動的に作成され、プロジェクトに追加されます。 これらのオブジェクトは Excel によって管理されるので、Visual Studio ツールを使って削除しないようにしてください。 これらを削除するには、マップされた要素をワークシートから削除するか、Excel ツールを使ってスキーマをデタッチします。

主なオブジェクトは次の 2 つです。

  • XML スキーマ (XSD ファイル)。 ブック内のすべてのスキーマを対象に、Visual Studio によってスキーマがプロジェクトに追加されます。 これは、ソリューション エクスプローラーで、XSD 拡張子を持つプロジェクト項目として表示されます。

  • 型指定された DataSet クラス。 このクラスは、スキーマに基づいて作成されます。 このデータセット クラスは、クラス ビューに表示されます。

Excel ワークシートにスキーマ要素がマップされるときに作成されるオブジェクト

XML ソースの作業ウィンドウからワークシートにスキーマ要素をマップすると、Visual Studio によって複数のオブジェクトが自動的に作成され、プロジェクトに追加されます。

  • コントロール ブック内でマップされたすべてのオブジェクトを対象に、XmlMappedRange コントロール (非繰り返しスキーマ要素用) または ListObject コントロール (繰り返しスキーマ要素用) がプログラミング モデル内で作成されます。 ListObject コントロールを削除するための唯一の方法は、マッピングとマップされたオブジェクトをブックから削除することです。 コントロールについて詳しくは、「ホスト項目とホスト コントロールの概要」をご覧ください。

  • BindingSource。 非繰り返しスキーマ要素をワークシートにマップして XmlMappedRange を作成すると、BindingSource が作成され、XmlMappedRange コントロールが BindingSource にバインドされます。 BindingSource は、ドキュメントにマップされたスキーマに一致するデータ ソースのインスタンス (作成された型指定の DataSet クラスのインスタンスなど) にバインドする必要があります。 バインドは、 プロパティと プロパティを設定することによって作成します (これらはDataSourceプロパティDataMember ウィンドウに表示されます)。

    Note

    BindingSource は、ListObject オブジェクトに対しては作成されません。 プロパティ ウィンドウで DataSource プロパティと DataMember プロパティを設定して、ListObject をデータ ソースに手動でバインドする必要があります。

Office のマップされたスキーマと Visual Studio のデータ ソース ウィンドウ

Office の "マップされたスキーマ" の機能と Visual Studio の [データ ソース] ウィンドウはどちらも、レポートや編集のために Excel ワークシートにデータを表示するのに役立ちます。 どちらの場合も、データ要素を Excel ワークシートにドラッグできます。 どちらの方法でも、BindingSource を通じて DataSet や Web サービスなどのデータ ソースにデータ バインドされたコントロールが作成されます。

Note

繰り返しスキーマ要素をワークシートにマップすると、Visual Studio によって ListObject が作成されます。 ListObject は、BindingSource を通じてデータに自動的にはバインドされません。 プロパティ ウィンドウで DataSource プロパティと DataMember プロパティを設定して、ListObject をデータ ソースに手動でバインドする必要があります。

次の表に、2 つの方法の違いを示します。

XML スキーマ [データ ソース] ウィンドウ
Office インターフェイスを使用します。 Visual Studio の [データ ソース] ウィンドウを使用します。
XML ファイルからデータをインポートおよびエクスポートするための、組み込みの Office 機能を有効にします。 インポートとエクスポートの機能をプログラムによって提供する必要があります。
生成されたコントロールにデータを入力するためのコードを記述する必要があります。 [データ ソース] ウィンドウから追加されたコントロールでは、データを入力するためのコードが自動的に生成されます。また、データベース サーバーを使用する場合は、必要な接続文字列も生成されます。

Word 文書にスキーマがアタッチされたときの動作

ドキュメント レベルの Office プロジェクトで使用される Word 文書にスキーマをアタッチした場合、データ オブジェクトは作成されません。 ただし、ドキュメントにスキーマ要素をマップした場合には、コントロールが作成されます。 コントロールの種類は、マップした要素の種類によって決まります。繰り返し要素の場合は XMLNodes コントロールが生成され、非繰り返し要素の場合は XMLNode コントロールが生成されます。 詳しくは、「XMLNodes コントロール」および「XMLNode コントロール」をご覧ください。

XML スキーマを含んだソリューションの配置

ドキュメントにマップされた XML スキーマを使用するソリューションを配置するには、インストーラーを作成する必要があります。 インストーラーでは、ユーザーのコンピューターのスキーマ ライブラリにスキーマを登録する必要があります。 スキーマを登録しなかった場合でも、ソリューションは機能します。ユーザーがドキュメントを開いたときに、ドキュメント内の要素に基づいて一時スキーマが生成されるためです。 ただし、プロジェクトの作成に使用されたスキーマをユーザーが検証したり保存したりすることはできません。 インストーラーの詳細については、「アプリケーション、サービス、およびコンポーネントの配置」をご覧ください。

スキーマがライブラリ内にあり、登録済みであることを確認するためのコードをプロジェクトに追加することもできます。 未登録の場合には、ユーザーに警告を表示することができます。

// Ensure that the schema is in the library and registered with the document.
private bool CheckSchema()
{
    const string namespaceUri = "http://schemas.contoso.com/projects";
    bool namespaceFound = false;
    bool namespaceRegistered = false;

    foreach (Word.XMLNamespace n in Application.XMLNamespaces)
    {
        if (n.URI == namespaceUri)
        {
            namespaceFound = true;
        }
    }

    if (!namespaceFound)
    {
        MessageBox.Show("XML Schema is not in library.");
        return false;
    }

    foreach (Word.XMLSchemaReference r in this.XMLSchemaReferences) 
    {
        if (r.NamespaceURI == namespaceUri)
        {
            namespaceRegistered = true;
        }
    }

    if (!namespaceRegistered)
    {
        MessageBox.Show("XML Schema is not registered for this document.");
        return false;
    }
    
    return true;
}