Tutorial: Cambiar los datos almacenados en caché de un libro de trabajo de un servidor
Actualización: noviembre 2007
Se aplica a |
---|
La información de este tema sólo se aplica a los proyectos de Visual Studio Tools para Office y versiones de Microsoft Office especificados. Tipo de proyecto
Versión de Microsoft Office
Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto. |
Este tutorial muestra cómo modificar un conjunto de datos que está almacenado en memoria caché en un libro de Microsoft Office Excel sin iniciar Excel, mediante la clase ServerDocument. Este tutorial proporciona instrucciones paso a paso para utilizar los ejemplos de código que se proporcionan en Cómo: Cambiar los datos almacenados en caché en un libro ubicado en un servidor.
Este tutorial ilustra las tareas siguientes:
Definir un conjunto de datos que contenga datos de la base de datos AdventureWorksLT para Microsoft SQL Server 2005.
Crear instancias del conjunto de datos en un proyecto de libro de Excel y un proyecto de aplicación de consola.
Crear un objeto ListObject enlazado al conjunto de datos del libro y rellenar ListObject con datos al abrir el libro.
Agregar el conjunto de datos del libro a la memoria caché de datos.
Modificar una columna de datos del conjunto de datos almacenado en memoria caché ejecutando código en la aplicación de consola, sin iniciar Excel.
Si bien en este tutorial se supone que el código se ejecuta en un equipo de desarrollo, el código que se muestra en este tutorial puede utilizarse en un servidor que no tenga instalado Excel.
Nota: |
---|
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que tenga y la configuración que esté utilizando determinan estos elementos. Para obtener más información, vea Valores de configuración de Visual Studio. |
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio Tools para Office (componente opcional de Visual Studio 2008 Professional y Visual Studio Team System).
Visual Studio Tools para Office se instala de forma predeterminada con las versiones mostradas de Visual Studio. Para comprobar si está instalado, consulte Instalar Visual Studio Tools para Office.
Excel 2007 o Excel 2003.
Acceso a una instancia en ejecución de SQL Server 2005 o SQL Server 2005 Express que tenga asociada la base de datos de ejemplo AdventureWorksLT. La base de datos AdventureWorksLT se puede descargar desde el sitio web de CodePlex. Para obtener más información sobre cómo asociar una base de datos, vea los siguientes temas:
Para adjuntar una base de datos mediante SQL Server Management Studio o SQL Server Management Studio Express, vea Cómo adjuntar una base de datos (SQL Server Management Studio).
Para adjuntar una base de datos mediante la línea de comandos, vea Cómo adjuntar un archivo de base de datos a SQL Server Express.
Crear un proyecto de biblioteca de clases que defina un conjunto de datos
Para utilizar el mismo conjunto de datos en un libro de Excel y en una aplicación de consola, debe definirlo en un ensamblado independiente al que ambos proyectos hagan referencia. Para este tutorial, defina el conjunto de datos en un proyecto de biblioteca de clases.
Para crear el proyecto de bibliotecas de clase
Inicie Visual Studio.
En el menú Archivo, elija Nuevo y haga clic en Proyecto.
En el panel Tipos de proyecto, expanda Visual C# o Visual Basic y, a continuación, haga clic en Windows.
En el panel Plantillas, seleccione Biblioteca de clases.
En el cuadro Nombre, escriba AdventureWorksDataSet.
Haga clic en Examinar, vaya a la carpeta %UserProfile%\Mis documentos (para Windows XP y versiones anteriores) o la carpeta %UserProfile%\Documentos (para Windows Vista) y, a continuación, haga clic en Seleccionar carpeta.
En el cuadro de diálogo Nuevo proyecto, asegúrese de que no esté activada la casilla Crear directorio para la solución.
Haga clic en Aceptar.
Visual Studio agrega el proyecto AdventureWorksDataSet al Explorador de soluciones y abre el archivo de código Class1.cs o Class1.vb.
En el Explorador de soluciones, haga clic con el botón secundario en Class1.cs o Class1.vb y, a continuación, haga clic en Eliminar. No necesita este archivo para este tutorial.
Definir un conjunto de datos en el proyecto de biblioteca de clases
Defina un conjunto de datos con tipo que contenga datos de la base de datos AdventureWorksLT para SQL Server 2005. Más adelante en este tutorial, va a hacer referencia a esta base de datos en un proyecto de libro de Excel y un proyecto de aplicación de consola.
El conjunto de datos es un conjunto de datos con tipo que representa los datos de la tabla Product en la base de datos AdventureWorksLT. Para obtener más información sobre los conjuntos de datos con tipo, vea Información general sobre conjuntos de datos en Visual Studio.
Para definir un conjunto de datos con tipo en el proyecto de biblioteca de clases
En el Explorador de soluciones, haga clic en el proyecto AdventureWorksDataSet.
En el menú Datos, haga clic en Agregar nuevo elemento.
Se abrirá el Asistente para la configuración de orígenes de datos.
Haga clic en Base de datos y, a continuación, haga clic en Siguiente.
Si ya existe una conexión con la base de datos AdventureWorksLT, elija esta conexión y, a continuación, haga clic en Siguiente.
De lo contrario, haga clic en Nueva conexión y utilice el cuadro de diálogo Agregar conexión para crear la nueva conexión. Para obtener más información, vea Cómo: Crear conexiones a bases de datos de SQL Server.
En la página Guardar la cadena de conexión en el archivo de configuración de la aplicación, haga clic en Siguiente.
En la página Elija los objetos de base de datos, expanda Tablas y, a continuación, seleccione Product (SalesLT).
Haga clic en Finalizar.
Se agrega el archivo AdventureWorksLTDataSet.xsd al proyecto AdventureWorksDataSet. Este archivo define los siguientes elementos:
Un conjunto de datos con tipo denominado AdventureWorksLTDataSet. Este conjunto de datos representa el contenido de la tabla Product en la base de datos AdventureWorksLT.
Objeto TableAdapter denominado ProductTableAdapter. Este TableAdapter puede usarse para leer y escribir datos en AdventureWorksLTDataSet. Para obtener más información, vea Información general sobre TableAdapter.
Estos dos objetos se utilizarán más adelante en este tutorial.
En el Explorador de soluciones, haga clic con el botón secundario en AdventureWorksDataSet y, a continuación, haga clic en Generar.
Compruebe si el proyecto se genera sin errores.
Crear un proyecto de libro de Excel
Cree un proyecto de libro de Excel para la interfaz a los datos. Más adelante en este tutorial, va a crear un control ListObject que muestre los datos y va a agregar una instancia del conjunto de datos a la memoria caché de datos del libro.
Para crear un proyecto de libro de Excel
En el Explorador de soluciones, haga clic con el botón secundario en la solución AdventureWorksDataSet, elija Agregar y, a continuación, haga clic en Nuevo proyecto.
En el panel Tipos de proyecto, expanda Visual C# o Visual Basic y, a continuación, expanda Office.
Seleccione la carpeta 2007 si utiliza Excel 2007 en el equipo de desarrollo, o bien, seleccione la carpeta 2003 si utiliza Excel 2003.
En el panel Plantillas, seleccione Libro de Excel.
En el cuadro Nombre, escriba AdventureWorksReport. No modifique la ubicación.
Haga clic en Aceptar.
Se abre el Asistente para proyectos de Visual Studio Tools para Office.
Asegúrese de que esté seleccionada la opción Crear un nuevo documento y, a continuación, haga clic en Aceptar
Visual Studio abre el libro AdventureWorksReport en el diseñador y agrega el proyecto AdventureWorksReport al Explorador de soluciones.
Agregar el conjunto de datos a los orígenes de datos en el proyecto de libro de Excel
Para poder mostrar el conjunto de datos en el libro de Excel, es preciso agregarlo primero a los orígenes de datos en el proyecto de libro de Excel.
Para agregar el conjunto de datos a los orígenes de datos en el proyecto de libro de Excel
En el Explorador de soluciones, haga doble clic en Sheet1.cs o Sheet1.vb debajo del proyecto AdventureWorksReport.
El libro se abre en el diseñador.
En el menú Datos, haga clic en Agregar nuevo elemento.
Se abrirá el Asistente para la configuración de orígenes de datos.
Haga clic en Objeto y, a continuación, haga clic en Siguiente.
En la página Seleccione el objeto que desee enlazar a, haga clic en Agregar referencia.
En la ficha Proyectos, haga clic en AdventureWorksDataSet y, a continuación, haga clic en Aceptar.
Debajo del espacio de nombres AdventureWorksDataSet del ensamblado AdventureWorksDataSet, haga clic en AdventureWorksLTDataSet y, a continuación, haga clic en Finalizar.
Se abre la ventana Orígenes de datos y se agrega AdventureWorksLTDataSet a la lista de orígenes de datos.
Crear un control ListObject enlazado a una instancia del conjunto de datos
Para mostrar el conjunto de datos en el libro, cree un control ListObject que esté enlazado a una instancia del conjunto de datos. Para obtener más información sobre cómo enlazar controles a datos, vea Enlazar datos a controles.
Para crear un control ListObject enlazado a una instancia del conjunto de datos
En la ventana Orígenes de datos, expanda el nodo AdventureWorksLTDataSet debajo de AdventureWorksDataSet.
Seleccione el nodo Producto, haga clic en la flecha desplegable que aparece y, a continuación, seleccione ListObject en la lista desplegable.
Si no aparece la flecha desplegable, confirme que el libro está abierto en el diseñador.
Arrastre la tabla Product hasta la celda A1.
Se crea un control ListObject denominado productListObject en la hoja de cálculo, a partir de la celda A1. Al mismo tiempo, se agregan al proyecto un objeto de conjunto de datos denominado adventureWorksLTDataSet y una clase BindingSource denominada productBindingSource. El control ListObject se enlaza al componente BindingSource, que a su vez se enlaza al objeto de base de datos.
Agregar el conjunto de datos a la memoria caché de datos
Para permitir que código fuera del proyecto de libro de Excel obtenga acceso al conjunto de datos del libro, debe agregar el conjunto de datos a la memoria caché de datos. Para obtener más información sobre la memoria caché de datos, vea Modelo de datos en las personalizaciones de nivel de documento y Almacenar datos en caché.
Para agregar el conjunto de datos a la memoria caché de datos
En el diseñador, haga clic en adventureWorksLTDataSet.
En la ventana Propiedades, establezca la propiedad Modifiers en Public.
Establezca la propiedad CacheInDocument en True.
Inicializar el conjunto de datos en el libro
Antes de poder recuperar los datos del conjunto de datos almacenado en memoria caché utilizando la aplicación de consola, debe rellenarlo con datos.
Para inicializar el conjunto de datos en el libro
En el Explorador de soluciones, haga clic con el botón secundario en Sheet1.cs o Sheet1.vb y seleccione Ver código.
Reemplace el controlador de evento Sheet1_Startup con el código siguiente. Este código utiliza una instancia de la clase ProductTableAdapter definida en el proyecto AdventureWorksDataSet para rellenar con datos el conjunto de datos almacenado en memoria caché, si actualmente está vacío.
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); } }
Punto de control
Genere y ejecute el proyecto de libro de Excel para asegurarse de que se compile y se ejecute sin errores. Esta operación también rellena el conjunto de datos almacenado en memoria caché y guarda los datos en el libro.
Para generar y ejecutar el proyecto
En el Explorador de soluciones, haga clic con el botón secundario en el proyecto AdventureWorksReport, elija Depurar y, a continuación, haga clic en Iniciar nueva instancia.
Se genera el proyecto y se abre el libro en Excel. Compruebe lo siguiente:
ListObject se rellena con datos.
El valor de la columna ListPrice de la primera fila de ListObject es 1431.5. Más adelante en este tutorial utilizará una aplicación de consola para modificar los valores de la columna ListPrice.
Guarde el libro. No modifique el nombre de archivo ni la ubicación del libro.
Cierre Excel.
Crear un proyecto de aplicación de consola
Cree un proyecto de aplicación de consola que utilizará para modificar los datos contenidos en el conjunto de datos almacenado en memoria caché del libro.
Para crear un proyecto de aplicación de consola
En el Explorador de soluciones, haga clic con el botón secundario en la solución AdventureWorksDataSet, elija Agregar y, a continuación, haga clic en Nuevo proyecto.
En el panel Tipos de proyecto, expanda Visual C# o Visual Basic y, a continuación, haga clic en Windows.
En el panel Plantillas, seleccione Aplicación de consola.
En el cuadro Nombre, escriba DataWriter. No modifique la ubicación.
Haga clic en Aceptar.
Visual Studio agrega el proyecto DataWriter al Explorador de soluciones y abre el archivo de código Program.cs o Module1.vb.
Cambiar los datos del conjunto de datos almacenado en memoria caché utilizando la aplicación de consola
Utilice la clase ServerDocument en la aplicación de consola para leer los datos y copiarlos en un objeto AdventureWorksLTDataSet local, modifique estos datos y, a continuación, vuelva a guardarlos en el conjunto de datos almacenado en memoria caché.
Para cambiar los datos en el conjunto de datos almacenado en memoria caché
En el Explorador de soluciones, haga clic con el botón secundario en el proyecto DataWriter y, a continuación, haga clic en Agregar referencia.
En la ficha .NET, seleccione uno de los siguientes ensamblados:
Si utiliza Excel 2007 en el equipo de desarrollo, seleccione Microsoft.VisualStudio.Tools.Applications.ServerDocument.v9.0.
Si utiliza Excel 2003, seleccione Microsoft.VisualStudio.Tools.Applications.Runtime.
Estos ensamblados definen diferentes versiones de la clase ServerDocument que se utilizan en los proyectos para 2007 Microsoft Office system y Microsoft Office 2003. Para obtener más información, vea Administrar documentos en un servidor mediante la clase ServerDocument.
Haga clic en Aceptar.
En el Explorador de soluciones, haga clic con el botón secundario en el proyecto DataWriter y, a continuación, haga clic en Agregar referencia.
En la ficha Proyectos, seleccione AdventureWorksDataSet y, a continuación, haga clic en Aceptar.
Abra el archivo Program.cs o Module1.vb en el Editor de código.
Agregue la siguiente instrucción using (para C#) o Imports (para Visual Basic) al principio del archivo de código.
Imports Microsoft.VisualStudio.Tools.Applications
using Microsoft.VisualStudio.Tools.Applications;
Agregue el código siguiente al método Main. Este código declara los siguientes objetos:
Una instancia del tipo AdventureWorksLTDataSet que se define en el proyecto AdventureWorksDataSet.
La ruta de acceso al libro AdventureWorksReport en la carpeta de compilación del proyecto AdventureWorksReport.
Un objeto ServerDocument que se va a usar para obtener acceso a la memoria caché de datos en el libro.
Nota: El código siguiente supone que está utilizando un libro de Excel 2007 con la extensión de archivo .xlsx. Si el libro del proyecto tiene una extensión de archivo diferente, modifique la ruta de acceso según proceda.
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;
Agregue el siguiente código al método Main, después del código que agregó en el paso anterior. Este código realiza las tareas siguientes:
Utiliza la propiedad CachedData de la clase ServerDocument para obtener acceso al conjunto de datos almacenado en caché del libro.
Lee los datos del conjunto de datos almacenado en memoria caché y los copia en el conjunto de datos local.
Cambia el valor de ListPrice de cada producto en la tabla Product del conjunto de datos.
Guarda los cambios en el conjunto de datos almacenado en memoria caché del libro.
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(); }
En el Explorador de soluciones, haga clic con el botón secundario en el proyecto DataWriter, elija Depurar y, a continuación, haga clic en Iniciar nueva instancia.
La aplicación de consola muestra mensajes mientras lee el conjunto de datos almacenado en memoria caché y los copia en el conjunto de datos local, modifica los precios de productos en el conjunto de datos local y guarda los nuevos valores en el conjunto de datos almacenado en memoria caché. Presione ENTRAR para cerrar la aplicación.
Probar el libro
Al abrir el libro, ListObject muestra ahora los cambios que realizó en la columna ListPrice de datos del conjunto de datos almacenado en memoria caché.
Para probar el libro
Cierre el libro AdventureWorksReport en el diseñador de Visual Studio, si todavía está abierto.
Abra la ruta de acceso al libro AdventureWorksReport que se encuentra en la carpeta de compilación del proyecto AdventureWorksReport. De forma predeterminada, la carpeta de compilación está en una de las ubicaciones siguientes:
%UserProfile%\Mis documentos\AdventureWorksReport\bin\Debug (para Windows XP y versiones anteriores)
%UserProfile%\Documentos\AdventureWorksReport\bin\Debug (para Windows Vista)
Compruebe que el valor de la columna ListPrice correspondiente a la primera fila de ListObject es ahora 1574.65.
Cierre el libro.
Pasos siguientes
Para obtener más información sobre cómo trabajar con datos almacenados en caché, vea estos temas:
Inicializar los datos en un conjunto de datos almacenado en memoria caché sin iniciar Excel. Para obtener más información, vea Tutorial: Insertar datos en un libro de trabajo de un servidor.
Insertar los datos en la caché de datos de un documento de Word como una matriz de bytes en memoria, en lugar de guardarlos en un disco duro. Para obtener más información, vea Cómo: Insertar datos en documentos sin escribir en el disco.
Vea también
Tareas
Cómo: Insertar datos en un libro ubicado en un servidor
Cómo: Recuperar los datos almacenados en la memoria caché de un libro ubicado en un servidor
Tutorial: Insertar datos en un libro de trabajo de un servidor
Cómo: Insertar datos en documentos sin escribir en el disco