访问服务器上的文档中的数据

您可以针对文档级自定义中的数据进行编程,而无需使用 Microsoft 办公室 Word 或 Microsoft 办公室 Excel 的对象模型。 这意味着可以访问服务器上未安装 Word 或 Excel 的文档中包含的数据。 例如,服务器上的代码(例如,在 ASP.NET 页中)可以自定义文档中的数据,并将自定义文档发送到最终用户。 当最终用户打开文档时,解决方案程序集中的数据绑定代码会将自定义数据绑定到文档中。 这是可能的,因为文档中的数据与用户界面分开。 有关详细信息,请参阅 文档级自定义项中的缓存数据。

适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目。 有关详细信息,请参阅办公室应用程序和项目类型提供的功能。

缓存用于服务器上的数据

若要在文档中缓存数据对象,请在设计时使用属性标记它 CachedAttribute ,或在运行时使用 StartCaching 宿主项的方法。 在文档中缓存数据对象时,用于办公室运行时的 Visual Studio Tools 将对象序列化为存储在文档中的 XML 字符串。 对象必须满足某些要求才能符合缓存条件。 有关更多信息,请参见缓存数据

服务器端代码可以操作数据缓存中的任何数据对象。 绑定到缓存数据实例的控件与用户界面同步,以便在客户端上打开文档时自动显示对数据所做的任何服务器端更改。

访问缓存中的数据

可以从办公室外部的应用程序(例如从控制台应用程序、Windows 窗体应用程序或网页)访问缓存中的数据。 访问缓存数据的应用程序必须完全信任;具有部分信任的 Web 应用程序无法插入、检索或更改办公室文档中缓存的数据。

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

  • CachedData 属性返回一个 CachedData,其中包含文档级自定义中的所有缓存数据。

  • 每个 CachedData 对象都包含一个或多个 CachedDataHostItem 对象。 A CachedDataHostItem 包含单个类中定义的所有缓存数据对象。

  • 每个 CachedDataHostItem 对象都包含一个或多个 CachedDataItem 对象。 A CachedDataItem 表示单个缓存的数据对象。

    下面的代码示例演示如何访问 Excel 工作簿项目的类中的 Sheet1 缓存字符串。 此示例是为 Save 该方法提供的大型示例的一部分。

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

修改缓存中的数据

若要修改缓存的数据对象,通常执行以下步骤:

  1. 将缓存对象的 XML 表示形式反序列化为对象的新实例。 可以使用表示缓存数据对象的属性CachedDataItem来访问 XMLXml

  2. 对此副本进行更改。

  3. 使用以下选项之一将已更改的对象序列化回数据缓存:

    • 如果要自动序列化更改,请使用 SerializeDataInstance 该方法。 此方法使用 DiffGram 格式在数据缓存中序列化DataSetDataTable和类型化数据集对象。 DiffGram 格式可确保脱机文档中对数据缓存的更改正确发送到服务器。

    • 如果要对缓存数据所做的更改执行自己的序列化,可以直接写入 Xml 属性。 如果使用 DataAdapter DiffGram 格式更新数据库,并更改了数据集中的数据或类型化数据集中的数据DataTableDataSet。请指定 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 的对象。 修改缓存数据时,此限制有几个后果:

  • 如果将数据缓存中的任何对象设置为 null 值 则打开文档时,数据缓存中的所有对象将自动设置为 null ,并且保存和关闭文档时将清除整个数据缓存。 也就是说,所有缓存的对象都将从数据缓存中删除, CachedData 并且集合将为空。

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

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

如果要从办公室解决方案和办公室外部的应用程序(如Windows 窗体应用程序或 ASP.NET 项目)访问类型化数据集中的数据,则必须在两个项目中引用的单独程序集中定义类型化数据集。 如果使用数据源配置向导或数据集设计器将类型化数据集添加到每个项目,则 .NET Framework 会将两个项目中的类型化数据集视为不同类型的数据集。 有关创建类型化数据集的详细信息,请参阅 在 Visual Studio 中创建和配置数据集。