domingo, 27 de julio de 2014

Crear reporte con ItextSharp en C# con tabla


Un poco lejos desde mi último post. Les traigo la otra parte de cómo crear un reporte con ItextSharp pero ahora con uso de tablas de ItextSharp. 

Útiles cuando se necesita crear un documento con texto en columnas o texto a diferentes sangrías sin estar colocándolo con coordenadas.


Los pasos para utilizar la herramienta de ITextsharp son los mismos que en el Post anterior, solo que ahora la construcción es diferente para lo cual utilizaremos la propiedad PdfPTable. Y utilizaremos el objeto doc.
Document doc = new Document(iTextSharp.text.PageSize.LETTER);

Empezamos declarando nuestro objeto tabla (Les pongo el código solo para copiar y pegar en su VS)

iTextSharp.text.Rectangle page = doc.PageSize; //Obtenemos el tamaño total de la pagina
PdfPTable table = new PdfPTable(8); //Declaramos el objeto PdfPTable y especificamos el ancho de las columas a utilizar
table.WidthPercentage = 80;//Le damos un tamaño a la tabla, esta tomara en porcierto el ancho que ucupara
table.TotalWidth = page.Width - 90; //Le damos el tamaño de la tabla
table.LockedWidth = true;//Decimos que se bloque el tamaño de la tabla, esto para que no creesca dependiendo de la información
float[] widths = new float[] { .8f, .8f, .8f, .8f, .8f, .8f, .8f, .8f }; //Declaramos un array con los tamaños de nuestras columnas deben de coincidir con el tamaño de columnas
table.SetWidths(widths); //Agregamos los anchos a nuestra tabla

Con estos pasos ya tenemos la construcción de nuestra tabla, ahora viene lo bueno, en el post anterior vimos cómo ir insertando texto en cada renglón, en este caso el proceso es igual de laborioso ya que iremos insertando celda por celda con ayuda de AddCell.

//Agregamos una valor a nuestra celda de nuestra tabla
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 1")));

Aquí agregamos a nuestra tabla en la celda 1 un nuevo objeto de tipo PdfPCell lo cual dentro recibe un objeto de tipo Paragraph en cual vimos que se utiliza para agregar texto a nuestro formulario y en este caso a nuestra celda.

Ahora bien como recordaran declaramos nuestra tabla con 8 columnas, para ir agregando texto a cada celda, no hay que especificar en qué celda queremos insertar texto. Solo basta con ir escribiendo como se muestra a continuación:
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 1")));
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 2")));
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 3")));
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 4")));
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 5")));
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 6")));
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 7")));
table.AddCell(new PdfPCell(new Paragraph("Texto Celda 8")));

Esto nos creara nuestra primera fila (row de la tabla). Para continuar en la siguiente fila solo basta con volver a crear otra instrucción con el nuevo texto, ItextSharp nos ira acomodando los textos en su respectivo lugar

Cabe mencionar que si queremos dejar un espacio vacío entre la celda 1 y 3 es decir en la celda 2, dentro de nuestro Paragraph le podemos poner (""), de igual forma si queremos un texto dentro de la misma celda con un salto de carro solo ponemos ("\n").

Ahora van las ventajas de uso de tablas para construir el reporte dentro de ItextSahrp. En mi caso particular me fue útil en muchos aspecto, a nuestro objeto de tipo PdfPCell le podemos especificar que queremos la celda con borde, la alineación vertical y horizontal, el color de la celda, etc.  Para lo cual yo construí un método de tipo  PdfPCell  que me recibe los parámetros de configuración de mi celda, y este me regresara un objeto del mismo tipo. Les comparto mi código para facilitar su aprendizaje y les comentos cada uno de los atributos que tiene.


