访问服务器上的文档数据

您可以依据文档级自定义项中的数据进行编程,而不必使用 Microsoft Office Word 或 Microsoft Office Excel 的对象模型。 这意味着,您可以在未安装 Word 或 Excel 的服务器上访问包含在文档中的数据。 例如,服务器上的代码(例如,在 ASP.NET 页中)可以自定义文档中的数据,并将自定义文档发送给最终用户。 当最终用户打开文档时,解决方案程序集中的数据绑定代码便会将自定义数据绑定到文档中。 这种做法之所以可行,是因为文档中的数据与用户界面是分离的。 有关更多信息,请参见 文档级自定义项中的缓存数据

**适用于:**本主题中的信息适用于以下应用程序的文档级项目:Excel 2007 和 Excel 2010;Word 2007 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

缓存数据以便在服务器上使用

若要在文档中缓存数据对象,请在设计时使用 CachedAttribute 特性标记该数据对象,或在运行时使用宿主项的 StartCaching 方法。 当您将数据对象缓存在文档中时,Visual Studio Tools for Office Runtime会将该对象序列化为存储在文档中的一个 XML 字符串。 对象必须符合一定的条件才能进行缓存。 有关更多信息,请参见缓存数据

服务器端的代码可操作数据缓存中的任何数据对象。 绑定到已缓存的数据实例的控件与用户界面同步,因此,当在客户端打开文档时,在服务器端对数据所做的任何更改都会自动出现。

访问缓存中的数据

可以从 Office 之外的应用程序访问缓存中的数据,例如,从控制台应用程序、Windows 窗体应用程序或网页进行访问。 访问缓存数据的应用程序必须具备完全信任;具备部分信任的 Web 应用程序不能插入、检索或更改 Office 文档中缓存的数据。

数据缓存可通过由 ServerDocument 类的 CachedData 属性所公开的集合的层次结构进行访问:

下面的代码示例演示如何访问在 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"];

有关演示如何访问缓存的 DataSet 中的数据的代码示例,请参见如何:从服务器上的工作簿中检索缓存的数据

修改缓存中的数据

若要修改缓存数据对象,通常可执行下列操作:

  1. 将缓存对象的 XML 表示形式反序列化为该对象的一个新实例。 通过使用表示该缓存数据对象的 CachedDataItemXml 属性,可以访问与之相应的 XML。

  2. 对此副本进行更改。

  3. 使用下列选项之一,将更改后的对象重新序列化到数据缓存中:

    • 如果要自动序列化所做的更改,请使用 SerializeDataInstance 方法。 此方法使用 DiffGram 格式将 DataSetDataTable 和类型化数据集对象序列化为数据缓存。 DiffGram 格式确保将对脱机文档中的数据缓存更改正确发送到服务器。 有关更多信息,请参见 DiffGram (ADO.NET)

    • 如果希望对缓存数据更改执行自己的序列化,可直接写入 Xml 属性。 如果使用 DataAdapter 更新对 DataSetDataTable 或类型化数据集中的数据进行了更改的数据库,请指定 DiffGram 格式。 否则,DataAdapter 将通过添加新行而不是修改现有行的方式来更新数据库。

有关演示如何通过直接写入 Xml 属性来序列化对缓存数据对象的更改的代码示例,请参见如何:更改服务器上的工作簿中的缓存数据

在不反序列化当前值的情况下修改数据

在某些情况下,可能需要直接修改缓存对象的值,而不是先对当前值进行反序列化。 例如,如果要更改具有简单类型(例如,字符串型或整型)的对象的值,或在服务器上初始化文档中缓存的 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();
}

有关演示如何在服务器上初始化缓存的 DataSet 的代码示例,请参见如何:向服务器上的工作簿中插入数据

修改数据缓存中的 Null 值

在保存和关闭文档时,数据缓存不会存储值为 null 的对象。 此限制会对缓存数据的修改产生下列影响:

  • 在将数据缓存中的任意对象设置为 null 值后,数据缓存中的所有对象都将在文档打开时自动设置为 null,这样在保存和关闭文档时将清除整个数据缓存。 换言之,数据缓存中的所有缓存对象都将被移除,且 CachedData 集合将变为空。

  • 如果生成的解决方案在数据缓存中含有 null 对象,并且您希望在首次打开文档之前使用 ServerDocument 类初始化这些对象,则必须确保初始化该数据缓存中的所有对象。 如果只初始化其中的部分对象,则在打开文档时,所有对象都将设置为 null,这样在保存和关闭文档时将清除整个数据缓存。

访问缓存中的类型化数据集

如果要访问来自 Office 解决方案和 Office 之外的应用程序(如 Windows 窗体应用程序或 ASP.NET 项目)的类型化数据集中的数据,则必须在两个项目中均引用的单独的程序集中定义类型化数据集。 如果使用**“数据源配置向导”“数据集设计器”**向每个项目添加类型化数据集,则 .NET Framework 将这两个项目中的类型化程序集视为不同的类型。 有关创建类型化数据集的更多信息,请参见如何:创建类型化数据集

请参见

任务

如何:从服务器上的工作簿中检索缓存的数据

如何:更改服务器上的工作簿中的缓存数据

如何:向服务器上的工作簿中插入数据

概念

访问服务器上的文档数据

文档级自定义项中的缓存数据

DiffGram (ADO.NET)