terça-feira, 15 de fevereiro de 2011

C# - ItextSharp - Relatório com Quebras

Olá! Segue um fonte que tem por objetivo criar um relatório onde seja quebrado por empresa;
1º passo, crie uma select com tudo o que voce necessita, exemplo: nome da codigo, nome da empresa (que será usado para quebra), acompanhado de demais campos, exemplo, codigo do fornecedor, nome, valores etc..., este select traz tanto de uma empresa como de todas empresas de um grupo, por isso a chamada solicita um numero, caso for 0 traz todas.
neste nosso caso trata-se de um relatorio de contas por isso as descrições abaixo.
2º passo o relatório:

temos uma função q retorna a datatable com a select,
e esta abaixo que trata o relatório:


 public static bool RelRespDespDia(string Data, string caminhoPDF, int Empresa)
        {

            DataTable dt = new DataTable();
            bool _retorno;
            dt = clsConsulta.RetornaResumoDespDia(Convert.ToDateTime(Data),Empresa);
            if (dt != null)
            {
                // defino documento
                Document document = new Document(PageSize.A4.Rotate(), 10, 10, 10, 10);
                try
                {
                    // cria o arquivo
                    PdfWriter.GetInstance(document, new FileStream(caminhoPDF, FileMode.Create));
                    // we add some meta information to the document
                    document.AddAuthor("AFK");
                    document.AddSubject(".");
                    document.Open();
                    iTextSharp.text.Table TableCabec = new iTextSharp.text.Table(1);
                    TableCabec.WidthPercentage = 100;
                    TableCabec.Padding = 2;
                    //alinhamento dentro da celula
                    TableCabec.Spacing = 0;
                    TableCabec.DefaultCellBorderWidth = 0;
                    TableCabec.DefaultHorizontalAlignment = 1;
                    TableCabec.Border = iTextSharp.text.Rectangle.NO_BORDER;
                    TableCabec.Alignment = Element.ALIGN_CENTER;
                    TableCabec.BackgroundColor = new iTextSharp.text.Color(0xC0, 0xC0, 0xC0);
                    TableCabec.AddCell(new Phrase(@"Resumo Despesas Diária", FontFactory.GetFont(FontFactory.HELVETICA, 12, iTextSharp.text.Font.BOLD)));
                    TableCabec.AddCell(new Phrase("Data Base: " + Data + " Data Emissão:  " + DateTime.Now, FontFactory.GetFont(FontFactory.HELVETICA, 12, iTextSharp.text.Font.BOLD)));
                    TableCabec.EndHeaders();
                    document.Add(TableCabec);

//rodapé
                    HeaderFooter header = new HeaderFooter(new Phrase("Data Base: " + Data + " Data Emissão:  " + DateTime.Now + "  Pagina : "), true);
                    document.Footer = header;

                    //Cabeçalho empresa
                    iTextSharp.text.Table TableFor = new iTextSharp.text.Table(1);
                    float[] headerwidthsFor = { 100 };
                    TableFor.Widths = headerwidthsFor;
                    TableFor.AutoFillEmptyCells = true;
                    TableFor.WidthPercentage = 100;
                    TableFor.Spacing = 0;
                    TableFor.DefaultCellBorderWidth = 1;
                    TableFor.DefaultHorizontalAlignment = 1;
                    TableFor.Border = iTextSharp.text.Rectangle.NO_BORDER;
                    //TableFor.Alignment = Element.ALIGN_CENTER;
                    //TableFor.AddCell(new Phrase(@"Cod. For.", FontFactory.GetFont(FontFactory.HELVETICA, 10, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 0));
                    TableFor.Alignment = Element.ALIGN_LEFT;
                    TableFor.AddCell(new Phrase(@"Empresa", FontFactory.GetFont(FontFactory.HELVETICA, 10, iTextSharp.text.Font.BOLD)));

                    //Cabeçalho Itens.
                    iTextSharp.text.Table TableItens = new iTextSharp.text.Table(8, 1);
                    TableItens.AutoFillEmptyCells = true;
                    float[] headerwidths = { 6, 26, 4,  4, 8, 8, 10, 34 };
                    TableItens.Widths = headerwidths;
                    TableItens.WidthPercentage = 100;
                    TableItens.Spacing =1;
                    TableItens.DefaultCellBorderWidth = 1;
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_LEFT;
                    TableItens.AddCell(new Phrase(@"Cod. For.", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 0));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_LEFT;
                    TableItens.AddCell(new Phrase(@"Razão", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 1));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                    TableItens.AddCell(new Phrase(@"Doc.", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 2));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                    //TableItens.AddCell(new Phrase(@"Par.", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 3));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                    TableItens.AddCell(new Phrase(@"Tp Doc.", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 3));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                    TableItens.AddCell(new Phrase(@"Dt Emissão", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 4));
                    //TableItens.AddCell(new Phrase(@"Dt Venc.", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 6));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                    TableItens.AddCell(new Phrase(@"Vl Docum.", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 5));
                    //TableItens.AddCell(new Phrase(@"Gp.Despesas", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 6));
                    //TableItens.AddCell(new Phrase(@"Tp.Despesa", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 7));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                    TableItens.AddCell(new Phrase(@"Usuario", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 6));
                    TableItens.DefaultHorizontalAlignment = Element.ALIGN_LEFT;
                    TableItens.AddCell(new Phrase(@"Observação", FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD)), new System.Drawing.Point(0, 7));

                    //TableFor.InsertTable(TableItens, new System.Drawing.Point(1, 1));
//adiciona no documento
                    TableFor.EndHeaders();
                    TableItens.EndHeaders();
                    document.Add(TableFor);
                    document.Add(TableItens);
//limpa variavel que ira controlar a quebra
                    _nomeAnterior = string.Empty;

                    foreach (DataRow row in dt.Rows)
                    {
//trata a quebra por empresa criando uma nova tabela
                        if (_nomeAnterior != row["Nome_emp"].ToString())
                        {                        
                            iTextSharp.text.Table TableForr = new iTextSharp.text.Table(1);
                            float[] headerwidthsForr = { 100 };
                            TableForr.Widths = headerwidthsFor;
                            TableForr.AutoFillEmptyCells = true;
                            TableForr.WidthPercentage = 100;
                            TableForr.Spacing = 1;
                            TableForr.DefaultCellBorderWidth = 1;
                            TableForr.DefaultHorizontalAlignment = 1;
                            TableForr.Border = iTextSharp.text.Rectangle.NO_BORDER;
                            TableForr.Alignment = Element.ALIGN_CENTER;
                            _nomeAnterior = row["Nome_emp"].ToString();
                            TableForr.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                            TableForr.AddCell(new Phrase(row["ID_Emp"].ToString() + " - " + row["Nome_emp"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                            //TableForr.DefaultHorizontalAlignment = Element.ALIGN_LEFT;
                            //TableForr.AddCell(new Phrase(row["Nome_emp"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                            document.Add(TableForr);
                        }
//insere os itens abaixo da quebra
                        iTextSharp.text.Table TableItenss = new iTextSharp.text.Table(8, 1);
                        TableItens.AutoFillEmptyCells = true;
                        float[] headerwidthss = { 6, 26, 4, 4, 8, 8, 10, 34 };
                        TableItenss.Widths = headerwidthss;
                        TableItenss.WidthPercentage = 100;
                        TableItenss.Spacing = 1;
                        TableItenss.DefaultCellBorderWidth = 1;
                        TableItenss.DefaultHorizontalAlignment = 1;
                        TableItenss.Border = iTextSharp.text.Rectangle.NO_BORDER;
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_LEFT;
                        TableItenss.AddCell(new Phrase(row["ID_FOR"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_LEFT;
                        TableItenss.AddCell(new Phrase(row["NM_RAZAO_SOCIAL"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        TableItenss.AddCell(new Phrase(row["ID_NFE_NF_ENT_FOR"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        //TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        //TableItenss.AddCell(new Phrase(row["SEQ_PARCELA"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        TableItenss.AddCell(new Phrase(row["CD_DOCUMENTO_PAGTO_ORIGINAL"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        TableItenss.AddCell(new Phrase(Convert.ToDateTime(row["DT_EMISSAO"]).ToString("dd/MM/yyyy"), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        //TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        //TableItenss.AddCell(new Phrase(Convert.ToDateTime(row["DT_VENCIMENTO"]).ToString("dd/MM/yyyy"), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        TableItenss.AddCell(new Phrase(row["VL_DOCUMENTO"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        //TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        //TableItenss.AddCell(new Phrase(row["DS_GRUPO_DESPESA"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        //TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        //TableItenss.AddCell(new Phrase(row["DS_TIPO_DESPESA"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_CENTER;
                        TableItenss.AddCell(new Phrase(row["NM_USUARIO"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL)));
                        TableItenss.DefaultHorizontalAlignment = Element.ALIGN_LEFT;
                        TableItenss.AddCell(new Phrase(row["DS_DOCUMENTO"].ToString(), FontFactory.GetFont(FontFactory.HELVETICA, 6, iTextSharp.text.Font.NORMAL)));

                        document.Add(TableItenss);
                    }

                    document.Close();                  
                    _retorno = true;

                }
                catch (IOException ex)
                {
                    _retorno = false;
                }
                catch (Exception ex)
                {
                    _retorno = false;
                }
                finally
                {
                    document.Close();
                }
                return _retorno;
            }
            else
            {
                return false;
            }
        }

O retorno true ou false é para tratar a chamada no programa, no caso web:

        if(clsRelatoriosFinanceiro.RelRespDespDia(txtDtInicio.Text, Request.PhysicalApplicationPath + @"PDF\\RelResDespDia.pdf", int.Parse(cmbLoja.SelectedValue)))
            ScriptManager.RegisterStartupScript(base.Page, base.Page.GetType(), "Pdf", "window.open('../PDF/RelResDespDia.pdf');", true);

Qualquer opinião de melhoria é bem vinda, este caso relato a forma que encontrei para salvar uma situação a qual me deparei e após pesquisas em varios sites, espero ter ajudado.

Fernando Valota