Поделиться через


Пошаговое руководство. Изменение кэшированных данных в книге на сервере

Обновлен: Ноябрь 2007

Применение

Сведения, приведенные в данном разделе, относятся только к указанным проектам Visual Studio Tools for Office и версиям приложений Microsoft Office.

Тип проекта

  • Проекты уровня документа

Версия Microsoft Office

  • Excel 2007

  • Excel 2003

Дополнительные сведения см. в разделе Доступность функций по типам приложений и проектов.

В этом пошаговом руководстве описано, как изменить набор данных, кэшированный в рабочей книге Microsoft Office Excel, не запуская Excel, с помощью класса ServerDocument. В этом пошаговом руководстве даны поэтапные инструкции по применению примеров кода, поставляемых в Практическое руководство. Изменение кэшированных данных в книге на сервере.

В данном пошаговом руководстве рассмотрены следующие задачи:

  • Определение набора данных, содержащего данные из базы данных AdventureWorksLT для Microsoft SQL Server 2005.

  • Создание экземпляров набора данных в проекте рабочей книги Excel и проекте консольного приложения.

  • Создание объекта ListObject с привязкой к набору данных в рабочей книге и заполнение объекта ListObject данными при открытии рабочей книги.

  • Добавление набора данных в рабочей книге к кэшу данных.

  • Изменение столбца данных в кэшированном наборе данных путем выполнения кода в консольном приложении, не запуская Excel.

Хотя в этом пошаговом руководстве предполагается, что код выполняется на компьютере разработчика, продемонстрированный здесь код может использоваться и на сервере, на котором не установлен Excel.

Cc442870.alert_note(ru-ru,VS.90).gifПримечание.

На компьютере могут отображаться имена или расположения некоторых элементов пользовательского интерфейса Visual Studio, отличающиеся от указанных в дальнейших инструкциях. Эти элементы определяются используемой версией Visual Studio и ее параметрами. Дополнительные сведения см. в разделе Параметры Visual Studio.

Обязательные компоненты

Ниже приведены компоненты, необходимые для выполнения данного пошагового руководства.

Создание проекта библиотеки классов, определяющего набор данных

Для использования того же набора данных в проекте книги Excel и в консольном приложении необходимо определить набор данных в отдельной сборке, на которую ссылаются оба проекта. Для этого пошагового руководства определите набор данных в проекте библиотеки классов.

Чтобы создать проект библиотеки классов

  1. Запустите Visual Studio.

  2. В меню Файл выберите команду Создать и щелкните Проект.

  3. В панели Типы проектов разверните узел Visual C# или Visual Basic, а затем нажмите Windows.

  4. В области Шаблоны выберите пункт Библиотека классов.

  5. В поле Имя введите AdventureWorksDataSet.

  6. Нажмите Обзор, перейдите в папку %UserProfile%\Мои документы (для Windows XP и более ранних версий) или %UserProfile%\Документы (для Windows Vista) и нажмите Выбрать папку.

  7. В диалоговом окне Новый проект снимите флажок Создать папку для решения.

  8. Нажмите кнопку ОК.

    Visual Studio добавит проект AdventureWorksDataSet в Обозреватель решений и откроет файл кода Class1.cs или Class1.vb.

  9. В обозревателе решений щелкните правой кнопкой мыши Class1.cs или Class1.vb и выберите команду Удалить. В данном пошаговом руководстве этот файл не нужен.

Определение набора данных в проекте библиотеки классов

Определите набор данных, содержащий данные из базы данных AdventureWorksLT для SQL Server 2005. Позднее в этом пошаговом руководстве вы создадите ссылку на этот набор данных в проекте книги Excel и проекте консольного приложения.

Набор данных — типизированный набор данных, представляющий данные в таблице Product базы данных AdventureWorksLT. Дополнительные сведения о типизированных наборах данных см. в разделе Общие сведения о наборах данных в Visual Studio.

