EXPORTAR EXCEL 2013 DEMORA

PEGUDO 11/02/2014 09:44:27
#434536
Todos os relatórios de todos os nossos programas são exportados para o Excel, via código, e ao passar do Office 2010, aqui na empresa, para o Office 2013, todos os relatórios dos programas ficaram lentos demais.
Um relatório, de 5000 linhas, que demorava, no máximo, 3 minutos, agora demora mais de duas horas para ser gerado.
Alguém sabe explicar?
Enquanto isso, continuarei pesquisando na Internet sobre o assunto.
KERPLUNK 11/02/2014 12:06:54
#434542
Excel 2013 é muito parecido com XML/HTML, essa rotina eu já usei e funciona muito bem:
http://www.c-sharpcorner.com/Blogs/13058/export-data-from-datareader-to-excel-in-VB-Net.aspx
PEGUDO 11/02/2014 12:41:20
#434544
Parece que este exemplo se aplica somente a Asp.net, estou tentando, incansavelmente, adaptar este exemplo a WindowsForm mas o HttpResponse parece ser diferente do Asp.
Por exemplo:
Em WindowsForm não existe [Ô].Close()[Ô]
O [Ô].ContentType[Ô] é apenas leitura;
Não existe [Ô].Write()[Ô]

enfim... Ainda não consegui adaptar para WindowsForm.
KERPLUNK 11/02/2014 13:26:20
#434545
Response, [Ô]escreve[Ô] uma string na saída do renderizador. No seu caso, seria algo como File.WriteAllText([Ô]c:\\pasta\\arquivo.xlsx[Ô],conteudo);

WriteErrorLog, você pode simplesmente ignorar se não quiser gravar erro.
LUIS.HERRERA 11/02/2014 14:50:42
#434552
Olha uso essa rotina para exportar dados de uma datagrid sem nenhum problema e funciona para qualquer versão do Excel, muito rápido.

