サーバー上のドキュメント内のデータへのアクセス
Microsoft Office Word または Microsoft Office Excel のオブジェクト モデルを使用しなくても、ドキュメント レベルのカスタマイズ内のデータに対してプログラムを作成できます。これは、Word または Excel がインストールされていないサーバー上のドキュメントに含まれているデータにアクセスできることを意味します。たとえば、(ASP.NET ページ内の) サーバー上のコードは、ドキュメント内のデータをカスタマイズし、カスタマイズされたドキュメントをエンド ユーザーに送信できます。エンド ユーザーがドキュメントを開くと、ソリューション アセンブリのデータ バインディング コードが、カスタマイズされたデータをドキュメントにバインドします。これが可能なのは、ドキュメント内のデータがユーザー インターフェイスから切り離されているためです。詳細については、「ドキュメント レベルのカスタマイズのキャッシュ データ」を参照してください。
対象: このトピックの情報は、Excel 2013 と Excel 2010、および Word 2013 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
サーバー上で使用するデータのキャッシュ
ドキュメント内のデータ オブジェクトをキャッシュするには、デザイン時にそのオブジェクトを CachedAttribute 属性でマークするか、または実行時にホスト項目の StartCaching メソッドを使用します。ドキュメント内のデータ オブジェクトをキャッシュするとき、Visual Studio Tools for Office Runtime は、ドキュメントに格納されている XML 文字列にオブジェクトをシリアル化します。オブジェクトをキャッシュするには、オブジェクトが特定の要件を満たしている必要があります。詳細については、「キャッシュされたデータ」を参照してください。
サーバー側のコードは、データ キャッシュ内の任意のデータ オブジェクトを操作できます。キャッシュされたデータ インスタンスにバインドされているコントロールはユーザー インターフェイスに同期しており、データに加えられるサーバー側のすべての変更は、クライアント上でドキュメントを開くときに自動的に反映されます。
キャッシュ内のデータへのアクセス
コンソール アプリケーション、Windows フォーム アプリケーション、Web ページなど、Office 以外のアプリケーションからキャッシュ内のデータにアクセスできます。キャッシュされたデータにアクセスするアプリケーションは、完全に信頼されている必要があります。部分信頼の Web アプリケーションは、Office ドキュメントにキャッシュされたデータを挿入、取得、または変更できません。
データ キャッシュには、ServerDocument クラスの CachedData プロパティによって公開されるコレクションの階層からアクセスできます。
CachedData プロパティは、ドキュメント レベルのカスタマイズのキャッシュされたすべてのデータを含む Microsoft.VisualStudio.Tools.Applications.CachedData を返します。
各 Microsoft.VisualStudio.Tools.Applications.CachedData には、1 つ以上の CachedDataHostItem オブジェクトが含まれます。CachedDataHostItem には、1 つのクラス内で定義されている、キャッシュされたデータ オブジェクトがすべて含まれます。
各 CachedDataHostItem には、1 つ以上の CachedDataItem オブジェクトが含まれます。CachedDataItem は、1 つのキャッシュされたデータ オブジェクトを表します。
次のコード例は、Excel ブック プロジェクトの Sheet1 クラス内のキャッシュされた文字列にアクセスする方法を示しています。この例は、ServerDocument.Save メソッドのトピックで提供されているコード例の一部分です。
serverDocument1 = New ServerDocument(documentPath)
Dim hostItem1 As CachedDataHostItem = _
serverDocument1.CachedData.HostItems("ExcelWorkbook1.Sheet1")
Dim dataItem1 As CachedDataItem = hostItem1.CachedData("CachedString")
serverDocument1 = new ServerDocument(documentPath);
CachedDataHostItem hostItem1 =
serverDocument1.CachedData.HostItems["ExcelWorkbook1.Sheet1"];
CachedDataItem dataItem1 = hostItem1.CachedData["CachedString"];
キャッシュ内のデータの変更
キャッシュされたデータ オブジェクトを変更するには、通常、次の操作を行います。
キャッシュされたオブジェクトの XML 表現をオブジェクトの新しいインスタンスに逆シリアル化します。XML にアクセスするには、キャッシュされたデータ オブジェクトを表す CachedDataItem の Xml プロパティを使用します。
このコピーに対して変更を加えます。
次のいずれかの方法を使用して、変更を加えたオブジェクトをデータ キャッシュにシリアル化します。
変更を自動的にシリアル化する場合は、SerializeDataInstance メソッドを使います。このメソッドでは、データ キャッシュ内の DataSet、DataTable、および型指定されたデータセット オブジェクトをシリアル化するために DiffGram 形式を使用します。DiffGram 形式により、オフライン ドキュメントのデータ キャッシュに対する変更がサーバーに正しく送信されるようになります。
キャッシュされたデータの変更に対して独自のシリアル化を実行する場合は、Xml プロパティに直接書き込むことができます。DataAdapter を使用し、DataSet、DataTable、または型指定されたデータセット内のデータに対して行われた変更でデータベースを更新する場合は、DiffGram 形式を指定します。それ以外の場合は、既存の行を変更するのではなく新しい行を追加することによって、DataAdapter がデータベースを更新します。
現在の値を逆シリアル化せずにデータを変更する
状況に応じて、現在の値を最初に逆シリアル化せずにキャッシュされたオブジェクトの値を変更することが必要になる場合があります。たとえば、単純型 (たとえば文字列や整数) のオブジェクトの値を変更する場合やサーバー上のドキュメントのキャッシュされた DataSet を初期化する場合に、この操作を行います。この場合、キャッシュされたオブジェクトの現在の値を最初に逆シリアル化することなく SerializeDataInstance メソッドを使用できます。
次のコード例は、Excel ブック プロジェクトの Sheet1 クラス内のキャッシュされた文字列の値を変更する方法を示しています。この例は、ServerDocument.Save メソッドのトピックで提供されているコード例の一部分です。
serverDocument1 = New ServerDocument(documentPath)
Dim hostItem1 As CachedDataHostItem = _
serverDocument1.CachedData.HostItems("ExcelWorkbook1.Sheet1")
Dim dataItem1 As CachedDataItem = hostItem1.CachedData("CachedString")
If dataItem1 IsNot Nothing AndAlso _
Type.GetType(dataItem1.DataType).Equals(GetType(String)) Then
dataItem1.SerializeDataInstance("This is the new cached string value.")
serverDocument1.Save()
End If
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 に設定され、ドキュメントを保存したときおよび閉じたときにデータ キャッシュ全体が消去されます。
キャッシュ内の型指定されたデータセットへのアクセス
Office ソリューションと、Windows フォーム アプリケーションや ASP.NET プロジェクトなどの Office 以外のアプリケーションの両方から、型指定されたデータセット内のデータにアクセスする場合は、両方のプロジェクトで参照される各アセンブリで型指定されたデータセットを定義する必要があります。データ ソース構成ウィザードまたはデータセット デザイナーを使用して、型指定されたデータセットを各プロジェクトに追加すると、.NET Framework では、2 つのプロジェクト内の型指定されたデータセットの型が異なっていると見なされます。型指定されたデータセットの作成の詳細については、「方法 : 型指定されたデータセットを作成する」を参照してください。