Определение типизированного набора данных в проекте библиотеки классов

  1. В обозревателе решений щелкните проект AdventureWorksDataSet.

  2. В меню Данные выберите команду Добавить новый источник данных.

    Появится мастер настройки источника данных.

  3. Щелкните База данных и нажмите кнопку Далее.

  4. Если есть подключение к базе данных AdventureWorksLT database, выберите его и нажмите кнопку Далее.

    В противном случае нажмите кнопку Новое подключение и с помощью диалогового окна Добавить подключение создайте новое подключение. Дополнительные сведения см. в разделе Практическое руководство. Создание подключений к базам данных SQL Server.

  5. На странице Сохранить строку подключения в файл конфигурации приложения нажмите кнопку Далее.

  6. На странице Выбор объектов базы данных разверните узел Таблицы и выберите Product (SalesLT).

  7. Нажмите кнопку Готово.

    Файл AdventureWorksLTDataSet.xsd добавлен к проекту AdventureWorksDataSet. Этот файл определяет следующие элементы:

    • Типизированный набор данных с именем AdventureWorksLTDataSet. Этот набор данных представляет содержимое таблицы Product в базе данных AdventureWorksLT.

    • TableAdapter с именем ProductTableAdapter. Этот адаптер TableAdapter может использоваться для чтения и записи данных в AdventureWorksLTDataSet. Дополнительные сведения см. в разделе Общие сведения об адаптере таблиц.

    Далее в пошаговом руководстве используются оба эти объекта.

  8. В обозревателе решений щелкните правой кнопкой мыши AdventureWorksDataSet и выберите Построить.

    Убедитесь, что проект строится без ошибок.

Создание проекта книги Excel

Создайте проект рабочей книги Excel для интерфейса к данным. Далее в руководстве вы создадите объект ListObject, отображающий данные, и добавите экземпляр набора данных в кэш данных рабочей книги.

Создание проекта книги Excel

  1. В Обозревателе решений щелкните правой кнопкой мыши решение AdventureWorksDataSet, выберите Добавить и затем нажмите Новый проект.

  2. В панели Типы проектов разверните узел Visual C# или Visual Basic, а затем разверните узел Office.

  3. Выберите папку 2007, если используется Excel 2007 на компьютере разработчика, или папку 2003, если используется Excel 2003.

  4. Затем в панели Шаблоны выберите Книга Excel.

  5. В поле Имя введите AdventureWorksReport. Не изменяйте расположение.

  6. Нажмите кнопку ОК.

    Откроется вкладка Мастер проектов набора инструментов Visual Studio Tools for Office.

  7. Убедитесь, что выбрано Создать новый документ и нажмите кнопку OK.

    Visual Studio откроет созданную книгу AdventureWorksReport в конструкторе и добавит проект AdventureWorksReport в обозреватель решений.

Добавление базы данных к источнику данных в проекте книги Excel

Перед тем, как можно будет отобразить набор данных в книге Excel, необходимо добавить набор данных к источникам данных проекта книги Excel.

Добавление набора данных к источникам данных в проекте книги Excel

  1. В Обозревателе решений дважды щелкните Sheet1.cs или Sheet1.vb в проекте AdventureWorksReport.

    Книга откроется в конструкторе.

  2. В меню Данные выберите команду Добавить новый источник данных.

    Появится мастер настройки источника данных.

  3. Нажмите кнопку Объект, а затем Далее.

  4. На странице Выбор объекта для привязки нажмите кнопку Добавить ссылку.

  5. На вкладке Проекты выберите AdventureWorksDataSet, после чего нажмите кнопку ОК.

  6. В пространстве имен AdventureWorksDataSet сборки AdventureWorksDataSet выберите AdventureWorksLTDataSet и нажмите кнопку Готово.

    Откроется окно Источники данных и AdventureWorksLTDataSet будет добавлен к списку источников данных.

Создание элемента ListObject, привязанного к экземпляру набора данных

Для отображения набора данных в книге создайте ListObject с привязкой к экземпляру набора данных. Дополнительные сведения о привязке элементов управления к данным см. в разделе Привязка данных к элементам управления.

Создание элемента ListObject, привязанного к экземпляру базы данных

  1. В окне Источники данных разверните узел AdventureWorksLTDataSet под AdventureWorksDataSet.

  2. Выберите узел Product, щелкните направленную вниз стрелку и выберите в раскрывающемся списке ListObject.

    Если раскрывающийся список не появляется, убедитесь, что рабочая книга открыта в конструкторе.

  3. Перетащите таблицу Product на ячейку A1.

    Элемент управления ListObject с именем productListObject создан на листе с началом в ячейке A1. Одновременно в проект добавляется объект набора данных adventureWorksLTDataSet и BindingSource с именем productBindingSource. ListObject привязан к BindingSource, который, в свою очередь, связан с экземпляром набора данных.

Добавление набора данных к кэшу данных

