domingo, 2 de junio de 2013

Exportar desde Datagridview a un PDF

 A continuación tenemos un ejemplo que nos permite exportar datos desde un datagridview a un PDF.

Para poder realizar dicha proceso se utiliza como referencia itextsharp.


Código fuente

Paso 1: Agregar las referencias

Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO

Paso 2: Cargamos los productos en el datagridview

Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
        Listar_Productos()
End Sub

Paso 3: Procedimiento para mostrar los productos

Sub Listar_Productos()
Try
   Dim Codigo() As Integer = {1, 2, 3, 4, 5}
   Dim Producto() As String = {"Camara""Impresora""Monitor""Ordenador""Scanner"}
   Dim Precio() As Double = {12.5, 20.5, 78.5, 20.25, 12.8}
   Dim Stock() As Double = {100, 150, 250, 300, 80}
   Dim RutaImagen() As String = {"D:\Exportar Desde Datagridview a PDF\Imagenes\camara.jpg",
                          "D:\Exportar Desde Datagridview a PDF\Imagenes\Impresora.jpg",
                          "D:\Exportar Desde Datagridview a PDF\Imagenes\monitor.jpg",
                          "D:\Exportar Desde Datagridview a PDF\Imagenes\ordenador.jpg",
                          "D:\Exportar Desde Datagridview a PDF\Imagenes\scanner.jpg"}
 dtgProductos.Rows.Clear()
 For i As Integer = 0 To Codigo.Length() - 1
    dtgProductos.Rows.Add()

    dtgProductos("txt_dtgProductos_Codigo", i).Value = Codigo(i)
    dtgProductos("txt_dtgProductos_Producto", i).Value = Producto(i)
    dtgProductos("txt_dtgProductos_Precio", i).Value = Precio(i)
    dtgProductos("txt_dtgProductos_Stock", i).Value = Stock(i)
    dtgProductos("txt_dtgProductos_RutaImagen", i).Value = RutaImagen(i)

    dtgProductos("img_dtgProductos_ImagenProducto", i).Value = System.Drawing.Image.FromFile(RutaImagen(i))
  Next

Catch ex As Exception
      MessageBox.Show(ex.Message, "vb.net"MessageBoxButtons.OK, MessageBoxIcon.Error)
 End Try
End Sub

Paso 4: Método para crear el reporte del PDF

'Metodo para crear el reporte en PDF.
Public Function GetColumnasSize(ByVal dg As DataGridViewAs Single()
  Dim values As Single() = New Single(dg.ColumnCount - 1) {}
   For i As Integer = 0 To dg.ColumnCount - 1
       values(i) = CSng(dg.Columns(i).Width)
   Next
   Return values
End Function

Paso 5: Creamos un proceso para crear el reporte

Public Sub ExportarDatosPDF(ByVal document As Document)
 'Se crea un objeto PDFTable con el numero de columnas del DataGridView. 
  Dim datatable As New PdfPTable(dtgProductos.ColumnCount)
 'Se asignan algunas propiedades para el diseño del PDF.
  datatable.DefaultCell.Padding = 3
  Dim headerwidths As Single() = GetColumnasSize(dtgProductos)
  datatable.SetWidths(headerwidths)
  datatable.WidthPercentage = 100
  datatable.DefaultCell.BorderWidth = 2
  datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER
  'Se crea el encabezado en el PDF. 
   Dim encabezado As New Paragraph("PRODUCTOS INFORMATICOS"New Font(Font.Name = "Tahoma", 20, Font.Bold))

   'Se crea el texto abajo del encabezado.
    Dim texto As New Phrase("Reporte productos:" + 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 dtgProductos.ColumnCount - 1
         datatable.AddCell(dtgProductos.Columns(i).HeaderText)
    Next
    datatable.HeaderRows = 1
    datatable.DefaultCell.BorderWidth = 1
    'Se generan las columnas del DataGridView. 
    For i As Integer = 0 To dtgProductos.RowCount - 1
        For j As Integer = 0 To dtgProductos.ColumnCount - 1
           'compruebo que columna contien la imagen y en que columna deseo que se muestre
           If (j = 4) Then
              'capturo la ruta de la imagen
              Dim RutaImage As String
              RutaImage = dtgProductos("txt_dtgProductos_RutaImagen", i).Value
              'Procedo a convertir a imagen de tipo itextsharp.text.image
              Dim Img As Image = Image.GetInstance(RutaImage)
              'agrego la imagen a la celda
              datatable.AddCell(Img)
            Else
              datatable.AddCell(dtgProductos(j, i).Value.ToString())
            End If

        Next
            datatable.CompleteRow()
   Next
      'Se agrega el PDFTable al documento.
      document.Add(encabezado)
      document.Add(texto)
      document.Add(datatable)
End Sub

Paso 6: Programamos el botón btnExportarPDF

Private Sub btnExportarPDF_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles btnExportarPDF.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) + "\Reporteproductos.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

Resultado

Fuentes.

El código fuente a sido auditado por mi persona desde.

http://ripertec.wordpress.com/tag/exportar-datagridview-a-pdf-visual-basic-2008/

No hay comentarios:

Publicar un comentario