Neste post, irei falar sobre os relatórios que são imprescindíveis em qualquer projeto, independente da complexibilidade.
Demonstrarei um exemplo que utiliza o excel como base, a grande vantagem neste caso é flexibilidade para o usuário que mais habituado com as ferramentas do office conseguirá adaptar, formatar e personalizar os dados extraídos conforme sua necessidade.
Vamos começar ?!
Criei uma página aspx (listagem 1).
No aspx: inclui uma label
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GerandoRelatorioExcel.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblMensagem" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
Listagem 1 - Código da página.
No aspx.cs (listagem 2)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
// namespace para StringBuilder
using System.Text;
namespace GerandoRelatorioExcel
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GerarExcel();
}
private void GerarExcel()
{
StringBuilder excel = new StringBuilder();
try
{
//Gera o cabeçalho do relatório
excel.Append(GerarCabecalho());
//Gera os registros do relatório
excel.Append(GeraRegistros());
//Se estiver definido como true, o ASP.NET processará toda a página e depois de concluído, mandará o output para o cliente
//Se estiver definido como false, o ASP.NET já irá enviando o output para o cliente na medida em que a página vai sendo processada
HttpContext.Current.Response.BufferOutput = false;
//Limpa o response
HttpContext.Current.Response.Clear();
//Nome dado para salvar o relatório. Por exemplo: relatório gerado dia 30/03/2009 vai ter o nome de: rel_participants_30/03/2009
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=rel_participants_" + DateTime.Now.ToString("d") + ".xls");
//Tipo de aplicação que será gerado o relatório. Aqui será p excel.
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Unicode;
//StringBuilder excel vai receber tudo que está no response
HttpContext.Current.Response.Write(excel.ToString());
//Envia imediatamente ao browser todo o conteúdo em buffer
HttpContext.Current.Response.Flush();
//Finaliza o response e é exibido até a linha onde se encontra o comando
HttpContext.Current.Response.End();
}
catch
{
//A label criada no aspx só serve para mostrar a mensagem de erro, caso ocorra problemas ao gerar o relatório
lblMensagem.Text = "Ocorreu um erro durante geração do relatório. Tente novamente.";
}
}
private string GeraRegistros()
{
StringBuilder registros = new StringBuilder();
/*Aqui inclui diretamente os valores que aparecerão no relatório.
Mas vcs criarão seus métodos para trazer os registros
*/
//Preenchimento dos campos que mostrarei no meu relatório
registros.Append(DateTime.Now.ToString("d") + "\t");
registros.Append("Fernanda Sallai" + "\t");
registros.Append("Fernanda Sallai" + Environment.NewLine);
return (registros.ToString());
}
///
/// Gerar cabeçalho
///
///
private string GerarCabecalho()
{
StringBuilder cabecalho = new StringBuilder();
cabecalho.Append("Data" + "\t");
cabecalho.Append("Nome" + "\t");
cabecalho.Append("Login" + Environment.NewLine);
return (cabecalho.ToString());
}
}
}
Listagem 2 - Código para gerar o relatório.
Realizados todos esses passos, ao acessar essa página irá ser exibida a caixa de diálogo e o relatório nas figuras 1 e 2:

Figura 1 - Opção de abrir ou salvar relatório.

Figura 2 - Relatório gerado.
Projeto disponível: GerandoRelatorioExcel.rar (20,57 kb)