ASP.NET MVC – Criando um Result para exportação em Excel de Coleções, Grids e Tables

Standard

Demonstrarei aqui uma forma bem simples para a exportação de Grids, Tables e Coleções para planilhas em Excel. Estarei utilizando uma aplicação ASP.NET MVC para tanto, e criarei um novo Result destinado ao Download do arquivo. Para a criação deste post, considerei alguns artigos já existentes na internet, juntamente com outros conteúdos e conceitos. Claro que, escrevo este, também por ser uma funcionalidade interessante e bem simples sua implementação.

Vamos iniciar considerando um conjunto simples de dados, com uma classe de Carro e um repositório básico que retorna uma Lista de carros, veja:

public class Carro
{
    public int codCarro { get; set; }
    public string marca { get; set; }
    public string modelo { get; set; }
}

public class RepositorioCarro
{
    public static List<Carro> SelecionaCarros()
    {
        return new List<Carro>()
        {
            new Carro(){codCarro = 1, marca = "VW", modelo = "Gol"},
            new Carro(){codCarro = 2, marca = "VW", modelo = "Golf"},
            new Carro(){codCarro = 3, marca = "Fiat", modelo = "Uno"},
            new Carro(){codCarro = 4, marca = "Ford", modelo = "Focus"},
            new Carro(){codCarro = 5, marca = "JAC", modelo = "J3"}
        };
    }
}

Em seguida criamos nossa Action que lista os carros:

public ActionResult Lista()
{
    List<Carro> carros = RepositorioCarro.SelecionaCarros();

    GridView gv = new GridView();
    gv.DataSource = carros;
    gv.DataBind();
    Session["Grid"] = gv;

    return View(carros);
}

NOTA: Observe que estamos utilizando um GridView para o armazenamento temporário de nossa lista, e mantendo-o em uma session, isso pois, posteriormente vamos utilizar a função RenderControl para a renderização e download do Excel.

Agora criaremos uma ActionResult para download:

public ActionResult Download(string nomeArquivo)
{
    if (Session["Grid"] != null)
        return new DownloadResult((GridView)Session["Grid"], nomeArquivo);
    else
        return RedirectToAction("Lista");
}

NOTA: Observe que verificamos se na session existe algum valor, e retornamos a Result DownloadResult, passando o GridView e o nome do arquivo a ser realizado o Download.

Vamos então criar o DownloadResult.

public class DownloadResult : ActionResult
{
    public GridView excelGridView { get; set; }
    public string nomeArquivo { get; set; }

    public DownloadResult(GridView gv, string nomearquivo)
    {
        excelGridView = gv;
        nomeArquivo = nomearquivo;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        //Criar um fluxo para gravar o arquivo do Excel
        HttpContext curContext = HttpContext.Current;
        curContext.Response.Clear();
        curContext.Response.AddHeader("content-disposition", "attachment;filename=" + nomeArquivo);
        curContext.Response.Charset = "";
        curContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        curContext.Response.ContentType = "application/vnd.ms-excel";

        //Renderiza o GridView
        StringWriter sw = new StringWriter();
        HtmlTextWriter htw = new HtmlTextWriter(sw);
        excelGridView.RenderControl(htw);

        byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString());
        MemoryStream s = new MemoryStream(byteArray);
        StreamReader sr = new StreamReader(s, Encoding.ASCII);

        curContext.Response.Write(sr.ReadToEnd());
        curContext.Response.End();
    }
}

Em seguida basta adicionarmos o link em nossa View:

@Html.ActionLink(“Exportar Lista”, “Download”, new { nomeArquivo = “Grid.xls” })

Pronto, uma exportação para excel bem simples e fácil de implementar. 🙂

 

3 thoughts on “ASP.NET MVC – Criando um Result para exportação em Excel de Coleções, Grids e Tables

Leave a Reply

Your email address will not be published. Required fields are marked *