Для обеспечения возможности коду все книги Excel получить доступ к набору данных в книге необходимо добавить набор данных к кэш данных. Дополнительные сведения о кэше данных см. в разделах Модель данных в настройках уровня документа и Кэширование данных.

Добавление набора данных к кэшу данных

  1. В конструкторе выберите adventureWorksLTDataSet.

  2. В окне Свойства измените значение свойства Modifiers на Public.

  3. Измените значение свойства CacheInDocument на True.

Инициализация набора данных в рабочей книге

Перед тем как вы сможете извлекать данные из кэшированного набора данных с помощью консольного приложения, необходимо заполнить кэшированный набор данных данными.

Инициализация набора данных в рабочей книге

  1. В Обозревателе решений щелкните правой кнопкой мыши файлы Sheet1.cs или Sheet1.vb и выберите Просмотреть код.

  2. Замените обработчик событий Sheet1_Startup следующим кодом. Этот код использует экземпляр класса ProductTableAdapter, определенный в проекте AdventureWorksDataSet, для заполнения кэшированного набора данных данными, если он пуст.

    Private ProductTableAdapter As New  _
        AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter()
    
    Private Sub Sheet1_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
        If Me.NeedsFill("AdventureWorksLTDataSet") Then
            Me.ProductTableAdapter.Fill(Me.AdventureWorksLTDataSet.Product)
        End If
    End Sub
    
    private AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter productTableAdapter =
        new AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter();
    
    private void Sheet1_Startup(object sender, System.EventArgs e)
    {
        if (this.NeedsFill("adventureWorksLTDataSet"))
        {
            this.productTableAdapter.Fill(this.adventureWorksLTDataSet.Product);
        }
    }
    

Контрольная точка

Постройте и выполните проект книги Excel, чтобы убедиться, что он компилируется и выполняется без ошибок. Эта операция также заполняет набор данных и сохраняет его в книге.

Построение и запуск проекта

  1. В Обозревателе решений щелкните правой кнопкой мыши проект AdventureWorksReport, выберите Отладка и нажмите кнопку Запустить новый экземпляр.

    Проект строится и рабочая книга открывается в Excel. Проверьте следующее:

    • ListObject заполняется данными.

    • Значение в столбце ListPrice для первых двух строк ListObject равно 1431,5. Далее в пошаговом руководстве будет использоваться консольное приложение для изменения значений в столбце ListPrice.

  2. Сохраните книгу. Не изменяйте имя файла или расположение книги.

  3. Закройте Excel.

Создание проекта консольного приложения

Создайте проект консольного приложения для изменения данных в кэшированном наборе данных в книге.

Создание проекта консольного приложения

  1. В Обозревателе решений щелкните правой кнопкой мыши решение AdventureWorksDataSet, выберите Добавить и затем нажмите Новый проект.

  2. В панели Типы проектов разверните узел Visual C# или Visual Basic, а затем нажмите Windows.

  3. Выберите область Консольное приложение в области Шаблоны.

  4. В поле Имя введите DataWriter. Не изменяйте расположение.

  5. Нажмите кнопку ОК.

    Visual Studio добавит проект DataWriter к Обозревателю решений и откроет файл кода Program.cs или Module1.vb.

Изменение данных к кэшированном наборе данных с помощью консольного приложения

Используйте класс ServerDocument в консольном приложении для считывания данных в локальный объект AdventureWorksLTDataSet, изменения данных и сохранения в кэшированном наборе данных.

