次の方法で共有


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

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

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

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

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

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

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

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

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

  • 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 には、キャッシュされたデータ オブジェクトを表すXmlCachedDataItem プロパティを使用してアクセスできます。

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

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

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

    • キャッシュされたデータの変更に対して独自のシリアル化を実行する場合は、 Xml プロパティに直接書き込むことができます。 を使用して、DataAdapterDataSet、または型指定されたデータセット内のデータに加えられた変更でデータベースを更新する場合は、DataTable 形式を指定します。 それ以外の場合、 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 値を持つオブジェクトは格納されません。 この制限は、キャッシュされたデータを変更するときにいくつかの結果を招きます。

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

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

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

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