共用方式為


存取伺服器上文件中的資料

您可以針對文件層級自訂中的資料進行程式設計,而不需要使用 Microsoft Office Word 或 Microsoft Office Excel 的物件模型。 這表示您可以在未安裝 Word 或 Excel 的伺服器上存取文件中包含的資料。 例如,伺服器上的程式碼 (例如,在 ASP.NET 頁面中) 可以自訂文件中的資料,並將自訂文件傳送給一般使用者。 當使用者開啟文件時,解決方案組件中的資料繫結程式碼會將自訂資料繫結到文件中。 這是可能的,因為文件中的資料與使用者介面是分開的。 如需詳細資訊,請參閱 文件層級自訂中的快取資料

適用於: 本主題中的資訊適用於 Excel 和 Word 的文件層級專案。 如需詳細資訊,請參閱 Office 應用程式和專案類型所提供的功能

將資料快取以供伺服器使用

若要在文件中快取資料物件,請在設計階段將其標記為 CachedAttribute 屬性,或在執行階段使用主機項目的 StartCaching 方法。 當您快取文件中的資料物件時,Visual Studio Tools for Office 執行階段會將物件序列化為儲存在文件中的 XML 字串。 物件必須符合特定條件,才能具備被快取的資格。 如需詳細資訊,請參閱 快取資料

伺服器端程式碼可以操作資料快取中的任何資料物件。 繫結至快取資料執行個體的控制項會與使用者介面同步化,以便在用戶端上開啟文件時,自動顯示對資料所做的任何伺服器端變更。

存取快取中的資料

您可以從 Office 外部的應用程式存取快取中的資料,例如從主控台應用程式、Windows Forms 應用程式或網頁。 存取快取資料的應用程式必須具有完全信任;具有部分信任的 Web 應用程式無法插入、擷取或變更快取在 Office 文件中的資料。

資料快取可透過類別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 表示法還原序列化為物件的新實例。 您可以透過代表快取資料物件的 Xml 屬性來存取 CachedDataItem 中的 XML。

  2. 對此副本進行變更。

  3. 將變更的物件序列化回資料快取,您可以使用下列其中一個選項:

    • 如果您想要自動序列化變更,請使用SerializeDataInstance方法。 此方法使用 DiffGram 格式來序列化資料快取中的DataSetDataTable和類型化的資料集物件。 DiffGram 格式可確保離線文件中資料快取的變更會正確傳送至伺服器。

    • 如果您想要針對快取資料的變更執行自己的序列化,您可以直接寫入 Xml 屬性。 如果您使用 DiffGram 格式,將 DataAdapter, DataSet, 或類型化資料集中的資料變更更新到資料庫,請指定該格式。 否則,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 ,並在儲存和關閉文件時清除整個資料快取。 也就是說,所有快取的物件都會從資料快取中移除,且 CachedData 集合會是空的。

  • 如果您在資料快取中建立了具有空值物件的解決方案,並且想要在第一次開啟文件之前通過ServerDocument類別來初始化這些物件,您必須確保初始化資料快取中的所有物件。 如果您只初始化部分物件,則開啟文件時所有物件都會設定為 空值 ,而儲存和關閉文件時,整個資料快取都會被清除。

存取快取中的類型化資料集

如果您想要從 Office 解決方案和 Office 外部的應用程式 (例如 Windows Forms 應用程式或 ASP.NET 專案) 存取類型化資料集中的資料,您必須在這兩個專案中參考的個別元件中定義類型化資料集。 如果您使用 [資料來源設定 精靈] 或 [資料集設計工具] 將類型化資料集新增至每個專案,.NET Framework 會將兩個專案中的類型化資料集視為不同的類型。 如需建立類型化資料集的詳細資訊,請參閱在 Visual Studio 中建立和設定資料集