Inquiridor
Excel não fecha

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:08Moderador
-
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