public PdfPCell celda(string Texto, int collspan, int rowspan, float tamaño, int alignment, int borde, BaseColor colorTexto, string colorCelda)
        {
            //Creamos un Objeto de tipo PdfPCell en el cual agregamos directo nuestro texto como vera utilizo Paragraph con un tipo de letra en mi caso fijo pero si lo desean pueden enviarlo como parametro, un tamaño y un color de letra que se envian como parametro
            PdfPCell CeldaPDF = new PdfPCell(new Paragraph(Texto, FontFactory.GetFont("Calibri", tamaño, colorTexto)));
            //Este codigo es referente a los border, como podran ver tengo varias combinancaciones para poner el borde deseado
            #region "borde"

            if (borde == 0)
            {
                CeldaPDF.Border = 0;
            }
            else
            {
                if (borde == 1)
                {
                    CeldaPDF.Border = iTextSharp.text.Rectangle.BOTTOM_BORDER;
                }
                else
                {
                    if (borde == 2)
                    {
                        CeldaPDF.Border = iTextSharp.text.Rectangle.TOP_BORDER;
                    }
                    else
                    {
                        if (borde == 3)
                        {
                            CeldaPDF.Border = iTextSharp.text.Rectangle.LEFT_BORDER;
                        }
                        else
                        {
                            if (borde == 4)
                            {
                                CeldaPDF.Border = iTextSharp.text.Rectangle.RIGHT_BORDER;

                            }
                            else
                            {
                                if (borde == 5)
                                {
                                    CeldaPDF.Border = iTextSharp.text.Rectangle.BOTTOM_BORDER | iTextSharp.text.Rectangle.TOP_BORDER | iTextSharp.text.Rectangle.LEFT_BORDER | iTextSharp.text.Rectangle.RIGHT_BORDER;
                                }
                                else
                                {
                                    if (borde == 6)
                                    {
                                        CeldaPDF.Border = iTextSharp.text.Rectangle.BOTTOM_BORDER | iTextSharp.text.Rectangle.LEFT_BORDER;

                                    }
                                    else
                                    {
                                        if (borde == 7)
                                        {
                                            CeldaPDF.Border = iTextSharp.text.Rectangle.BOTTOM_BORDER | iTextSharp.text.Rectangle.RIGHT_BORDER;

                                        }
                                        else
                                        {
                                            if (borde == 8)
                                            {
                                                CeldaPDF.Border = iTextSharp.text.Rectangle.TOP_BORDER | iTextSharp.text.Rectangle.LEFT_BORDER;

                                            }
                                            else
                                            {
                                                if (borde == 9)
                                                {
                                                    CeldaPDF.Border = iTextSharp.text.Rectangle.TOP_BORDER | iTextSharp.text.Rectangle.RIGHT_BORDER;

                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            #endregion
            //Indicamos que queremos un color de fondo, el parametro enviado es un strign donde vendra nuestro color por default si no lo indican es blanco
            CeldaPDF.BackgroundColor = new BaseColor(System.Drawing.ColorTranslator.FromHtml(colorCelda));
            //En caso de querer poner un collspan indicamos el numero de columnas que abarcara
            CeldaPDF.Colspan = collspan;
            //Lo mismo si es un rowspan, indicaremos el numero de filar que abarcara
            CeldaPDF.Rowspan = rowspan;
            //Indicamos la alineacion horizontal
            CeldaPDF.HorizontalAlignment = alignment;
            //Indicamos la alineacion vertical
            CeldaPDF.VerticalAlignment = alignment;
            //Regresamos nuestra celda ya formateada
            return CeldaPDF;
}

Ahora con este método solo basta con especificar lo siguiente:

table.AddCell(tp. celda ("Celda 1", 1, 1, 14, Element.ALIGN_CENTER, 0, BaseColor.BLACK, "White"));

Esto igual por cada celda a utilizar, y ya por último solo basta con agregar nuestra tabla a nuestro documento para que lo incruste y salga en nuestro impreso final:

doc.Add(table);

Es un proceso laborioso pero muy útil, ya que nos da control total sobre nuestro documento.

Eh estado un poco retirado por cuestiones laborales, espero les sea útil y ya saben si tiene duda con este información, no duden en comentarme.

Saludos cordiales.

No hay comentarios:

Publicar un comentario