Excel 2007 y Silverlight 3

Marzo 16, 2010
Por Alejandro Tamayo Castillo

Existen varias aplicaciones empresariales (algunos ERPs) que utilizan Microsoft Excel como medio de entrada de información. Siendo más especifico, por ejemplo, la declaración de nuevos elementos a un almacén en un control de inventarios puede “escribirse” utilizando un modelo de Excel (hoja de cálculo con un formato en específico). El proceso sería el siguiente:

  1. El usuario rellena una hoja de Excel con un formato determinado.
  2. El usuario abre la aplicación empresarial y desde la misma, siguiendo la interfaz particular de dicha aplicación, abre el fichero Excel.
  3. La aplicación empresarial conoce el formato de Excel y permite previsualizar (sin necesidad de tener Microsoft Office instalado) los datos antes de realizar la importación.
  4. Cuando el usuario verifica los datos previsualizados, entonces ejecuta una acción (Botón) y se importan los datos al sistema.

Utilizar Excel para estos fines es muy conveniente producto de la potencia y la facilidad que brinda este gran producto. Ahora, supongamos que esta aplicación empresarial está desarrollada con Silverlight (y de manera opcional WCF RIA Services como mecanismo de acceso a datos). ¿Cómo sería en el escenario de Silverlight el proceso anterior?

En principio habría que resaltar que en una aplicación empresarial desarrollada con Silverlight existe el código que ejecuta del lado del Servidor (la conexión con el servidor de datos y parte de la lógica del negocio) y el código Silverlight que ejecuta en el navegador web del usuario. Estas dos partes se comunican a través de la Web (Protocolo HTTP) generalmente mediante Servicios Web (SOAP o RESTFul en dependencia de la arquitectura seleccionada, dígase SOA o ROA respectivamente).

Bajo estas condiciones, una variante podría ser enviar el fichero Excel hacia el servidor, procesarlo, y una vez procesados los datos, devolverlos hacia la aplicación Silverlight para que el usuario verifique la misma. Pero note que en este esquema la información viaja doble a través de la red siendo esto un inconveniente.

A partir de la versión 2007 de Microsoft Office, el formato de los documentos pasó a ser de un binario críptico (versiones 2003 y anteriores) a un formato estándar bien documentado que puede describirse de manera simplista como un ZIP que contiene un gran fichero XML (Más información Microsoft Open XML SDK). Entonces, si una hoja de cálculo de Excel 2007 es un ZIP que contiene un XML, es posible directamente desde Silverlight acceder a un fichero Excel 2007.

Desde .NET se puede utilizar la API System.IO.Packaging para acceder a los ficheros de Office 2007 de manera simple, pero estamos trabajando con Silverlight que como sabemos contiene un subconjunto minimal de las API que brinda .NET, siendo System.IO.Packaging una de las no disponibles. Pero esto no representa un gran problema debido a que existen diversas bibliotecas para el manejo de ficheros ZIP desde Silverlight, y una vez accedido el ZIP, puede utilizarse LINQ to XML para navegar por el mismo.

En el post http://www.silverlightshow.net/items/An-Excel-file-Viewer-in-Silverlight-4.aspx se realiza una descripción detallada del proceso de acceso al fichero con formato Excel 2007 y se detallando el formato del mismo. Además se muestra una aplicación creada con Silverlight 4 que demuestra el proceso. En nuestro post, utilizaremos la biblioteca XSLXparsingLib creada en el post referenciado para lograr los objetivos propuestos al inicio.

excel-silverlight

Figura 1. A la izquierda una hoja de Excel y a la derecha su visualización mediante el DataGrid de Silverlight 3

Como puede apreciarse en la figura 1, se ha creado una aplicación Silverlight 3 de prueba (parte derecha) que accede directamente a una hoja de Excel (parte izquierda) y visualiza los datos en un DataGrid.

El código del botón “Abrir Excel” sería el que aparece a continuación:

private void cmdOpen_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Multiselect = false;
    ofd.Filter = "Excel 2007 (*.xlsx)|*.xlsx";
    var dialogResult = ofd.ShowDialog();
    if (dialogResult.HasValue && dialogResult.Value)
    {
        try
        {
            var excelFile = new XLSXReader(ofd.File);
            var sheets = excelFile.GetListSubItems();
            var content = excelFile.GetData(sheets[0]);
            var headers = content.First();

            dataGrid1.Columns.Clear();
            foreach (DictionaryEntry pair in headers)
            {
                dataGrid1.Columns.Add(new DataGridTextColumn
                  {
                      Header = pair.Value,
                      Binding = new Binding(pair.Key.ToString())
                  });
            }

            dataSource = content.Skip(1).ToDataSource();
            dataGrid1.ItemsSource = dataSource;
        }
        catch (Exception err)
        {
            MessageBox.Show("No se puede abrir el archivo. Puede que el archivo se esté utilizando o no contenga el formato correcto. " + err.Message, "Ha ocurrido un error", MessageBoxButton.OK);
        }
    }
}

De esta forma el fichero Excel 2007 se procesa directamente en el navegador web del cliente mostrándose los datos en el DataGrid. La información se obtiene como IEnumerable<IDictionary> y mediante el método extensor ToDataSource() y utilizando reflection se convierten los diccionarios en tipos propios (por cada columna del Excel se crea una propiedad en el tipo automáticamente generado) permitiendo así el Binding con el DataGrid (Ver http://blog.bodurov.com/How-to-Bind-Silverlight-DataGrid-From-IEnumerable-of-IDictionary). Una vez que el usuario valida la información pues se envía una única vez hacia el servidor (vía servicio web o mediante los mecanismos del WCF Ria Services) optimizando así el ancho de banda y el costo del procesamiento del lado del servidor.

DESCARGAR CÓDIGO FUENTE: Weboomania.ExcelSilverlightTest.zip

Etiquetas: ,

2 Respuestas a “ Excel 2007 y Silverlight 3 ”

  1. javier en Mayo 7, 2010 a 6:21 pm

    hola. puedes poner el proyecto en donde muestras tu ejemplo.
    Saludos.!

  2. Alejandro Tamayo Castillo en Mayo 8, 2010 a 5:34 pm

    Hola Javier,

    Puse el código fuente. Como verás es bastante simple.

    Saludos

Escriba un comentario