次の方法で共有


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

大事な このトピックで説明する Microsoft Word に関する情報は、Microsoft がカスタム XML に関連する特定の機能の実装を Microsoft Word から削除した 2010 年 1 月より前に 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 は操作ウィンドウのサポートを追加します。これは、スキーマ マップされたドキュメントと共に使用して、ソリューションの拡張エンドユーザー エクスペリエンスを作成できます。 詳細については、「 操作ウィンドウの概要」を参照してください。

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プロパティとプロパティを設定して、バインディングを作成します。

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

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

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

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

次の表に、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;
}