none
exportar datagridview a excel con formatos RRS feed

  • Pregunta

  • Hola soy nuevo en c# espero su apoyo tengo un pequeño proyecto donde deseo exportar un datagridview a excel tengo dos problemas:

    1. cuando es bastante data la exportación se demora y no se sabe q esta haciendo ya que aparece como si nada luego de cargar un buen rato recién me indica que donde debo de guardar el archivo y se guarda rapidísimo desearía poder poner un temporizador o algo que me diga que esta cargando.

    2. cuando exporto números como "0001" en el excel solo me toma como "1" lo cual hace perder la forma a mi reporte.

    adjunto la forma en que estoy exportando mi excel.

    agradezco su apoyo.

     Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
                    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
                    Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
                    app.Visible = false;
                    worksheet = workbook.Sheets["Hoja1"];
                    worksheet = workbook.ActiveSheet;
                    worksheet.Name = "Reporte";
                    // Cabeceras
                    for (int i = 0; i < dataGridView1.Columns.Count; i++)
                    {
                        if (i >= 0 && i < dataGridView1.Columns.Count)
                        {
                            worksheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;
                        }
                    }
                    // Valores
                    for (int i = 0; i < dataGridView1.Rows.Count; i++)
                    {
                        for (int j = 0; j < dataGridView1.Columns.Count; j++)
                        {
                            if (j >= 0 && j < dataGridView1.Columns.Count)
                            {
                                worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                            }
                        }
                    }
    
                    SaveFileDialog saveFileDialog = new SaveFileDialog();
                    saveFileDialog.Filter = "Archivos de Excel|*.xlsx";
                    saveFileDialog.Title = "Guardar archivo";
                    saveFileDialog.FileName = "Reporte";
                    saveFileDialog.ShowDialog();
    
                    if (saveFileDialog.FileName != "")
                    {
                        Console.WriteLine("Ruta en: " + saveFileDialog.FileName);
                        workbook.SaveAs(saveFileDialog.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                        app.Quit();
                    }


    • Editado daluc lunes, 21 de octubre de 2019 21:44
    lunes, 21 de octubre de 2019 21:43

Todas las respuestas

  • Hola Daluc 

    Yo hice hace unos meses atrás hice un proyecto para exportar un excel con formato. te dejo mi código:

    puedes trabajar con la librería CloseXML lo puedes bajar en NuGet. esta la pagina para mas información.

    https://www.variablenotfound.com/2013/03/generar-archivos-excel-como-un-senor.html

    

     private void mExportaExcel()
            {
                List<ReembolsoVariosEnt> lista = (List<ReembolsoVariosEnt>)GridViewFactBolet.DataSource;
                if (lista.Count == 0)
                    return;
                int id_transaccion = lista[0].id_transaccion;            
                int row = 9;
                int colnro = 1; //N°
                int coltrab = 2; // Nombre del trabajador
                int colfecha = 3;
                int colprov = 5;
                int colconcepto = 6;
                int coltipodcto = 7;
                int colnrodcto = 8;
                int colsubtot = 9;
                int coligv = 10;
                int col10rec = 11;
                int coltot = 12;
                string pathfile = Application.StartupPath + "\\Ficheros\\RendicionLiq.xlsx";
                XLWorkbook workBook = new XLWorkbook(pathfile);
                IXLWorksheet workSheet = workBook.Worksheet(2);
                LimpiarHoja2(workSheet);
                //workSheet.Rows(19,19).Delete();
    
                //hoja 2 :  Facturas
                foreach (var item in lista)
                {
                    if (item.id_motivo_det != "17")
                    {
                        //[col][row]
                        //xlWorksheet.Cells[colnro][row].Value2 = item.item;
                        workSheet.Row(row).Cell(colnro).Value = item.item;
                        workSheet.Row(row).Cell(coltrab).Value = txtAnalitica.Text;
                        workSheet.Row(row).Cell(colfecha).Value = item.fecha;
                        workSheet.Row(row).Cell(colprov).Value = item.descripcionAnalitica;
                        workSheet.Row(row).Cell(colconcepto).Value = item.glosa;
                        workSheet.Row(row).Cell(coltipodcto).Value = item.descripcion;
                        workSheet.Row(row).Cell(colnrodcto).Value = item.referencia;
                        workSheet.Row(row).Cell(colsubtot).Value = item.monto - (0.18 * item.monto);
                        workSheet.Row(row).Cell(coligv).Value = 0.18 * item.monto; //igv colocarlo luego en la bd
                        workSheet.Row(row).Cell(col10rec).Value = 0;
                        workSheet.Row(row).Cell(coltot).Value = item.monto;
                        row += 1;
                    }
                }
    
                //hoja 1 :resumen
                IXLWorksheet workSheet1 = workBook.Worksheet(1);
                workSheet1.Row(15).Cell(3).Value = id_transaccion;
                if (txtTotalCB.Tag != null)
                    workSheet1.Row(16).Cell(3).Value = txtTotalCB.Tag;
                if (txtAnalitica.Tag !=null)
                    workSheet1.Row(12).Cell(3).Value = txtAnalitica.Tag; //DNI
                workSheet1.Row(12).Cell(2).Value = txtAnalitica.Text; //Trabajador
                workSheet1.Row(12).Cell(4).Value = dtpFecInicio.Value; //Fecha
                workSheet1.Row(8).Cell(3).Value = txtApms.Text ; //codigo APMS
    
                //hoja 3 : Movilidad
                IXLWorksheet workSheet3 = workBook.Worksheet(3);
                workSheet3.Row(12).Cell(2).Value = txtAnalitica.Text; //DNI
                workSheet3.Row(13).Cell(2).Value = txtAnalitica.Tag; // Trabajardor
                workSheet3.Row(7).Cell(8).Value = dtpFecInicio.Value; //fecha
    
                // hoja3: Kontroller
                //IXLWorksheet workSheet3 = workBook.Worksheet(3);
                int hj3row = 19;
                int colfechaMovilidad = 1;
                int colMotivo = 4;
                int colSoles = 7;
    
                LimpiarHoja3(workSheet3);
                foreach (var item in lista)
                {
                    if(item.id_motivo_det == "17")
                    {
                        //xlWorksheet.Cells[colnro][row].Value2 = item.item;
                        workSheet3.Row(hj3row).Cell(colfechaMovilidad).Value = item.fecha;
                        workSheet3.Row(hj3row).Cell(colMotivo).Value = item.glosa;
                        workSheet3.Row(hj3row).Cell(colSoles).Value = item.monto;
                        hj3row += 1;
                    }
    
                }
    
                workBook.Save();
                Application.Download(pathfile);
    
            }
    
            private void LimpiarHoja2(IXLWorksheet workSheet)
            {
                int row = 9;
                int colnro = 1; //N°
                int coltrab = 2; // Nombre del trabajador
                int colfecha = 3;
                int colprov = 5;
                int colconcepto = 6;
                int coltipodcto = 7;
                int colnrodcto = 8;
                int colsubtot = 9;
                int coligv = 10;
                int col10rec = 11;
                int coltot = 12;
                while (row<=36)
                {
                    //[col][row]
                    //xlWorksheet.Cells[colnro][row].Value2 = item.item;
                    workSheet.Row(row).Cell(colnro).Value = null;
                    workSheet.Row(row).Cell(coltrab).Value = null;
                    workSheet.Row(row).Cell(colfecha).Value = null;
                    workSheet.Row(row).Cell(colprov).Value = null;
                    workSheet.Row(row).Cell(colconcepto).Value = null;
                    workSheet.Row(row).Cell(coltipodcto).Value = null;
                    workSheet.Row(row).Cell(colnrodcto).Value = null;
                    workSheet.Row(row).Cell(colsubtot).Value = null;
                    workSheet.Row(row).Cell(coligv).Value = null; //igv colocarlo luego en la bd
                    workSheet.Row(row).Cell(col10rec).Value = null;
                    workSheet.Row(row).Cell(coltot).Value = null;
                    row += 1;
                }
    
            }


    Boris travi Ing.Software

    Lima-Perú.


    lunes, 21 de octubre de 2019 23:10
  • hola gracias por contestar el problema que tengo es que mi datagrid no siempre tiene los mismos campos lo uso para presentar varios tipos de reportes y los cambios varían según el reporte que voy utilizando.
    martes, 22 de octubre de 2019 3:02
  • Hola Daluc:

     Haca ya unos años realice un articulo en donde explicaba como trabajar con controles DataGridView y Excel a través de una Liberia llamada SpreadSheetLight, aunque entiendo que tu problema no es que Liberia usar si como hacerlo dinámico, te dejo el articulo que escribi:

    Trabajar con archivos Excel desde WindowsForms (SpreadSheetLight)

     Para tu caso te recomiendo crear métodos que den formato a cada reporte según el reporte que esters tratando de generar, es decir, al momento de cargar los datos coloca en una variable (o tómalo del control desde donde pides los datos) esta variable o campo sera el que le diga a tu rutina de código que formato aplicar al archivo resultado.

    Recorrer el control es muy sencillo:

                foreach (DataGridViewRow row in dgvDatos.Rows)
                {
                    //Recorremos la lista de columnas del control
                    for(int i = 0; i < dgvDatos.Columns.Count; i++)
                    {
                        //comenzamos a enviar los valores al objeto SLDocument, usando el valor de la fila y columna
                        sl.SetCellValue(rowIndex, columnIndex, Convert.ToString(row.Cells[i].Value));
                        columnIndex += 1;
                    }
                    rowIndex += 1;
                    columnIndex = 1;
                }
     Tambien el aplicar formato al archivo resultado es sencillo, en tu caso lo complejo es crear un formato para cafa reporte pero nada que no se pueda hacer.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 22 de octubre de 2019 12:50
  • hola de nuevo yo gracias por sus aportes no los entendí bien como dije soy nuevo por aquí.

    encontré una sencilla forma de llenar mi excel el formatos ya echos de excel solo cree tablas con formatos e inserte los datos de datagrid funciona bien pero no encuentro la forma de decirle que guarde este formato en una dirección luego de haberla modificado.

    para el guardado estoy usando el siguiente código haber si me pudieran ayudar.

     ExApp.Visible = false;
                ExApp.UserControl = true;
                oWBook.Save();
                ExApp.ActiveWorkbook.Close(true, "Prueba",Type.Missing);
                ExApp.Quit();
                ExApp = null;


    Daluc

    miércoles, 23 de octubre de 2019 2:42