Exportar Datagridview a pdf parte I

Que tal amigos, como lo prometido es deuda...Estoy aqui con un nuevo tema, que creo yo es muy importante en tu aplicación: Exportar Datagridview a Pdf. Anteriormente les habia expuesto como exportar a Excel, ahora  nos valemos de las librerias: itexSharp para guardar nuestra grid a formato pdf.

En un principio debemos hacer la referencia a la libreria: itextsharp.dll que se puede descargar gratis del sitio: http://sourceforge.net/projects/itextsharp/ 
Como antes les mostrare una captura:



La referencia sobre la cabecera o General
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf

 y luego la rutina publica:

 Public Sub ExportarDatosPDF(ByVal document As Document)
        'Se crea un objeto PDFTable con el numero de columnas del DataGridView. 
        Dim datatable As New PdfPTable(grid1.ColumnCount)
        'Se asignan algunas propiedades para el diseño del PDF.
        datatable.DefaultCell.Padding = 3
        Dim headerwidths As Single() = GetColumnasSize()
        datatable.SetWidths(headerwidths)
        datatable.WidthPercentage = 50
        datatable.DefaultCell.BorderWidth = 2
        datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER
        'Se crea el encabezado en el PDF. 
        Dim encabezado As New Paragraph("Reporte", New Font(Font.Name = "Tahoma", 20, Font.Bold))
        'Se crea el texto abajo del encabezado.
        Dim texto As New Phrase("Reporte Ejemplo: " + Now.Date(), New Font(Font.Name = "Tahoma", 14, Font.Bold))
        'Se capturan los nombres de las columnas del DataGridView.
        For i As Integer = 0 To grid1.ColumnCount - 1
            datatable.AddCell(grid1.Columns(i).HeaderText)
        Next
        datatable.HeaderRows = 1
        datatable.DefaultCell.BorderWidth = 1
        For i As Integer = 0 To grid1.Rows.Count - 2
            For j As Integer = 0 To grid1.Columns.Count - 1
                datatable.AddCell((grid1(j, i).Value).ToString)
            Next
            datatable.CompleteRow()
        Next
        'da 2 tab entre columnas
        datatable.AddCell("")
        datatable.AddCell("")
        'imprime resultados
        datatable.AddCell(grid1(2, 6).Value)
        datatable.AddCell(grid1(3, 6).Value)
        datatable.CompleteRow()
        'Se agrega etiquetas
        document.Add(encabezado)
        document.Add(texto)
        document.Add(datatable)
    End Sub

Redimensionando las columnas,
Public Function GetColumnasSize() As Single()
        Dim values As Single() = New Single(grid1.ColumnCount - 1) {}
        For i As Integer = 0 To grid1.ColumnCount - 1
            values(i) = CSng(grid1.Columns(i).Width)
        Next
        Return values
    End Function

 y  al final el codigo sobre el boton Exportar
