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
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
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
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
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.
ResponderEliminarpor cierto mi correo es m-a-i-k-r-o@hotmail.com
EliminarQue tal se me olvido subir mi archivo, vuelve a visitar mi blog hoy y podras descargar.
ResponderEliminarCOMO SERIA EN C#
ResponderEliminarhola que tal aunque no te tendria el proyecto para descarga pero si te lo podria traducir para que tu lo puedas implementar
Eliminar//La referencia sobre la cabecera o General
Eliminarusing 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);
}
}
}
Perdon un tanto desalineado pero espero te funcione
EliminarHola, 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
ResponderEliminarDim 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
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:
EliminarPublic 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)
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 :
ResponderEliminarventas: 1500
gastos :500
total: 1000
estoy intentando que me salga de esa forma pero no puedo me sale todo en una linea ayuda porfas
hola que tal estuve atento a tu peticion voy a ver como solucionarlo
EliminarGracias te lo agradeceria
Eliminarmira agrega esto
Eliminardocument.Add(texto2)
document.Add(New Paragraph(" ")) 'Salto de linea
document.Add(texto3)
entre cada texto y texto
Muchas gracias Me sirvio mucho tu aporte Gracias por tu ayuda
EliminarHola 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...
ResponderEliminarAgradeceria una respuesta. Gracias!
aupongo que quieres cambiar la fuente de la grid verdad?.. listo voy a ver como solucionarlo
Eliminarclaro esta que ya esta en el pdf, esa es la fuente que quiero cambiar porque al imprimirlo sale muy grande...
ResponderEliminarMuchas gracias, muy útil :)
ResponderEliminarEstoy 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
ResponderEliminardisculpa 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
EliminarGracias 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.
EliminarTengo 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?
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
EliminarGRACIAS POR TU APORTE!! ME HA SERVIDO DE MUCHO ;)
ResponderEliminarintento 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
ResponderEliminarque 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
ResponderEliminarSensillo practico y gratis se le agradece men depronto alguna manera de exportarle y colocar una imagen en el encabesado seria genial Attt: Slinky Wito
ResponderEliminarsi hay como y es sencillo mas adelante te mostrare como hacerlo
EliminarHola 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.
ResponderEliminarGracias por tus grandes aportes!
hola tengo un probelma al ejecutarlo me tira error me dice No se puede generar el documento PDF
ResponderEliminarnota: 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
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
Eliminarhola. 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.
ResponderEliminargracias
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...
ResponderEliminarEspero poderte ayudar mi correo jossm04@gmail.com
ResponderEliminarhola , ¿como estas??
ResponderEliminarSoy 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