C# - Gerando um Documento Excel a partir de um DataTable


Vejamos o seguinte cenário clássico :

Você precisa gerar documentos no formato Excel a partir das tabelas do seu banco de dados.

É uma tarefa elementar e eu já tratei deste assunto em diversos artigos mas como saber não ocupa espaço vamos a mais uma maneira de resolver o problema.

Neste artigo eu mostro como gerar documentos Excel a partir de um DataTable de um banco de dados Excel usando a linguagem C#.

Eu poderia criar uma aplicação Windows Forms ou WPF mas vou criar uma aplicação Web usando o Visual Web Developer(VWD) 2008 Express.

Abra o VWD 2008 Express e no menu File selecione New Web Site e selecione o template ASP .NET Web Site informando o nome ExportaDados e selecionando a linguagem C#;

A seguir selecione o arquivo Default.aspx e no modo Design inclua uma tabela com 6 linhas e 2 colunas e defina o leiaute da figura abaixo no web form;

Neste formulário o usuário informa o local do banco de dados , no servidor, o nome do banco de dados e o comando SQL que será executado para gerar o DataTable.

    protected void btnGeraDocumento_Click(object sender, EventArgs e)
    {
        //Conteúdo do Response
        Response.AddHeader("content-disposition", "attachment; filename=DocumentoExcel.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.xls";

        //Objetos
        StringWriter stringWrite = new System.IO.StringWriter();
        HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

        //Inclui controles 
        DataGrid dgDados = new DataGrid();
        this.form1.Controls.Add( dgDados);

        //Definição de cores
        //dgRecord.HeaderStyle.BackColor = System.Drawing.Color.Yellow;
         dgDados.DataSource = pegaTabela();
         dgDados.DataBind();

        //definição das cores das células
        //foreach (DataGridItem dgi in dgRecord.Items)
        //   foreach (TableCell tcGridCells in dgi.Cells)
        //      tcGridCells.Attributes.Add("class", "sborder");

        //Renderiza o DataGrid
         dgDados.RenderControl(htmlWrite);

        //Inluir a classe de estilo
        //Response.Write(@"<style> .sborder { color : Red;border : 1px Solid Balck; } </style> ");
        //Exporta 
        Response.Write(stringWrite.ToString());
        //encerra
        Response.End();
    }

A rotina pegaTabela acessa o banco de dados usando o provedor OLEDB e obtém os dados da tabela retornando um DataTable;

   protected DataTable pegaTabela()
      {
          string conString = @"Provider=Microsoft.JET.OLEDB.4.0;data source=" + txtLocalBD.Text + txtNomeBD.Text;
           
         // cria e abre uma conexão
         OleDbConnection conn = new OleDbConnection(conString);
         conn.Open();
    
         DataTable dt = new DataTable();
        // cria um adapter e preenche o datatable
         OleDbDataAdapter adapter = new OleDbDataAdapter(txtComandoSQL.Text, conn);
         adapter.Fill(dt);
          // fecha a conexão
         conn.Close();

         return dt;
      }

Se você desejar criar o seu próprio DataTable e preencher com dados pode usar a rotina abaixo:

  protected DataTable criaTabela()
    {
        //Cria um datatable temporario para vincular valores
        DataTable dtTemp = new DataTable(); 
        DataRow dr;
        //cria o schema 
        dtTemp.Columns.Add("Codigo"); dtTemp.Columns.Add("Nome");
        //Imclui dados
        dr = dtTemp.NewRow(); dr["Codigo"] = "1"; dr["Nome"] = "Macoratti"; dtTemp.Rows.Add(dr);
        dr = dtTemp.NewRow(); dr["Codigo"] = "2"; dr["Nome"] = "Miriam"; dtTemp.Rows.Add(dr);
        dr = dtTemp.NewRow(); dr["Codigo"] = "3"; dr["Nome"] = "Jessica"; dtTemp.Rows.Add(dr);
        dr = dtTemp.NewRow(); dr["Codigo"] = "4"; dr["Nome"] = "Jefferson"; dtTemp.Rows.Add(dr);
        dr = dtTemp.NewRow(); dr["Codigo"] = "5"; dr["Nome"] = "Janice"; dtTemp.Rows.Add(dr);
        //retorna o datatable
        return dtTemp;
    }

Executando o projeto , ao clicar no botão para gerar o documento veremos a janela de diálogo para abrir o documento ou salvar.

Abrindo o documento no OpenOffice (eu criei o projeto em uma máquina que não tinha o Excel) veremos a tabela exibida conforme abaixo:

Pegue o projeto completo aqui: ExportaDados.zip

Aguarde mais artigos sobre C#.

Eu sei é apenas C# mas eu gosto...

Referências:


José Carlos Macoratti