Exportación a Excel con C# | Parte 2


Actualizado: Exportación a Excel con C# | Parte 1Exportación a Excel con C# | Parte 3

La segunda parte de este artículo viene de la mano de WPF, C# e Interop de Excel. Primero creamos un proyecto WPF con C#.

Agregamos al proyecto la referencia a la dll de Microsoft.Interop.Excel.

AL código XAML de nuestra ventana principal le agregamos esto entre el Grid y ya estaríamos listos para nuestro code-behind.

<DataGrid x:Name="DataGrid" Width="600" Height="200" RowHeight="30" ColumnWidth="*" VerticalAlignment="Top"
                  AlternatingRowBackground="AliceBlue" CanUserAddRows="False" CanUserReorderColumns="False"
                  IsReadOnly="True" Margin="0,30,0,0">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Nombre" Binding="{Binding Nombre}"/>
                <DataGridTextColumn Header="Apellido" Binding="{Binding Apellido}"/>
                <DataGridTextColumn Header="1er Trimestre" Binding="{Binding ventasPrimer}"/>
                <DataGridTextColumn Header="2do Trimestre" Binding="{Binding ventasSegundo}"/>
                <DataGridTextColumn Header="3er Trimestre" Binding="{Binding ventasTercer}"/>
                <DataGridTextColumn Header="4to Trimestre" Binding="{Binding ventasCuarto}"/>
            </DataGrid.Columns>
        </DataGrid>

        <Button x:Name="Exportar" Click="Exportar_Click" Width="100" Height="35"
                VerticalAlignment="Bottom" Margin="0,0,0,20" Content="Exportar"/>

Debo aclarar que he creado las columnas que tienen unos enlaces a las variables que veremos enseguida.

Nos encontramos con una nueva clase la cual representa al “objeto” Vendedor y que tiene las variables que vimos en las columnas del DataGrid.

public class Vendedor
    {
        public string Nombre { get; set; }
        public string Apellido { get; set; }
        public int ventasPrimer { get; set; }
        public int ventasSegundo { get; set; }
        public int ventasTercer { get; set; }
        public int ventasCuarto { get; set; }
    }

Si aún no lo entiendes no hay problema que ahora mismo haré una explicación más sencilla.


private List<Vendedor> cargarVendedores (){}

private void Window_Loaded ( object sender, RoutedEventArgs e )
        {
            DataGrid.AutoGenerateColumns = false;
            DataGrid.ItemsSource = cargarVendedores ();
        }

He creado un método que devuelve una lista de vendedores (cargarVendedores) que luego cargo en el DataGrid. El DataGrid por su parte se encarga de enlazar automáticamente la Lista -del Objeto Vendedor- con las columnas que previamente ya había definido.

Y ahora lo más importante… la exportación a Excel.

foreach ( Vendedor persona in lista )
            {
                try
                {
                    worksheet.get_Range ( "A" + cont ).Value2 = persona.Nombre + " " + persona.Apellido;
                    worksheet.get_Range ( "B" + cont ).Value2 = persona.ventasPrimer;
                    worksheet.get_Range ( "C" + cont ).Value2 = persona.ventasSegundo;
                    worksheet.get_Range ( "D" + cont ).Value2 = persona.ventasTercer;
                    worksheet.get_Range ( "E" + cont ).Value2 = persona.ventasCuarto;

                    //Agregamos la Suma de los Trimestres usando la formula que obtuvimos en el
                    //documento de Excel al crear la Macro.
                    worksheet.get_Range ( "F" + cont ).FormulaR1C1 = String.Format ( "=SUM(RC[-{0}]:RC[-1])", 4 );

                    //Agregamos el promedio usando otra vez una formula de una Macro en Excel
                    worksheet.get_Range ( "G" + cont ).FormulaR1C1 = String.Format ( "=RC[-1]/{0}", 4 );

                    cont++;
                }
                catch (System.Runtime.InteropServices.COMException e)
                {
                    throw e;
                }

            }
            worksheet.get_Range ( "A" + cont ).Value2 = "Ventas Totales";
            worksheet.get_Range ( "A" + ( cont + 1 ) ).Value2 = "Promedio";

            foreach ( char col in columns )
            {
                //Agregamos las Ventas Totales - Generalizando la formula VBA
                worksheet.get_Range ( col + "" + cont ).FormulaR1C1 = String.Format("=SUM(R[-{0}]C:R[-1]C)", lista.Count);

                //Agregamos el Promedio
                worksheet.get_Range ( col + "" + ( cont + 1 ) ).FormulaR1C1 = String.Format("=R[-1]C/{0}", lista.Count);
            }

            //Agregamos el Grafico
            worksheet.Shapes.AddChart ( Excel.XlChartType.xlColumnClustered )
                .Chart.SetSourceData ( worksheet.get_Range ( "A" + temp + ":" + "G" + ( temp + lista.Count ) ) );

            worksheet.get_Range ( "A1" ).Select ();

Es un código bastante sencillo, solo tengo unas anotaciones que hacer. Primero que he usado 2 variables para saber desde donde comienzo (temp) a escribir el documento y dónde termino (cont) para luego añadir los estilos que deseo (colores, negrillas, cuadrícula). Segundo que he usado worksheet.get_Range() pues es la forma más rápida de leer y escribir en un documento Excel. Y por último, notarán que en mi código he usado using Excel = Microsoft.Office.Interop.Excel en vez using Microsoft.Office.Interop.Excel. Esto lo he hecho solo para una ayuda visual, solo para saber cuando he usado el Interop pero es igual de válido usar cualquiera de las formas que he mencionado.

Bueno Aquí les dejo una imagen de cómo quedó la exportación para que la comparen con la imagen del primer artículo.

Tabla C# e Interop

Y como siempre aquí les dejo el proyecto listo para correr y recordando que deben cambiar el formato de odt a zip… exportacionExcel.zip

Saludos y esperen la tercera parte cuando use ClosedXML.

Anuncios

4 Respuestas a “Exportación a Excel con C# | Parte 2

  1. No encuentro la referencia brother

  2. disculpa, queria bajar tu ejemplo pero me dice el explorador que sitio no encontrado.

    Me interesaría q me pudieras mandar tu ejemplo.

  3. Por favor lo agradecería su código fuente lo que pasa no se puede descargar del Link que direcciona . Por favor lo necesito urgente.
    Le agradezco su ayuda

  4. podrias enviarme tu codigo a mi correo : arturocatz7@gmail.com
    muchas gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s