none
StreamWriter em Memória RRS feed

  • Pergunta

  • Pessoal estou usando o seguinte código abaixo para transformar os dados de um repeater em um arquivo excel, até aqui esta funcionando perfeitamente bem, só tem um detalhe que gostaria de saber se tem alguma forma de fazer, por exemplo, com StreamWrite nós geramos um arquivo, existe alguma forma de gerar este arquivo em memória e não fisicamente no servidor. Explico o porque, o cliente verifica  em uma página o relatório e resolve exportar para o excel, então ele clica em exportar e salva o arquivo na máquina, utilizando o response.Content, consigo fazer com que peça para que o arquivo seja salvo, porém o arquivo fica fisicamente no servidor e isto que eu não queria, gostaria que o cliente fizesse o download e após excluisse da memória? Entenderam rsrsrs. Se alguém souber se existe como realizar tal procedimento e poder ajudar eu agradeço.

    Segue o código até o momento:

                    int registros = dt_clientes.Rows.Count;
                    rptStatus.DataSource = dt_clientes;
                    rptStatus.DataBind();
                    
                    string caminho = Server.MapPath("/Web/Relatorios");
                    string nome_arquivo = @"\clientes_" + DateTime.Now.ToString("ddMMyyyyhhmm") + ".xls";
                    using (StreamWriter sw = new StreamWriter(new FileStream(caminho + nome_arquivo,FileMode.Create),System.Text.Encoding.UTF8))
                    {
                        using(HtmlTextWriter hw = new HtmlTextWriter(sw))
                        {
                            hw.Write("<b>Data: " + DateTime.Now.ToString("dd/MM/yyyy hh:mm") + "</b><br />" );
                            hw.Write("<b>Numero de Clientes na listagem: " + registros.ToString() + "</b><br />");
                            
                            hw.WriteBreak();
                            rptStatus.RenderControl(hw);
                        }
                    }



    Obrigado

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    sexta-feira, 17 de julho de 2009 14:07

Respostas

  • Só para registar, já consegui fazer o que estava querendo, gero o excel sem criar um arquivo fisico, pegando um repeater renderizado.

                    // Pegando DataTable completo para contagem dos clientes e gerar repeter completo
                    int registros = dt_clientes.Rows.Count;
                    rptStatus.DataSource = dt_clientes;
                    rptStatus.DataBind();
                    
                    // Criando arquivo excel com informações do repeater
                    string nome_arquivo = "clientes_" + DateTime.Now.ToString("ddMMyyyyhhmm") + ".xls";
                    using ( MemoryStream ms = new MemoryStream())
                    {
                        using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
                        {
                            using(HtmlTextWriter hw = new HtmlTextWriter(sw))
                            {
                                hw.Write("<b>Data: " + DateTime.Now.ToString("dd/MM/yyyy hh:mm") + "</b><br />" );
                                hw.Write("<b>Numero de Clientes na listagem: " + registros.ToString() + "</b><br />");
                                hw.WriteBreak();
                                rptStatus.RenderControl(hw);
                            }
                        }
                        byte[] byteArray = ms.ToArray();
    
                        Response.Clear();
                        Response.ClearContent();
                        Response.ClearHeaders();
                        Response.HeaderEncoding = Encoding.UTF8;
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + nome_arquivo);
                        Response.AddHeader("Content-Length", byteArray.Length.ToString());
                        Response.ContentType = "application/octet-stream";
                        Response.BinaryWrite(byteArray);
                        Response.Flush();
                        Response.End();
                    }




    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    • Marcado como Resposta Harley Araujo terça-feira, 21 de julho de 2009 17:05
    sexta-feira, 17 de julho de 2009 17:25