C# - Exportando os dados de uma tabela para o formato Excel (xls)


Exportar os dados de uma tabela para o formato Excel pode ser uma tarefa complicada para quem nunca fez isso antes.

Neste artigo eu mostro que usando C# esta tarefa é relativamente simples mesmo para os iniciantes.

Recursos que iremos usar:

Nosso objetivo será acessar os dados da tabela Products do banco de dados Northwind e gerar um arquivo .xls para em seguida abrir este arquivo no Excel ou um editor compatível como o Open Office.

Eu vou deixar no projeto o código para acessar tanto o Microsoft Access como o SQL Server Express 2005 Express Edition.

Abra o Visual C#  e selecione a opção Create Project e a seguir selecione o template Visual C# -> Windows Forms Application e informe o nome exportaDB;

A seguir no formulário principal inclua os seguintes componentes a partir da ToolBox:

Defina os controles conforme o leiaute abaixo;

Defina os seguintes namespaces no projeto:

using System.IO;
using
System.Data.OleDb;
using
System.Data.SqlClient;

A seguir vejamos o código do evento Click do botão - Gerar arquivos para o Excel :

void BtnExportarClick(object sender, EventArgs e)

{

       string caminho = txtNomeArquivoXLS.Text;
 

     if(cboSGBD.SelectedIndex == 0)

    {

       // criar um arquivo para escrever

         using (StreamWriter sw = File.CreateText(caminho))

       {

            //Monta a string de conexão para MS Access com os dados do formulário

           String conn = @"provider=Microsoft.Jet.OLEDB.4.0;data source = c:\dados\ " + txtBD.Text + ".mdb";

           OleDbConnection cn = new OleDbConnection(conn);

        OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + txtTabela.Text, cn);

          try

        {

            cn.Open();

               OleDbDataReader dr = cmd.ExecuteReader();

               // percorre o datareader e escreve os dados no arquivo .xls definido

               while (dr.Read())

           {

               sw.WriteLine(dr["ProductName"].ToString() + "\t" + dr["UnitPrice"].ToString());

           }

              //exibe mensagem ao usuario

              MessageBox.Show("Arquivo " + caminho + " gerado com sucesso.");

          }

            catch (Exception excpt)

         {

               MessageBox.Show(excpt.Message);

          }

      }

  }

   else

 {

   // criar um arquivo para escrever

   using (StreamWriter sw = File.CreateText(caminho))

  {

      //Server=myServerName\theInstanceName;Database=myDataBase;Trusted_Connection=True;

      //Monta a string de conexão para SQL Server com os dados do formulário

      string conn = @"Server = " + txtServidor.Text;

     conn = conn + "; Database = " + txtBD.Text;

     conn = conn + "; Trusted_Connection=True";

        SqlConnection cn = new SqlConnection(conn);

        //define a instrução SQL para executar contra o banco de dados

       string sql = " Select * from " + txtTabela.Text;

       SqlCommand cmd = new SqlCommand(sql, cn);

    try

   {

         //abre a conexão e gera o datareader

       cn.Open();

         SqlDataReader dr = cmd.ExecuteReader();

         // percorre o datareader e escreve os dados no arquivo .xls definido

         while (dr.Read())

       {

                sw.WriteLine(dr["ProductName"].ToString() + "\t" + dr["UnitsInStock"].ToString() + "\t" + dr["UnitPrice"].ToString());

        }

          //exibe mensagem ao usuario

          MessageBox.Show("Arquivo " + caminho + " gerado com sucesso.");

    }

     catch (Exception excpt)

    {

      MessageBox.Show(excpt.Message);

   }

  }

}

}

O código usado para gerar o arquivo XLS usando o MS Access ou o SQL Server são praticamente iguais, a única mudança é a string de conexão e a utilização dos provedores para cada um dos banco de dados:

O serviço é realmente feito usando o recurso do namespace System.IO, a classe StreamWriter: : using (StreamWriter sw = File.CreateText(caminho))

O C# usa a classe Stream para ler e escrever em arquivos. A classe StreamWriter implementa um TextWriter para a escrita de caracteres em um fluxo de bytes(stream) usando uma determinada codificação.
 

para criar o arquivo e o método Writeline para escrever no arquivo : sw.WriteLine(dr["ProductName"].ToString() + "\t" + dr["UnitPrice"].ToString());

Para controlarmos a seleção do controle Combobox - cboSGBD - usamos o seguinte código:

1- Para definir a seleção inicial do combobox como sendo a primeira opção:

void MainFormLoad(object sender, EventArgs e)
{
     cboSGBD.SelectedIndex = 0 ;
}

2- Para verificar se houve alteração na seleção da combobox usando o evento SelectedIndexChanged:

void ComboBox1SelectedIndexChanged(object sender, EventArgs e)
{
     if (cboSGBD.SelectedItem.Equals("SQL Server Express" ))
              pnlSGBD.Visible=
true;
else
          pnlSGBD.Visible=
false;
}

Para abrir o arquivo XLS gerado incluímos o seguinte código no evento Click do botão - Abrir arquivo XLS gerado:

private void btnAbrirXLS_Click_1(object sender, EventArgs e)

{

string arqExcel = txtNomeArquivoXLS.Text;

 

if (arqExcel != "")

{

   try

   {

          System.Diagnostics.Process proc = new System.Diagnostics.Process();

          proc.EnableRaisingEvents = true;

          proc.StartInfo.FileName = arqExcel;

          proc.Start();

   }

    catch (DirectoryNotFoundException)

   {

    MessageBox.Show("Diretório não encontrado !");

   }

    catch (FileNotFoundException)

   {

    MessageBox.Show("Arquivo não encontrado !");

   }

    catch (System.IO.IOException)

   {

     MessageBox.Show("Arquivo não esta disponível. Pode estar em uso.");

   }

    catch (Exception ex)

   {

       MessageBox.Show("Houve um problema ao abrir o arquivo :" + ex.Message.ToString());

   }

}

else

{

    MessageBox.Show("Informe a localização do arquivo Excel.");

}

}

Executando o projeto iremos obter:

Abrindo o arquivo XLS teremos:

Como você viu não é tão complicado como parece gerar arquivos no formato Excel. Existem outras formas de fazer isso na plataforma .NET. Uma dica rápida para abrir um arquivo XLS e exibir em um datagridview seria incluir mais um controle Button - btnAbrirExcel,  e um controle DataGRidView - gdvExcel, e no seu evento Click do Button incluir o seguinte código:

private void btnAbrirExcel_Click_1(object sender, EventArgs e)

{
 

OpenFileDialog arqExcel = new OpenFileDialog();

arqExcel.InitialDirectory = "c:\\dados";

arqExcel.Filter = "*.xls | *.* Microsoft Excel";

arqExcel.Title = "Selecione o Arquivo";

if (arqExcel.ShowDialog() == DialogResult.OK)

{

  DataSet ds = new DataSet();

  OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +                  arqExcel.FileName + ";Extended Properties=Excel 8.0;");

 

   OleDbDataAdapter da = new OleDbDataAdapter("Select * From [Plan1$]", conexao);

   da.Fill(ds);

   gdvExcel.DataSource = ds.Tables[0];

   gdvExcel.AutoSizeColumnsMode =    System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader;

   conexao.Close();

 }

}

Será aberto uma caixa de diálogo Abrir arquivo já apontando para o caminho c:\dados e apos selecionar o arquivo XLS o mesmo será exibido no DataGridView- gdvExcel;

Aguarde novos artigos sobre o assunto...

Pegue o projeto completo aqui : exportaDB.zip

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

Referências:


José Carlos Macoratti