EXPORTAR EXCEL 2013 DEMORA
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.
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.
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
http://www.c-sharpcorner.com/Blogs/13058/export-data-from-datareader-to-excel-in-VB-Net.aspx
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.
Por exemplo:
Em WindowsForm não existe [Ô].Close()[Ô]
O [Ô].ContentType[Ô] é apenas leitura;
Não existe [Ô].Write()[Ô]
enfim... Ainda não consegui adaptar para WindowsForm.
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.
WriteErrorLog, você pode simplesmente ignorar se não quiser gravar erro.
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
#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
Pessoal,
Parece que o problema era uma função que eu coloquei em determinadas células do Excel.
A função era:
Quando eu tirei esta função das células, o relatório voltou ao fluxo normal.
Obrigado a todos.
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