Изменение данных к кэшированном наборе данных

  1. В обозревателе решений щелкните правой кнопкой мыши проект DataWriter и выберите команду Добавить ссылку.

  2. На вкладке .NET выберите одну из следующих сборок:

    • Если на компьютере разработчика используется Excel 2007, выберите Microsoft.VisualStudio.Tools.Applications.ServerDocument.v9.0.

    • Если используется Excel 2003, выберите Microsoft.VisualStudio.Tools.Applications.Runtime.

    Эти сборки определяют различные версии класса ServerDocument, используемого проектами для выпусков 2003 и 2007 системы Microsoft Office. Дополнительные сведения см. в разделе Управление документами на сервере с помощью класса ServerDocument.

  3. Нажмите кнопку ОК.

  4. В обозревателе решений щелкните правой кнопкой мыши проект DataWriter и выберите команду Добавить ссылку.

  5. На вкладке Проекты выберите AdventureWorksDataSet, после чего нажмите кнопку ОК.

  6. Откройте файл Program.cs или Module1.vb в редакторе исходного кода.

  7. Добавьте операторы using (для Visual C#) или Imports (для Visual Basic) в начало файла кода.

    Imports Microsoft.VisualStudio.Tools.Applications
    
    using Microsoft.VisualStudio.Tools.Applications;
    
  8. Добавьте следующий код в метод Main. Этот код объявляет следующие объекты:

    • Экземпляр типа AdventureWorksLTDataSet, определенный в проекте AdventureWorksDataSet.

    • Путь к книге AdventureWorksReport в папке построения проекта AdventureWorksReport.

    • Объект ServerDocument, используемый для доступа к кэшу данных в книге.

      Cc442870.alert_note(ru-ru,VS.90).gifПримечание.

      Следующий код предполагает, что используется книга Excel 2007, имеющая расширение имени файла XLSX. Если книга в проекте имеет иное расширение имени файла, измените путь соответственно.

    Dim productDataSet As New AdventureWorksDataSet.AdventureWorksLTDataSet()
    Dim workbookPath As String = System.Environment.GetFolderPath( _
        Environment.SpecialFolder.MyDocuments) & _
        "\AdventureWorksReport\bin\Debug\AdventureWorksReport.xlsx"
    Dim serverDocument1 As ServerDocument = Nothing
    
    AdventureWorksDataSet.AdventureWorksLTDataSet productDataSet =
        new AdventureWorksDataSet.AdventureWorksLTDataSet();
    string workbookPath = System.Environment.GetFolderPath(
        Environment.SpecialFolder.MyDocuments) +
        @"\AdventureWorksReport\bin\Debug\AdventureWorksReport.xlsx";
    ServerDocument serverDocument1 = null;
    
  9. Добавьте следующий код к методу Main после кода, созданного на предыдущем шаге. Этот код выполняет следующие задачи:

    • Он использует свойство CachedData класса ServerDocument для доступа к кэшированному набору данных в книге.

    • Он считывает данные из кэшированного набора данных в локальный набор данных.

    • Он изменяет значение ListPrice каждого продукта в таблице Product набора данных.

    • Сохраняет изменения в кэшированном наборе данных в книге.

    Try
        serverDocument1 = New ServerDocument(workbookPath)
        Dim dataHostItem1 As CachedDataHostItem = _
            serverDocument1.CachedData.HostItems("AdventureWorksReport.Sheet1")
        Dim dataItem1 As CachedDataItem = dataHostItem1.CachedData("AdventureWorksLTDataSet")
    
        If dataItem1 IsNot Nothing Then
            Console.WriteLine("Before reading data from the cache dataset, the local dataset has " & _
                "{0} rows.", productDataSet.Product.Rows.Count.ToString())
    
            ' Read the cached data from the worksheet dataset into the local dataset.
            Dim schemaReader As New System.IO.StringReader(dataItem1.Schema)
            Dim xmlReader As New System.IO.StringReader(dataItem1.Xml)
            productDataSet.ReadXmlSchema(schemaReader)
            productDataSet.ReadXml(xmlReader)
    
            Console.WriteLine("After reading data from the cache dataset, the local dataset has " & _
                "{0} rows.", productDataSet.Product.Rows.Count.ToString())
    
            ' Modify the prices of each product in the local dataset.
            Dim row As AdventureWorksDataSet.AdventureWorksLTDataSet.ProductRow
            For Each row In productDataSet.Product.Rows
                If row.ProductCategoryID < 20 Then
                    row.ListPrice = row.ListPrice + row.ListPrice * 0.1
                Else
                    row.ListPrice = row.ListPrice - row.ListPrice * 0.1
                End If
            Next row
    
            ' Write the modified local dataset to the worksheet dataset using the DiffGram format.
            Dim stringIn As New System.Text.StringBuilder()
            Dim stringOut As New System.IO.StringWriter(stringIn)
            productDataSet.WriteXml(stringOut, System.Data.XmlWriteMode.DiffGram)
            dataItem1.Xml = stringIn.ToString()
    
            serverDocument1.Save()
            Console.WriteLine("The product prices have been modified.")
        Else
            Console.WriteLine("The data object is not found in the data cache.")
        End If
    Catch ex As System.IO.FileNotFoundException
        Console.WriteLine("The specified workbook does not exist.")
    Catch ex As System.Xml.XmlException
        Console.WriteLine("The data object has invalid XML information.")
    Finally
        If Not (serverDocument1 Is Nothing) Then
            serverDocument1.Close()
        End If
        Console.WriteLine(vbLf & vbLf & "Press Enter to close the application.")
        Console.ReadLine()
    End Try
    
    try
    {
        serverDocument1 = new ServerDocument(workbookPath);
        CachedDataHostItem dataHostItem1 =
            serverDocument1.CachedData.HostItems["AdventureWorksReport.Sheet1"];
        CachedDataItem dataItem1 = dataHostItem1.CachedData["adventureWorksLTDataSet"];
    
        if (dataItem1 != null)
        {
            Console.WriteLine("Before reading data from the cache dataset, the local dataset has " +
                "{0} rows.", productDataSet.Product.Rows.Count.ToString());
    
            // Read the cached data from the worksheet dataset into the local dataset.
            System.IO.StringReader schemaReader = new System.IO.StringReader(dataItem1.Schema);
            System.IO.StringReader xmlReader = new System.IO.StringReader(dataItem1.Xml);
            productDataSet.ReadXmlSchema(schemaReader);
            productDataSet.ReadXml(xmlReader);
    
            Console.WriteLine("After reading data from the cache dataset, the local dataset has " +
                "{0} rows.", productDataSet.Product.Rows.Count.ToString());
    
            // Modify the prices of each product in the local dataset.
            foreach (AdventureWorksDataSet.AdventureWorksLTDataSet.ProductRow row in 
                     productDataSet.Product.Rows)
            {
                if (row.ProductCategoryID < 20)
                {
                    row.ListPrice = row.ListPrice + (row.ListPrice * (Decimal).10);
                }
                else
                {
                    row.ListPrice = row.ListPrice - (row.ListPrice * (Decimal).10);
                }
            }
    
            // Write the modified local dataset to the worksheet dataset using the DiffGram format.
            System.Text.StringBuilder stringIn = new System.Text.StringBuilder();
            System.IO.StringWriter stringOut = new System.IO.StringWriter(stringIn);
            productDataSet.WriteXml(stringOut, System.Data.XmlWriteMode.DiffGram);
            dataItem1.Xml = stringIn.ToString();
    
            serverDocument1.Save();
            Console.WriteLine("The product prices have been modified.");
        }
        else
        {
            Console.WriteLine("The data object is not found in the data cache.");
        }
    }
    catch (System.IO.FileNotFoundException)
    {
        Console.WriteLine("The specified workbook does not exist.");
    }
    catch (System.Xml.XmlException)
    {
        Console.WriteLine("The data object has invalid XML information.");
    }
    finally
    {
        if (serverDocument1 != null)
        {
            serverDocument1.Close();
        }
    
        Console.WriteLine("\n\nPress Enter to close the application.");
        Console.ReadLine();
    }
    
  10. В Обозревателе решений щелкните правой кнопкой мыши на проекте DataWriter, выберите Отладка и нажмите кнопку Запустить новый экземпляр.

    Консольное приложение выводит сообщения при считывании кэшированного набора данных в локальный набор данных, изменяет цены продуктов в локальном наборе данных и сохраняет новые значения к кэшированном наборе данных. Чтобы закрыть приложение, нажмите клавишу ENTER.

Тестирование книги

При открытии книги ListObject теперь отображает изменения, сделанные в столбце ListPrice данных в кэшированном наборе данных.

Тестирование книги

  1. Закройте книгу AdventureWorksReport в конструкторе Visual Studio, если она все еще открыта.

  2. Откройте книгу AdventureWorksReport, находящуюся в папке построения проекта AdventureWorksReport. По умолчанию папка построения — это следующая папка:

    • %UserProfile%\Мои документы\AdventureWorksReport\bin\Debug (для Windows XP и более ранних версий)

    • %UserProfile%\Документы\AdventureWorksReport\bin\Debug (для Windows Vista)

  3. Проверьте, чтобы значение в столбце ListPrice для первой строки ListObject было равно 1574,65.

  4. Закройте книгу.

Следующие действия

Подробные сведения о работе с кэшированными данными можно узнать в следующих разделах:

См. также

Задачи

Практическое руководство. Вставка данных в книгу на сервере

Практическое руководство. Извлечение кэшированных данных из рабочей книги на сервере

Пошаговое руководство. Вставка данных в книгу на сервере

Практическое руководство. Вставка данных в документы без записи на диск

Основные понятия

Общие сведения о подключении к данным в Visual Studio