サーバー上のドキュメント内のデータにアクセスする

Microsoft Office Word や Microsoft Office Excel のオブジェクト モデルを使用せずに、ドキュメント レベルのカスタマイズ内のデータに対してプログラミングを行うことができます。 つまり、Word や Excel がインストールされていないサーバー上のドキュメントに含まれているデータにアクセスできるということです。 たとえば、サーバー上 (たとえば、ASP.NET ページ内) のコードによって、ドキュメント内のデータをカスタマイズし、カスタマイズされたドキュメントをエンド ユーザーに送信することもできます。 エンド ユーザーがドキュメントを開くと、ソリューション アセンブリ内のデータ バインド コードによって、カスタマイズされたデータがドキュメントにバインドされます。 これが可能なのは、ドキュメント内のデータがユーザー インターフェイスから分離されているためです。 詳細については、「ドキュメント レベルのカスタマイズのキャッシュ データ」を参照してください。

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

サーバーで使用するためのデータをキャッシュする

データ オブジェクトをドキュメント内にキャッシュするには、デザイン時にオブジェクトを CachedAttribute 属性でマークするか、実行時にホスト項目の StartCaching メソッドを使用します。 データ オブジェクトをドキュメント内にキャッシュすると、Visual Studio Tools for Office ランタイムによってオブジェクトがシリアル化され、ドキュメント内に格納される XML 文字列になります。 オブジェクトをキャッシュするには、オブジェクトが特定の要件を満たしている必要があります。 詳細については、「キャッシュ データ」を参照してください。

サーバー側のコードでは、データ キャッシュ内の任意のデータ オブジェクトを操作できます。 キャッシュされたデータ インスタンスにバインドされているコントロールはユーザー インターフェイスと同期されるため、データに対して行われたすべてのサーバー側の変更は、クライアントでドキュメントを開いたときに自動的に表示されます。

キャッシュ内のデータにアクセスする

キャッシュ内のデータには、Office の外部のアプリケーション (たとえば、コンソール アプリケーション、Windows フォーム アプリケーション、Web ページなど) からアクセスすることができます。 キャッシュされたデータにアクセスするアプリケーションは、完全に信頼されている必要があります。部分信頼の Web アプリケーションでは、Office ドキュメントにキャッシュされたデータに対して、挿入、取得、変更の操作を行うことができません。

データ キャッシュには、ServerDocument クラスの CachedData プロパティによって公開されるコレクションの階層を通じてアクセスできます。

  • CachedData プロパティは、ドキュメント レベルのカスタマイズ内にキャッシュされているすべてのデータを格納した CachedData を返します。

  • それぞれに CachedData 1 つ以上 CachedDataHostItem のオブジェクトが含まれています。 CachedDataHostItem には、1 つのクラス内で定義されている、すべてのキャッシュ データ オブジェクトが格納されます。

  • それぞれに CachedDataHostItem 1 つ以上 CachedDataItem のオブジェクトが含まれています。 CachedDataItem は、1 つのキャッシュ データ オブジェクトを表します。

    次のコード例は、Excel ブック プロジェクトの Sheet1 クラス内のキャッシュされた文字列にアクセスする方法を示したものです。 この例は、Save メソッド用に提供されている、より長い例の一部分です。

    serverDocument1 = new ServerDocument(documentPath);
    CachedDataHostItem hostItem1 = 
        serverDocument1.CachedData.HostItems["ExcelWorkbook1.Sheet1"];
    CachedDataItem dataItem1 = hostItem1.CachedData["CachedString"];
    

キャッシュ内のデータを変更する

