18/09/2008 Development / asp.net

Essa semana uma nova tarefa foi designada a nossa equipe aqui na empresa. O objetivo era permitir o download de um arquivo no formato xls "Excel" sendo que nele deveria conter os registros de um grid populado em Tempo Real.

Desafio: Capturar os dados, jogar para uma página e fazer o download.

As Idéias: Inúmeras soluções foram tentadas, criamos um iframe, jogamos os dados para o iframe, depois submetemos o form do iframe, afim do coding-behind fazer o download do arquivo. Essa ideia era boa, mas tinha um inconveniente, que o Internet Explorer abre uma aba abaixo da toolbar alertando se o usuário quer realmente fazer o download, acontece, que nosso sistema tem um evento "onbeforeonload" que abre uma janela de fim de sessão, ou seja, quando o usuário clicasse em fazer o download, a tela se atualizaria e a janela de fim de sessão abriria.

Solução: Capturar os dados, envia-los via AJAX para uma página utilizando metodo POST, essa pagina quarda os dados numa Session, apos o onreadstate, abrir uma janela popup com o download do arquivo.

Segue os Script abaixo.

function handleResponse() {
        var strDados = document.getElementById('uwtCotacoes_div0').innerHTML;
        var strUrl = "testeFrame.aspx";
        var strParam = "acao=gravar&dados=" + escape(strDados);

        $.ajax({
                contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
                type: "POST",
                url: strUrl,
                data: strParam,
                error: function() {
                        alert('Erro no documento');
                },
                success: function(data) {
                        window.open('testeFrame.aspx?acao=salvar', 'novajanela');
                }
        });
}

Aqui o código da pagina testeFrame.aspx coloque isso no evento PageLoad

Dim acao = Request("acao")

If acao.ToString = "gravar" Then
     Session("FormCotacao") = Server.HtmlDecode(Request.Form("dados"))
Else
     Response.ClearContent()
     Response.Charset = String.Empty
     Response.Write(Session("FormCotacao"))
     HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"
     HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=documento.xls")
     HttpContext.Current.Response.Charset = "utf-8"
     Response.End()
End If