locked
Excel não fecha RRS feed

  • Pergunta

  • Estou desenvolvendo uma solução que insere dados de uma consulta ao banco SQL Server em uma planilah Excel. Inicialmete estava usando conexão ODBC para acessar os dados do banco mas esta solução não estava funcionando no servidor de desenvolvimento por algum motivo que ainda não descobri. Portanto, resolvi implementar de outra maneira. Agora, estou usando ADO.NET para fazer a consulta e inserir na planilha e está funcionando tanto na minha máquina quanto no servidor de desenvolvimento, a não ser pelo fato de o Excel não fechar. Na solução anterior ele fechava. No modo debug do VS vi que a instrução Quit() é executada mas o Excel permanece aberto. Procurando no Google, encontrei uma página da Microsoft que explica algo parecido. Ao que tudo indica há algo no código abaixo que mantém uma referência com o Excel e por isso ele não é fechado.


    // Insere os dados da consulta do banco na planilha
            private void InsertData(ref Excel.Worksheet DataSheet, string connection, string select)
            {
                // Aquisição dos dados em um DataTable
                SqlDataAdapter mda;
                System.Data.DataTable mdt;
                SqlConnection cnn;
                SqlCommand cmd;
                DataRow dr;
                Excel.Range rngUC;
                Excel.Range rngData;
                Excel.Range rng;

                try
                {
                    cnn = new SqlConnection(connection);
                    cmd = new SqlCommand(select, cnn);
                    mda = new SqlDataAdapter(cmd);
                    mdt = new DataTable();
                    mda.Fill(mdt);
                }
                catch (Exception ex)
                {
                    Quit();
                    throw new ArgumentException("Erro ao buscar os dados.\n" + ex.ToString());
                }

                // Inserção dos nomes das colunas da tabela do DataSet
                try
                {
                    rngUC = (Excel.Range)DataSheet.Cells[2, 1];
                    rngUC.CurrentRegion.Clear();

                    int i = 0;
                   
                    foreach (DataColumn col in mdt.Columns)
                    {
                        i++;
                        rng = (Excel.Range)DataSheet.Cells[1, i];
                        rng.Value2 = col.ColumnName;
                        rng.Font.Bold = true;
                    }
                }
                catch(Exception ex)
                {
                    Quit();
                    throw new ArgumentException("Erro ao criar colunas na planilha.\n" + ex.ToString());
                }

                // Inserção das linhas da tabela do DataTable
                int j = 0;
                int k = 0;

                try
                {
                    if (mdt != null)
                    {
                        for (j = 0; j <= mdt.Rows.Count - 1; j++)
                        {
                            dr = mdt.Rows[j];
                            for (k = 0; k <= mdt.Columns.Count - 1; k++)
                                rngUC.get_Offset(j, k).Value2 = dr[k].ToString();
                        }
                    }
                    rngData = rngUC.CurrentRegion;
                }
                catch (Exception ex)
                {
                    Quit();
                    throw new ArgumentException("Erro ao inserir dados na planilha.\n" +  ex.ToString());
                }
               
                // Formatação das colunas
                rngData.Columns.AutoFit();
            }

    Ao final da execução de todo o processo uso o seguinte método para fechar o Excel:

     public void Quit()
            {
                thisApplication.Workbooks.Close();
                thisWorkbook = null;
                thisApplication.Quit();
                thisApplication = null;
            }

    Alguém tem alguma idéia do que pode estar acontecendo?
    quarta-feira, 24 de janeiro de 2007 21:46

Todas as Respostas

  • Experimentou forçar o Garbage Collector?
    sexta-feira, 26 de janeiro de 2007 23:08
    Moderador
  • Vi essa solução em outro fórum. Mas não funcionou.

    sábado, 27 de janeiro de 2007 23:58
  • Por favor, como vc fez pra resolver esse problema?

     

    Estou precisando urgente fazer isso.

     

    Grata

    Fabiana

    quinta-feira, 12 de julho de 2007 17:25