#region Export to Excel
/// <summary>
/// Recebe um DataGridView como parâmetro e Exporta para o Excel.
/// Inclui cabeçalho das colunas, só colunas visíveis e com formatação.
/// </summary>
/// <param name=[Ô]datagridview[Ô]>Nome do grid no form</param>
public static void Export2Excel(DataGridView datagridview)
{
object objApp_Late;
object objBook_Late;
object objBooks_Late;
object objSheets_Late;
object objSheet_Late;
object objRange_Late;
object[] Parameters;

int i = 0;
int nColunasGrid = 0;

try
{
// Get the class type and instantiate Excel.
Type objClassType;
objClassType = Type.GetTypeFromProgID([Ô]Excel.Application[Ô]);
objApp_Late = Activator.CreateInstance(objClassType);
//Get the workbooks collection.
objBooks_Late = objApp_Late.GetType().InvokeMember([Ô]Workbooks[Ô], BindingFlags.GetProperty, null, objApp_Late, null);
//Add a new workbook.
objBook_Late = objBooks_Late.GetType().InvokeMember([Ô]Add[Ô], BindingFlags.InvokeMethod, null, objBooks_Late, null);
//Get the worksheets collection.
objSheets_Late = objBook_Late.GetType().InvokeMember([Ô]Worksheets[Ô], BindingFlags.GetProperty, null, objBook_Late, null);
//Get the first worksheet.
Parameters = new Object[1];
Parameters[0] = 1;
objSheet_Late = objSheets_Late.GetType().InvokeMember([Ô]Item[Ô], BindingFlags.GetProperty, null, objSheets_Late, Parameters);

//-- Cria o cabeçalho das colunas com base no grid
var asc = 65; //--> aqui defino o início da variável que receberá o código ASC para letras do nome das colunas (A, B, etc...)
foreach (DataGridViewColumn col in datagridview.Columns)
{
if (col.Visible)
{
//--> pega o range que contém a cell.
Parameters = new Object[2];
Parameters[0] = Convert.ToString((char)asc) + [Ô]1[Ô];
Parameters[1] = Missing.Value;
objRange_Late = objSheet_Late.GetType().InvokeMember([Ô]Range[Ô], BindingFlags.GetProperty, null, objSheet_Late, Parameters);
//--> Escreve o Headers na cell.
Parameters = new Object[1];
Parameters[0] = col.Name;
objRange_Late.GetType().InvokeMember([Ô]Value[Ô], BindingFlags.SetProperty, null, objRange_Late, Parameters);
asc++;
nColunasGrid++; //--> incrementa numero de colunas exportados ao excel
}
}

asc = 65;
//--> Inclui os dados do grid na planilha a partir da linha 2
foreach (DataGridViewColumn col in datagridview.Columns)
{
if (col.Visible)
{
for (i = 0; i < datagridview.RowCount; i++)
{
//--> pega o range da cell.
Parameters = new Object[2];
Parameters[0] = Convert.ToString((char)asc) + (2 + i);
Parameters[1] = Missing.Value;
//--> Escreve no excel
objRange_Late = objSheet_Late.GetType().InvokeMember([Ô]Range[Ô], BindingFlags.GetProperty, null, objSheet_Late, Parameters);
Parameters = new Object[1];
switch (col.Name)
{
case [Ô]INATIVO[Ô]:
Parameters[0] = (Convert.ToBoolean(datagridview.Rows[i].Cells[col.Index].Value) ? [Ô]sim[Ô] : [Ô][Ô]);
break;
case [Ô]MATRIZ[Ô]:
Parameters[0] = (Convert.ToBoolean(datagridview.Rows[i].Cells[col.Index].Value) ? [Ô]sim[Ô] : [Ô][Ô]);
break;
case [Ô]MinistradoNaEmpresa[Ô]:
Parameters[0] = (Convert.ToBoolean(datagridview.Rows[i].Cells[col.Index].Value) ? [Ô]sim[Ô] : [Ô][Ô]);
break;
default:
Parameters[0] = datagridview.Rows[i].Cells[col.Index].Value.ToString();
break;
}
//if (col.Name == [Ô]INATIVO[Ô])
//{
// Parameters[0] = (Convert.ToBoolean(datagridview.Rows[i].Cells[col.Index].Value) ? [Ô]sim[Ô] : [Ô][Ô]);
//}
//else
//{
// Parameters[0] = datagridview.Rows[i].Cells[col.Index].Value.ToString();
//}
objRange_Late.GetType().InvokeMember([Ô]Value[Ô], BindingFlags.SetProperty, null, objRange_Late, Parameters);
}
asc++;
}
}

//~~> Assign UsedRange
objRange_Late = objSheet_Late.GetType().InvokeMember([Ô]UsedRange[Ô], BindingFlags.GetProperty, null, objSheet_Late, null);

//~~> Get the Columns
object cols = objRange_Late.GetType().InvokeMember([Ô]EntireColumn[Ô], BindingFlags.GetProperty, null, objRange_Late, null);

//~~> ajusta largura das colunas ao tamanho do texto nas células
cols.GetType().InvokeMember([Ô]AutoFit[Ô], BindingFlags.InvokeMethod, null, cols, null);

//--> Coloca as colunas exportadas com cabeçalho em negrito
Parameters = new Object[2];
Parameters[0] = [Ô]A1[Ô]; // início do range
Parameters[1] = Convert.ToString((char)(65 + nColunasGrid - 1)) + 1; // final do range = Letra + 1
//pega referência da fonte nas células criadas
objRange_Late = objSheet_Late.GetType().InvokeMember([Ô]Range[Ô], BindingFlags.GetProperty, null, objSheet_Late, Parameters);
object cellFont = objRange_Late.GetType().InvokeMember([Ô]Font[Ô], BindingFlags.GetProperty, null, objRange_Late, null);

//--> igual a criar objeto parametro e atribuir o valor true.
cellFont.GetType().InvokeMember([Ô]Bold[Ô], BindingFlags.SetProperty, null, cellFont, new object[] { true });

//--> mudar cor do fundo da célula do cabeçalho
object Interior = objRange_Late.GetType().InvokeMember([Ô]Interior[Ô], BindingFlags.GetProperty, null, objRange_Late, null);
objRange_Late.GetType().InvokeMember([Ô]Color[Ô], BindingFlags.SetProperty, null, Interior, new object[] { Color.LightSteelBlue.ToArgb() });

//__. define a espessura da borda para linha do cabeçalho
object Borders = objRange_Late.GetType().InvokeMember([Ô]Borders[Ô], BindingFlags.GetProperty, null, objRange_Late, null);
Borders = objRange_Late.GetType().InvokeMember([Ô]LineStyle[Ô], BindingFlags.SetProperty, null, Borders, new object[] { 1 });

//--> Passa o controle da planilha ao usuário.
Parameters = new Object[1];
Parameters[0] = true;
objApp_Late.GetType().InvokeMember([Ô]Visible[Ô], BindingFlags.SetProperty, null, objApp_Late, Parameters);
objApp_Late.GetType().InvokeMember([Ô]UserControl[Ô], BindingFlags.SetProperty, null, objApp_Late, Parameters);

//--> exemplo se quiser definir o tamanho da coluna
//Parameters = new Object[1];
//Parameters[0] = 26;
//objRange_Late.GetType().InvokeMember([Ô]ColumnWidth[Ô], BindingFlags.SetProperty, null, objRange_Late, Parameters);

//--> tamanho da fonte
//Parameters[0] = 12;
//objRange_Late.GetType().InvokeMember([Ô]Font.Size[Ô], BindingFlags.SetProperty, null, objRange_Late, Parameters);

//objRange_Late.GetType().InvokeMember([Ô]Name[Ô], BindingFlags.SetProperty, null, Font, new object[] { [Ô]Verdana[Ô] });

//objRange_Late.GetType().InvokeMember([Ô]Size[Ô], BindingFlags.SetProperty, null, Font, new object[] { [Ô]12[Ô] });

//objRange_Late.GetType().InvokeMember([Ô]MergeCells[Ô], BindingFlags.SetProperty, null, objRange_Late, new object[] { true });

}
catch (Exception theException)
{
String errorMessage;
errorMessage = [Ô]Error: [Ô];
errorMessage = String.Concat(errorMessage, theException.Message);
errorMessage = String.Concat(errorMessage, [Ô] Line: [Ô]);
errorMessage = String.Concat(errorMessage, theException.Source);

MessageBox.Show(errorMessage, [Ô]Error[Ô]);
}
}
#endregion
PEGUDO 18/02/2014 10:05:53
#434948
Pessoal,
Parece que o problema era uma função que eu coloquei em determinadas células do Excel.
A função era:
=SE($B7 = [Ô][Ô]; [Ô][Ô]; 0) [ô]Se qualquer célula da coluna B não estiver vazia, então escreva zero.

Quando eu tirei esta função das células, o relatório voltou ao fluxo normal.
Obrigado a todos.
Tópico encerrado , respostas não são mais permitidas