キャッシュされたデータ オブジェクトに変更を加えるには、通常、次の手順を実行します。

  1. キャッシュされたオブジェクトの XML 表現を、オブジェクトの新規インスタンスへと逆シリアル化します。 XML にアクセスするには、キャッシュされたデータ オブジェクトを表す CachedDataItemXml プロパティを使用します。

  2. このコピーに変更を加えます。

  3. 次のいずれかのオプションを使用して、変更されたオブジェクトをデータ キャッシュへと再びシリアル化します。

    • 変更を自動的にシリアル化したい場合は、SerializeDataInstance メソッドを使用します。 このメソッドでは、データ キャッシュ内の、DataSetDataTable および型指定されたデータセット オブジェクトをシリアル化するために、DiffGram 形式が使用されます。 DiffGram 形式を使用することで、オフライン ドキュメントのデータ キャッシュに対する変更がサーバーに正しく送信されます。

    • キャッシュされたデータを変更するために独自のシリアル化を実行したい場合は、Xml プロパティに操作を直接記述することができます。 DataAdapter を使用してデータベースを更新し、DataSetDataTable、または型指定されたデータセット内のデータに加えられた変更を反映する場合は、DiffGram 形式を指定してください。 そうしなかった場合、DataAdapter では、既存の行を変更するのではなく、新しい行を追加することでデータベースが更新されます。

現在の値を逆シリアル化せずにデータを変更する

場合によっては、最初に現在の値を逆シリアル化せずに、キャッシュされたオブジェクトの値を変更する必要が生じることもあります。 たとえば、単純型のオブジェクト (文字列や整数など) の値を変更する場合や、サーバー上のドキュメントにキャッシュされた DataSet を初期化する場合には、この操作を行う可能性があります。 このような場合には、キャッシュされたオブジェクトの現在の値を最初に逆シリアル化せずに、SerializeDataInstance メソッドを使用します。

次のコード例は、Excel ブック プロジェクトの Sheet1 クラス内のキャッシュされた文字列の値を変更する方法を示したものです。 この例は、Save メソッド用に提供されている、より長い例の一部分です。

serverDocument1 = new ServerDocument(documentPath);
CachedDataHostItem hostItem1 = 
    serverDocument1.CachedData.HostItems["ExcelWorkbook1.Sheet1"];
CachedDataItem dataItem1 = hostItem1.CachedData["CachedString"];

if (dataItem1 != null &&
    Type.GetType(dataItem1.DataType) == typeof(string))
{
    dataItem1.SerializeDataInstance("This is the new cached string value.");
    serverDocument1.Save();
}

データ キャッシュ内の null 値を変更する

ドキュメントを保存して閉じる際、値が null のオブジェクトはデータ キャッシュに格納されません。 この制限事項は、キャッシュされたデータを変更する際に、次のような影響をもたらします。

  • データ キャッシュ内のオブジェクトを 1 つでも null 値に設定すると、ドキュメントを開くときにデータ キャッシュ内のすべてのオブジェクトが自動的に null に設定され、ドキュメントを保存して閉じるときにはデータ キャッシュ全体がクリアされます。 つまり、キャッシュされたオブジェクトがすべてデータ キャッシュから削除され、CachedData コレクションは空になります。

  • データ キャッシュ内に null オブジェクトがあるソリューションをビルドする場合、ドキュメントが初めて開かれる前に ServerDocument クラスを使ってそれらのオブジェクトを初期化したい場合は、データ キャッシュ内のすべてのオブジェクトを初期化する必要があります。 一部のオブジェクトだけを初期化すると、ドキュメントを開いたときにすべてのオブジェクトが null に設定され、ドキュメントを保存して閉じたときにはデータ キャッシュ全体がクリアされます。

キャッシュ内の型指定されたデータセットにアクセスする

Office ソリューションと、Office の外部のアプリケーション (Windows フォーム アプリケーションや ASP.NET プロジェクトなど) の両方から、型指定されたデータセットのデータにアクセスする場合は、両方のプロジェクトで参照される別のアセンブリに、型指定されたデータセットを定義する必要があります。 データ ソース構成ウィザードまたはデータセット デザイナーを使って、型指定されたデータセットを各プロジェクトに追加した場合、.NET Framework では、2 つのプロジェクト内の型指定されたデータセットが異なる型として扱われます。 型指定されたデータセットの作成について詳しくは、「Visual Studio でデータセットを作成および構成する」をご覧ください。