Private Sub BtnPdf_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPdf.Click
        Try
            ' Intentar generar el documento.
            Dim doc As New Document(PageSize.A4.Rotate(), 10, 10, 10, 10)
            ' Path que guarda el reporte en el escritorio de windows (Desktop).
            Dim filename As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\Reporte.pdf"
            Dim file As New FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)
            PdfWriter.GetInstance(doc, file)
            doc.Open()
            ExportarDatosPDF(doc)
            doc.Close()
            Process.Start(filename)
        Catch ex As Exception
            'Si el intento es fallido, mostrar MsgBox.
            MessageBox.Show("No se puede generar el documento PDF.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
End Class

Mi captura de mi grid en  Pdf



Que les parece!..Interesante... verdad?. Bueno dejo a su criterio y mi ejemplo completo. Nos vemos en otra entrega más.


Mi link: https://docs.google.com/open?id=0B-UGWA03tc5ZY0JDcEdfWUNJUjQ

Comentarios

  1. hola me gusta tu publicacion no se si me puedas mandar tu proyecto ya que todavia no le entiendo muy bien de antemano muchas gracias.

    ResponderEliminar
    Respuestas
    1. por cierto mi correo es m-a-i-k-r-o@hotmail.com

      Eliminar
  2. Que tal se me olvido subir mi archivo, vuelve a visitar mi blog hoy y podras descargar.

    ResponderEliminar
  3. Respuestas
    1. hola que tal aunque no te tendria el proyecto para descarga pero si te lo podria traducir para que tu lo puedas implementar

      Eliminar
    2. //La referencia sobre la cabecera o General

      using System.IO;
      using iTextSharp.text;
      using iTextSharp.text.pdf;

      y luego la rutina publica:

      public void ExportarDatosPDF(Document document) {
      //Se crea un objeto PDFTable con el numero de columnas del DataGridView.
      PdfPTable datatable = new PdfPTable(grid1.ColumnCount);
      //Se asignan algunas propiedades para el diseño del PDF.
      datatable.DefaultCell.Padding = 3;
      float[] headerwidths == GetColumnasSize();
      datatable.SetWidths(headerwidths);
      datatable.WidthPercentage = 50;
      datatable.DefaultCell.BorderWidth = 2;
      datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
      //Se crea el encabezado en el PDF.
      Paragraph encabezado = new Paragraph("Reporte", new Font(Font.Name = "Tahoma", 20, Font.Bold));
      //Se crea el texto abajo del encabezado.
      Phrase texto = new Phrase("Reporte Ejemplo: " + Now.Date(), new Font(Font.Name = "Tahoma", 14, Font.Bold));
      //Se capturan los nombres de las columnas del DataGridView.
      for(int i= 0; i< grid1.ColumnCount; i++){
      datatable.AddCell(grid1.Columns[i].HeaderText);
      }
      datatable.HeaderRows = 1;
      datatable.DefaultCell.BorderWidth = 1;
      for(int i= 0; i<= grid1.Rows.Count - 2; i++){
      for(int j= 0; j< grid1.Columns.Count; j++){
      datatable.AddCell((grid1(j, i).Value).ToString());
      }
      datatable.CompleteRow();
      }
      //da 2 tab entre columnas
      datatable.AddCell("");
      datatable.AddCell("");
      //imprime resultados
      datatable.AddCell(grid1(2, 6).Value);
      datatable.AddCell(grid1(3, 6).Value);
      datatable.CompleteRow();
      //Se agrega etiquetas
      document.Add(encabezado);
      document.Add(texto);
      document.Add(datatable);
      }
      Redimensionando las columnas,
      public float[] GetColumnasSize() {
      float[] values == new float(grid1.ColumnCount - 1) {}
      for(int i= 0; i< grid1.ColumnCount; i++){
      values[i] = Convert.ToSingle(grid1.Columns[i].Width);
      }
      return values;
      }
      y al final el codigo sobre el boton Exportar;
      private void BtnPdf_Click(System.Object sender, System.EventArgs e) {
      try{
      // Intentar generar el documento.
      Document doc = new Document(PageSize.A4.Rotate(), 10, 10, 10, 10);
      // Path que guarda el reporte en el escritorio de windows (Desktop).
      string filename = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\Reporte.pdf";
      FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
      PdfWriter.GetInstance(doc, file);
      doc.Open();
      ExportarDatosPDF(doc);
      doc.Close();
      Process.Start(filename);
      }catch(Exception ex){
      //Si el intento es fallido, mostrar MsgBox.
      MessageBox.Show("No se puede generar el documento PDF.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
      }
      }

      Eliminar
    3. Perdon un tanto desalineado pero espero te funcione

      Eliminar
  4. Hola, tengo una duda, mi grid posee 100 registros y quiero generar un PDF en donde cada hoja tenga 30 registros solamente hasta acompletar mis 100 registros, en cuanto al encabezado no tengo problemas ni como crear paginas, lo que no logro es poner mis 25 registros en cada hoja. Escribo el codigo

    Dim Documento As New Document 'Declaracion del documento
    Dim parrafo As New Paragraph ' Declaracion de un parrafo
    Dim tablademo As New PdfPTable(7) 'declara la tabla con 7 Columnas
    Dim cont As Integer = 0

    pdf.PdfWriter.GetInstance(Documento, New FileStream("RPTsocios.pdf", FileMode.Create)) 'Crea el archivo "DEMO.PDF
    Documento.SetPageSize(iTextSharp.text.PageSize.LETTER.Rotate)
    Documento.Open() 'Abre documento para su escritura

    Documento.Add(icabecerapdf) ' cabecera de imagen
    tcabecerapdf(Documento) 'Cabecera de texto

    parrafo.Alignment = Element.ALIGN_CENTER 'Alinea el parrafo para que sea centrado o justificado
    tablademo.SetWidthPercentage({70, 100, 120, 50, 100, 40, 50}, PageSize.LETTER) 'Ajusta el tamaño de cada columna
    tablademo.AddCell(New Paragraph("NOMBRE", FontFactory.GetFont("Arial", 8))) 'Agrega COLUMNA1 con fuente ARIAL tamaño 8
    tablademo.AddCell(New Paragraph("APELLIDOS", FontFactory.GetFont("Arial", 8))) 'Agrega COLUMNA1 con fuente ARIAL tamaño 8
    tablademo.AddCell(New Paragraph("DOMICILIO", FontFactory.GetFont("Arial", 8))) 'Agrega COLUMNA1 con fuente ARIAL tamaño 8
    tablademo.AddCell(New Paragraph("TELEFONO", FontFactory.GetFont("Arial", 8))) 'Agrega COLUMNA1 con fuente ARIAL tamaño 8
    tablademo.AddCell(New Paragraph("CORREO ELECTRONICO", FontFactory.GetFont("Arial", 8))) 'Agrega COLUMNA1 con fuente ARIAL tamaño 8
    tablademo.AddCell(New Paragraph("SECCION", FontFactory.GetFont("Arial", 8))) 'Agrega COLUMNA1 con fuente ARIAL tamaño 8
    tablademo.AddCell(New Paragraph("NACIMIENTO", FontFactory.GetFont("Arial", 8))) 'Agrega COLUMNA1 con fuente ARIAL tamaño 8

    With DataGridView1
    For A As Integer = 0 To .Rows.Count - 1
    tablademo.AddCell(New Paragraph(.Rows(A).Cells(0).Value.ToString, FontFactory.GetFont("Arial", 7)))
    tablademo.AddCell(New Paragraph(.Rows(A).Cells(1).Value.ToString, FontFactory.GetFont("Arial", 7)))
    tablademo.AddCell(New Paragraph(.Rows(A).Cells(2).Value.ToString, FontFactory.GetFont("Arial", 7)))
    tablademo.AddCell(New Paragraph(.Rows(A).Cells(6).Value.ToString, FontFactory.GetFont("Arial", 7)))
    tablademo.AddCell(New Paragraph(.Rows(A).Cells(5).Value.ToString, FontFactory.GetFont("Arial", 7)))
    tablademo.AddCell(New Paragraph(.Rows(A).Cells(3).Value.ToString, FontFactory.GetFont("Arial", 7)))
    tablademo.AddCell(New Paragraph(.Rows(A).Cells(4).Value.ToString, FontFactory.GetFont("Arial", 7)))
    cont = cont + 1
    If cont = 25 Then
    Documento.NewPage()
    ' Aqui como le indico que siga con mis registros
    cont = 0
    End If
    Next
    End With

    Documento.Add(tablademo) 'Agrega la tabla al documento

    Documento.Close() 'Cierra el documento

    ResponderEliminar
    Respuestas
    1. hola Bonifacio estuve leyendo tu pregunta y me di el tiempo de hacer un nuevo proyecto en mi caso mi grid tenia 560 filas o registros y lo que hice es aumentar el tamano de la celda en el pdf y entraron por hoja 27 registros que es mas o menos lo que tu esperas tener claro tu tienes 100 qui te adjunto el codigo o si quieres el proyecto adjunta tu correo nos vemos y es pero te resulte:

      Public Sub ExportarDatosPDF(ByVal document As Document)
      'Se crea un objeto PDFTable con el numero de columnas del DataGridView.
      Dim datatable As New PdfPTable(DataGridView1.ColumnCount)
      'Se asignan algunas propiedades para el diseño del PDF.
      datatable.DefaultCell.Padding = 3 'regula el interlineado en celdas
      Dim headerwidths As Single() = GetColumnasSize()
      datatable.SetWidths(headerwidths)
      datatable.WidthPercentage = 100 'ancho de la celda
      ' datatable.DefaultCell.Border = 1
      datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER
      datatable.DefaultCell.BorderWidth = 1 'grosor de linea
      ' datatable.DefaultCell.BorderWidthLeft = 1
      'Se crea el encabezado en el PDF.
      Dim encabezado As New Paragraph("Reporte", New Font(Font.Name = "Tahoma", 20, Font.Bold))
      'Se crea el texto abajo del encabezado.
      Dim texto As New Phrase("Reporte Ejemplo: " + Now.Date(), New Font(Font.Name = "Tahoma", 14, Font.Bold))
      'Se capturan los nombres de las columnas del DataGridView.
      For i As Integer = 0 To DataGridView1.ColumnCount - 1
      datatable.AddCell(DataGridView1.Columns(i).HeaderText)
      Next
      datatable.HeaderRows = 1
      datatable.DefaultCell.BorderWidth = 1
      For i As Integer = 0 To DataGridView1.Rows.Count - 2
      For j As Integer = 0 To DataGridView1.Columns.Count - 1
      datatable.AddCell((DataGridView1(j, i).Value).ToString)
      Next
      datatable.CompleteRow()
      Next
      'da 2 tab entre columnas
      datatable.AddCell("")
      datatable.AddCell("")
      'imprime resultados
      'datatable.AddCell(DataGridView1(2, 6).Value)
      'datatable.AddCell(DataGridView1(3, 6).Value)
      datatable.CompleteRow()
      'Se agrega etiquetas
      document.Add(encabezado)
      document.Add(texto)
      document.Add(datatable)

      Eliminar
  5. Hola quiciera saber como dar un ENTER un codigo que lo haga mi caso es que ya exporte a pdf gracias atu ayuda pero ahora estoy agregando otras cosas por debajo de la tabla dibuja algo asi :

    ventas: 1500
    gastos :500
    total: 1000

    estoy intentando que me salga de esa forma pero no puedo me sale todo en una linea ayuda porfas

    ResponderEliminar
    Respuestas
    1. hola que tal estuve atento a tu peticion voy a ver como solucionarlo

      Eliminar
    2. Gracias te lo agradeceria

      Eliminar
    3. mira agrega esto
      document.Add(texto2)
      document.Add(New Paragraph(" ")) 'Salto de linea
      document.Add(texto3)
      entre cada texto y texto

      Eliminar
    4. Muchas gracias Me sirvio mucho tu aporte Gracias por tu ayuda

      Eliminar
  6. Hola tengo otra consulta, quisiera saber como cambiar la fuente (font=8) al documento que se exporta a pdf, trate de cambiarlo desde el grid a ver si resultaba pero nada...

    Agradeceria una respuesta. Gracias!

    ResponderEliminar
    Respuestas
    1. aupongo que quieres cambiar la fuente de la grid verdad?.. listo voy a ver como solucionarlo

      Eliminar
  7. claro esta que ya esta en el pdf, esa es la fuente que quiero cambiar porque al imprimirlo sale muy grande...

    ResponderEliminar
  8. Muchas gracias, muy útil :)

    ResponderEliminar
  9. Estoy tratando de exportar un gridview que esta conectado con una base de datos en acess y la cual modifico desde la misma aplicación pero no encuentro la forma de poder exportar ese grid a un pdf no se si me podrias guiar un poco ya que estoy bastante perdido

    ResponderEliminar
    Respuestas
    1. disculpa que conteste muy tarde pero que tal si pruebas mi ejemplo que te doy y ves si puedes acoplarlo a tu trabajo, en fin solo trasmites el código al otro proyecto. Pero si surge o algun problema en concreto me avisas para poderte ayudar

      Eliminar
    2. Gracias Jose no se que era lo que estaba haciendo mal pero lo logre. se genero el pdf tal cual como yo queria gracias a gente como vos uno tiene ganas de seguir aprendiendo.
      Tengo otra duda y no se si podras ayudarme nuevamente en la misma aplicacion que estoy trabajando necesito generar numeros consecutivo definidos por 2 texbox por ejemplo pongo el numero 10 en uno de los texbox y 20 en el otro generandome los numeros 10;11;12.....20 y guardando cada numero en una fila de mi base de datos.. tienes idea de como se podria implementar?

      Eliminar
    3. hola otra vez programador, supongo que los texbox son los limites del bucle, entiendo lo que tu quieres hacer es: iniciar desde 10 hasta 20, claro que se vayan generando: como pautas te puedo decir que lo hagas en un datagridview implementando un bucle for o que se vaya generando a medidad que tu vayas ingresando filas en el datagridview para guardar la data gridview te invito a que veas mi primera entrada o entrega, solo haz clic en el menu "Inicio" en la parte superior de este blog

      Eliminar
  10. GRACIAS POR TU APORTE!! ME HA SERVIDO DE MUCHO ;)

    ResponderEliminar
  11. intento aplicarlo a mi proyecto pero me sale error... yo intento generar el pdf donde el datagridview1 lo genero de una búsqueda de sql pero me sale error.. creo que se debe al numero de filas o al numero de columnas que este me puede llegar a generar ya que el datagridview1 es cambiante por que la busqueda no siempre sera la misma. espero respuesta mi correo es janero89@hotmail.com

    ResponderEliminar
  12. que tal Jannner es bastante cierto lo que tu dices es posible que ocurra eso por estar dimensionando las filas en cada busqueda pero me intereza mucho la funcionalidad que quieres darle . Voy a ver si puedo hacer un ejercicio relacionado

    ResponderEliminar
  13. Sensillo practico y gratis se le agradece men depronto alguna manera de exportarle y colocar una imagen en el encabesado seria genial Attt: Slinky Wito

    ResponderEliminar
    Respuestas
    1. si hay como y es sencillo mas adelante te mostrare como hacerlo

      Eliminar
  14. Hola que tal, muy interesantes tus proyectos, tengo una duda, como aplicaría esta exportación a pdf, con el proyecto anterior que hiciste "Formulario Ventas Simple con Datagridview y BDAccess" ? , agregue, la referencia del itextsharp.dll y cambie los nombres del grid1 y me sale error.

    Gracias por tus grandes aportes!

    ResponderEliminar
  15. hola tengo un probelma al ejecutarlo me tira error me dice No se puede generar el documento PDF

    nota: cambie grid1 a DataGridView1 por que asi le puse al grid
    que mas tengo que cambiar?

    por cierto mi grid tiene las siguietes columnas: Nombre_maetro, id Credencial, fecha_salida, fecha_entrega si esto que tambien se tiene que cambiar en que paete es, espero su respuesta gracias

    ResponderEliminar
    Respuestas
    1. Disculpa no haberte contestado a tiempo, no estaba en la ciudad, pero va lei tu correo y estoy analizando tu caso espero me dirijas un mail a jossm04@gmail.com para ayudarte mas eficazmente

      Eliminar
  16. hola. oye para web, tendras algo similar, tengo un proyecto en Visual Web Developer 2008 Express y quiero hacer lo mismo, de un grid exportarlo a pdf.

    gracias

    ResponderEliminar
  17. Que tal, sabes muy interesante tu propuesta para la genracion de PDF, pero tengo una inquietud, como podría hacer para que una vez que se genera el PDF en mi caso lo que necesito es poder modificar el pdf para que me permita firmarlo biométricamente con un Tablet y el lápiz, osea que se genere el pdf pero no bloqueado, es un proyecto que se basa sobre la firma biométrica de un documento generado con los datos que se ingresan en un formulario no se si me explico pero ojala pueda ayudarme...

    ResponderEliminar
  18. Espero poderte ayudar mi correo jossm04@gmail.com

    ResponderEliminar
  19. hola , ¿como estas??
    Soy de Perú y estoy en un proyecto grupal del instituto donde estamos diseñando un sistema de inventario ,pero tenemos 2 problemas
    1. En la función de exportar no tenemos solución porque toda la información que encontramos en internet no nos funciona
    2. Podrías ayudarnos con las funciones de Importar y Exportar por favor
    Recientemente vi tu blog y la verdad creo que nos podrias ayudar por favor
    Estamos realizando el proyecto en el entorno de Visual Basic

    Por favor ,necesitamos tu ayuda

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Imprimir directamente ReportViewer a impresora predeterminada

DevComponents DotnetBar 12.5.0.2

Metodo Iterativo Gauss-Seidel en Visual Basic