none
exportar a excel con formato personalizado RRS feed

  • Pregunta

  • Hola amigos tengo una grilla con estas columnas

    Name Technician Status Start Date Status     TotalTime
    JOSE EDUARDO FERNANDEZ ONLINE 5/31/2018 8:16:46 0:08:03
    JOSE EDUARDO FERNANDEZ OFFLINE 5/31/2018 8:16:40 0:00:06
    JOSE EDUARDO FERNANDEZ OFFLINE 5/31/2018 7:51:29 0:24:18
    JOSE EDUARDO FERNANDEZ OFFLINE 5/31/2018 7:47:08 0:02:06

    si se dan cuenta el formato de la columna con nombre "Start Date Status" es mm/dd/yyyy hh:mm:ss

    al momento de hacer la exportacion la columna "Start Date Status" se muestra de esta manera.

    Name Technician Status Start Date Status    TotalTime
    JOSE EDUARDO FERNANDEZ ONLINE 5/31/2018 8:16 0:08:03
    JOSE EDUARDO FERNANDEZ OFFLINE 5/31/2018 8:16 0:00:06
    JOSE EDUARDO FERNANDEZ OFFLINE 5/31/2018 7:51 0:24:18
    JOSE EDUARDO FERNANDEZ OFFLINE 5/31/2018 7:47 0:02:06

    como ven se oculta los segundos,

    mi pregunta es si existe alguna manera de exportar la columna "Start Date Status" con el formato mm/dd/yyyy hh:mm:ss

    este es el codigo para exportar que estoy usando:

    SaveFileDialog fichero = new SaveFileDialog();
                        fichero.Filter = "Excel (*.xls)|*.xls";
                        if (fichero.ShowDialog() == DialogResult.OK)
                        {
                            Microsoft.Office.Interop.Excel.Application aplicacion;
                            Microsoft.Office.Interop.Excel.Workbook libros_trabajo;
                            Microsoft.Office.Interop.Excel.Worksheet hoja_trabajo;
                            aplicacion = new Microsoft.Office.Interop.Excel.Application();
                            libros_trabajo = aplicacion.Workbooks.Add();
                            hoja_trabajo = (Microsoft.Office.Interop.Excel.Worksheet)libros_trabajo.Worksheets.get_Item(1);
    
                            //exportar cabeceras dgvLog
                            for (int i = 2; i <= this.dg_detailtotallogin.Columns.Count ; i++)
                            {
                                hoja_trabajo.Cells[1, i] = this.dg_detailtotallogin.Columns[i - 1].HeaderText;
    
                            }
    
                            //Recorremos el DataGridView rellenando la hoja de trabajo con los datos
                            for (int i = 0; i < this.dg_detailtotallogin.Rows.Count; i++)
                            {
                                for (int j = 1; j < this.dg_detailtotallogin.Columns.Count; j++)
                                {
                                    hoja_trabajo.Cells[i + 2, j + 1] = this.dg_detailtotallogin.Rows[i].Cells[j].FormattedValue.ToString();
                                }
                            }
                            libros_trabajo.SaveAs(fichero.FileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal);
                            hoja_trabajo.Columns.AutoFit();
                            libros_trabajo.Close(true);
                            MessageBox.Show("Export is Successful");
                            aplicacion.Quit();
                        }

    jueves, 31 de mayo de 2018 16:37

Todas las respuestas

  • Pruebe ubicando la celda o celdas de fecha y asignando el valor "MM/DD/YYYY hh:mm:ss" a la propiedad NumberFormat.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 31 de mayo de 2018 18:29
    Moderador
  • Hola Jose.

    No soy tan bueno en C#, podrias brindarme un ejemplo de como podria hacer lo que me comentas.

    Gracias

    jueves, 31 de mayo de 2018 18:37
  • Pues no me he puesto a leer su código, pero en algún momento usted obtiene la o las celdas donde se colocan las fechas.  ¿Cierto?  Bueno, esas celdas tienen la propiedad NumberFormat.  Cuando asigne el valor a la celda, también asigne el formato.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 31 de mayo de 2018 18:40
    Moderador
  • hola jose....

    esta parte de codigo es la que llena las celdas con la informacion.

    //Recorremos el DataGridView rellenando la hoja de trabajo con los datos
                            for (int i = 0; i < this.dg_detailtotallogin.Rows.Count; i++)
                            {
                                for (int j = 1; j < this.dg_detailtotallogin.Columns.Count; j++)
                                {
                                    hoja_trabajo.Cells[i + 2, j + 1] = this.dg_detailtotallogin.Rows[i].Cells[j].FormattedValue.ToString();
                                }
                            }

    jueves, 31 de mayo de 2018 18:43
  • Ok, ese Cells[...] selecciona la celda.  Necesita un IF.  Si la j (que creo que el contador de columnas) corresponde a la columna con las fechas, no solamente asignar el valor, sino el formato también.

    Range c = hoja_trabajo.Cells[i + 2, j + 1];
    c = ...
    if (j == <número de columna de fechas>)
    {
        c.NumberFormat = "MM/DD/YYYY hh:mm:ss";
    }


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT


    jueves, 31 de mayo de 2018 18:53
    Moderador
  • He probado, pero no me sale...podrias poner tu codigo dentro del mio por favor.

    viernes, 1 de junio de 2018 16:40
  • Ya está dentro del suyo.  Mi código comienza dentro del bucle FOR j.  La línea que dice c = ... es la línea que usted tiene, como verá la variable c es lo que usted tiene a la izquierda del =, y los puntos suspensivos quieren decir que el lado derecho se mantiene igual.  Lo único que no sé es el número de columna donde van las fechas, que es el valor que usted debe poner en el IF.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    viernes, 1 de junio de 2018 20:06
    Moderador
  • Esto es lo que entendi....

     for (int i = 0; i < this.dg_detailtotallogin.Rows.Count; i++)
                            {
                                for (int j = 1; j < this.dg_detailtotallogin.Columns.Count; j++)
                                {
                                Range c = hoja_trabajo.Cells[i + 2, j + 1];
                                c = this.dg_detailtotallogin.Rows[i].Cells[j].FormattedValue.ToString();
                                if (j == 3)
                                {
                                    c.NumberFormat = "MM/DD/YYYY hh:mm:ss";
                                }
                                    //hoja_trabajo.Cells[i + 2, j + 1] = this.dg_detailtotallogin.Rows[i].Cells[j].FormattedValue;
                                }

                            }

    viernes, 1 de junio de 2018 21:57
  • Parece que entendió bien.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    viernes, 1 de junio de 2018 22:20
    Moderador
  • Al hacer lo que me indicas me salen errores 

    

    viernes, 1 de junio de 2018 22:36
  • c.Formula = ... en vez de solamente c = ...

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    viernes, 1 de junio de 2018 22:38
    Moderador
  • perdon por la ignorancia....

    a que te refieres con formula?

    viernes, 1 de junio de 2018 22:50
  • A que el objeto de celda tiene una propiedad llamada Formula.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    viernes, 1 de junio de 2018 23:07
    Moderador
  • hola

    Para exportar a excel no uses las librerias de interop de office, estas requieren que tengas office instalado, usa libreria basadan en open xml

    ClosedXML

    puede agregarla por nuget

    ClosedXML nuget

    tiene muchos ejemplos de como usarlo

    https://github.com/closedxml/closedxml/wiki

    veras que es muchas veces mas simple de llevar los datos al excel si tiene una clase o datatable, puede asignar los datos que usaste para cargar el grid, no es bueno exportar directo del control

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 4 de junio de 2018 16:25