Доступ к данным в документах на сервере
Можно программировать относительно данных в настройке на уровне документа без необходимости использования объектной модели 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 (cреда выполнения) сериализует объект в XML-строку, которая сохраняется в документе.Чтобы объекты были пригодны для кэширования, они должны соответствовать определенным требованиям.Дополнительные сведения см. в разделе Кэширование данных.
Код на стороне сервера может обрабатывать любые объекты данных в кэше данных.Элементы управления, связанные с экземплярами кэшированных данных, синхронизированы с пользовательским интерфейсом, так что любые изменения данных на стороне сервера автоматически отображаются, когда документ открывается на клиентской стороне.
Доступ к данным в кэше
Доступ к данным в кэше может выполняться из приложений вне Office, например из консольного приложения, из приложения Windows Forms или из веб-страницы.Приложение, которое обращается к кэшированным данным, должно иметь полное доверие; веб-приложение с частичным доверием не может вставлять, извлекать или изменять данные, кэшированные в документе Office.
К кэшу данных имеется доступ через иерархию коллекций, представленных свойством CachedData класса ServerDocument.
Свойство CachedData возвращает объект Microsoft.VisualStudio.Tools.Applications.CachedData, содержащий кэшированные данные в настройке на уровне документа.
Каждый объект Microsoft.VisualStudio.Tools.Applications.CachedData содержит один или несколько объектов CachedDataHostItem.Объект CachedDataHostItem содержит все объекты кэшированных данных, определенные в одном классе.
Каждый объект CachedDataHostItem содержит один или несколько объектов CachedDataItem.Объект CachedDataItem представляет один объект кэшированных данных.
Следующий пример кода демонстрирует доступ к кэшированной строке в классе Sheet1 проекта рабочей книги Excel.Этот пример кода является частью более масштабного примера для метода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 можно получить с помощью свойства Xml элемента CachedDataItem, представляющего объект кэшированных данных.
Внесите изменения в данную копию.
Выполните сериализацию измененного объекта обратно в кэш данных, используя одну из следующих функций:
Если необходимо выполнить автоматическую сериализацию изменений, следует использовать метод SerializeDataInstance.Этот метод использует формат DiffGram для сериализации DataSet, DataTable и объектов типизированного набора данных в кэше данных.Формат DiffGram гарантирует, что изменения в кэше данных автономного документа передаются серверу правильно.
Если необходимо выполнить собственную сериализацию изменений в кэшированные данные, можно написать код непосредственно в свойстве Xml.Задайте формат DiffGram, если DataAdapter используется для обновления базы данных изменениями, выполненными в данных в DataSet, DataTable или в типизированном наборе данных.В противном случае DataAdapter будет обновлять базу данных, добавляя новые строки вместо изменения существующих строк.
Изменение данных без сериализации текущего значения
В отдельных случаях необходимо изменить значение кэшированного объекта без предварительной десериализации текущего значения.Например, это может понадобиться в случае изменения значения объекта, имеющего простой тип, к примеру, строки или целого числа; либо в случае инициализации кэшированного объекта DataSet в документе на сервере.В таком случае можно использовать метод SerializeDataInstance без предварительной десериализации текущего значения кэшированного объекта.
Следующий пример кода демонстрирует изменение значения кэшированной строки в классе Sheet1 проекта рабочей книги Excel.Этот пример кода является частью более масштабного примера для метода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 при открытии документа; при сохранении и закрытии документа будет выполнена полная очистка кэша данных.То есть, все кэшированные объекты будут удалены из кэша данных и коллекция CachedData будет пуста.
При построении решения с объектами null в кэше данных, если необходимо инициализировать данные объекты с помощью класса ServerDocument до первого открытия документа, следует проверить, чтобы все объекты в кэше данных были инициализированы.Если будут инициализированы только некоторые объекты, всем объектам при открытии документа будет присвоено значение null, и при сохранении и закрытии документа будет выполнена полная очистка кэша данных.
Доступ к типизированным наборам данных в кэше
Если необходимо обращаться к данным в типизированном наборе данных как из решения Office, так и из приложения, не входящего в пакет Office, например приложения Windows Forms или проекта ASP.NET, необходимо определить типизированный набор данных в отдельной сборке, на которую будут ссылаться оба проекта.Если типизированный набор данных добавляется к каждому проекту при помощи мастера настройки источника данных или конструктора наборов данных, .NET Framework будет рассматривать типизированные наборы данных в двух проектах как имеющие разные типы.Сведения о создании типизированных наборов данных см. в разделе Практическое руководство. Создание типизированного набора данных.