none
Exportar a pdf usando itexsharp desde un datagridview

    Pregunta

  • Hola Tuttini de nuevo... Tengo un datagridview que al evento click me arroja un mensaje: "Referencia a objeto no establecido como instancia a un objeto". El código que uso es el siguiente:

    //Evento click para el botón Exportar a pdf

    private void PBExportarPDF_Click(object sender, EventArgs e)
            {
                try {
                    Document doc =new Document(PageSize.A4.Rotate(), 10, 10,10, 10);

                    string ReportePDF ="DataGridViewPrueba.pdf";

                    FileStream file =new FileStream(ReportePDF,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);

                    PdfWriter.GetInstance(doc, file);
                    doc.Open(); 
                    GenerarDocumento(doc);
                    doc.Close();
                    Process.Start(ReportePDF);
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

            }

    #region Función que obtiene los tamaños de las columnas del datagridview

            public float[] GetTamanioColumnas(DataGridView dg)
            {
                float[] values = new float[dg.ColumnCount];
                for (int i = 0; i < dg.ColumnCount; i++)
                {
                    values[i] = (float)dg.Columns[i].Width;
                }
                return values;
            }

            #endregion

     #region Función que genera el documento Pdf 
            public void GenerarDocumento(Document document)
            {
                //se crea un objeto PdfTable con el numero de columnas del dataGridView 
                PdfPTable datatable = new PdfPTable(DgvAnual.ColumnCount);//asignamos algunas propiedades para el diseño del pdf 
                datatable.DefaultCell.Padding = 3;
                float[] headerwidths = GetTamanioColumnas(DgvAnual);
                datatable.SetWidths(headerwidths); datatable.WidthPercentage = 100;
                datatable.DefaultCell.BorderWidth = 2;
                datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;

                //SE GENERA EL ENCABEZADO DE LA TABLA EN EL PDF 

                for (int i = 0; i < DgvAnual.ColumnCount; i++)
                {
                    datatable.AddCell(DgvAnual.Columns[i].HeaderText);
                }

                datatable.HeaderRows = 1; datatable.DefaultCell.BorderWidth = 1;
                //SE GENERA EL CUERPO DEL PDF
                for (int i = 0; i < DgvAnual.RowCount; i++)
                {
                    for (int j = 0; j < DgvAnual.ColumnCount; j++)
                    {
                        datatable.AddCell(DgvAnual[j, i].Value.ToString());
                    }
                    datatable.CompleteRow();
                }

                //SE AGREGAR LA PDFPTABLE AL DOCUMENTO
                document.Add(datatable);



            }
            #endregion

    A QUÉ SE PUEDA DEBER ESE MENSAJE???? TE AGRADEZCO DE TU AYUDA...

    lunes, 08 de julio de 2013 19:09

Respuestas

Todas las respuestas

  • Buenas, no soy Leandro, pero espero ayudarte igualmente :-)

    El error te lo está dando por que haces una llamada a una función de una clase y esa clase no está instanciada, es decir, (te pongo un ejemplo)

    PdfWriter.GetInstance(doc, file);

    Estás llamando a GetInstance de PdfWriter pero, PdfWriter no le has echo el new. Como te he dicho es un ejemplo ya que debes concretar un poco mas para poder saber donde está el error, quizá en el stacktrace del try catch que tiene venga otra opción, es ir trazando poco a poco hasta ver donde falla.

    Saludos

    lunes, 08 de julio de 2013 19:32
  • Referencia a objeto no establecido como instancia a un objeto

    puedes detectar en que linea se produce el error?

    claramente algo no se esta instanciando

    ademas esta raro, cuando haces esto

    string ReportePDF ="DataGridViewPrueba.pdf";

    donde se supone que esta la ruta del archivo ? porque tendria que ser una ruta fisica

    string ruta = Path.Combine(Application.StartupPath , ReportePDF );
    
    FileStream file =new FileStream(ruta,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);
    PdfWriter.GetInstance(doc, file);

    valida que puedes tomar el documento y ese "doc" no queda en null

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 08 de julio de 2013 23:13
  • Pues no es un error el que me arroja es:que debo cambiar a mi codigo??
    martes, 09 de julio de 2013 2:12
  • Donde puede estar el error? Qué puedo cambiar? 

    martes, 09 de julio de 2013 2:13
  • Buenas, pon un punto de ruptura en el click del boton y ve depurando linea a linea para ver donde falla.

    de todas formas, además cambia esto

      catch(Exception ex)
                 {
                     MessageBox.Show(ex.Message);
                 }
    

    por esto otro:

      catch(Exception ex)
                 {
                     MessageBox.Show(ex.Message + " --" + ex.StackTrace.ToString() );
                 }

    de esta forma, el Messagebox dará mas información, quizá nos pueda ayudar un poco mas.

    además estaría bien, saber la linea exacta donde está fallando. Pon un punto de ruptura y tracea hasta el fallo.

    Saludos

    martes, 09 de julio de 2013 6:33
  • El problema persiste en esta línea de la función GenerarDocumento (Está repintado en negrita y subrayado)

            public void GenerarDocumento(Document document)

            {

                //se crea un objeto PdfTable con el numero de columnas del dataGridView

                PdfPTable datatable = new PdfPTable(DgvAnual.ColumnCount);//asignamos algunas propiedades para el diseño del pdf

                datatable.DefaultCell.Padding = 3;

                float[] headerwidths = GetTamanioColumnas(DgvAnual);

                datatable.SetWidths(headerwidths);

         datatable.WidthPercentage = 100;

    •             datatable.DefaultCell.BorderWidth = 2;

                datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;

                //SE GENERA EL ENCABEZADO DE LA TABLA EN EL PDF

                for (int i = 0; i < DgvAnual.ColumnCount; i++)

                {

                    datatable.AddCell(DgvAnual.Columns[i].HeaderText);

                }

                datatable.HeaderRows = 1; datatable.DefaultCell.BorderWidth = 1;

                //SE GENERA EL CUERPO DEL PDF

                for (int i = 0; i < DgvAnual.RowCount; i++)

                {

                    for (int j = 0; j < DgvAnual.ColumnCount; j++)

                    {

                        datatable.AddCell(DgvAnual[j, i].Value.ToString());

                    }

                    datatable.CompleteRow();

                }

                //SE AGREGAR LA PDFPTABLE AL DOCUMENTO

                document.Add(datatable);

    •         }

    Y TAMBIÉN DE DA ERROR EN EL CIERRE DE LA LLAVE

    miércoles, 10 de julio de 2013 19:13
  • ME PUEDES DAR UN EJEMPLO DE CÓMO CREAR UN DOCUMENTO EN PDF DESDE UN DATAGRIDVIEW USANDO ITEXSHARP O REPORTVIEWER A PURO CÓDIGO O CHRISTAL REPORTS TAMBIÉN A PURO CÓDIGO... SE PUEDE???
    miércoles, 10 de julio de 2013 19:16
  • Buenas, en realidad, no tengo nada a mano. Si que escribí varios post sobre como crear PDFs con FOP

    http://devthisblog.namocode.es/index.php/creando-pdf-en-c-apache-fop-iiii/

    http://devthisblog.namocode.es/index.php/creando-pdf-en-c-apache-fop-iii/

    http://devthisblog.namocode.es/index.php/creando-pdf-en-c-apache-fop-ii/

    http://devthisblog.namocode.es/index.php/creando-pdf-para-reports-otros-documentos-en-c-i/

    Por otro lado, diría que tu error está en el defaultCell que es NULL y posiblemente lo tengas que instanciar primero.

    Por lo que he leído con cristal reports puedes hacer reportes y después salvarlos a PDF con un save as...

    Saludos.

    jueves, 11 de julio de 2013 17:46
  • quita el nulo del Datagrid..

    viernes, 10 de agosto de 2018 17:35