I have created a method to export some columns to xls and the process is very slow, it takes almost one minute to do the whole process.
public void Download(string datainicio, string datafinal, int? searchContrato, string searchCliente, string tipo, string status)
{
DateTime dt1 = Convert.ToDateTime(datainicio);
DateTime dt2 = Convert.ToDateTime(datafinal);
var tbl_caminhos = db.tbl_caminho_backup.AsNoTracking().Where(x => x.ativo == true && x.tbl_cliente_verusbackuponline.ativo == true).ToList();
var tbl_logs = db.vw_logs_backuponline.AsNoTracking().Where(x => DbFunctions.TruncateTime(x.data_inicio) >= DbFunctions.TruncateTime(dt1) && DbFunctions.TruncateTime(x.data_inicio) <= DbFunctions.TruncateTime(dt2)).ToList();
//List<vw_logs_backuponline> tbl_logs = null;
if (!String.IsNullOrEmpty(tipo))
{
tbl_caminhos = tbl_caminhos.Where(x => x.tipo == tipo).ToList();
tbl_logs = tbl_logs.Where(s => s.log_tipo == tipo).ToList();
}
if (!String.IsNullOrEmpty(searchCliente))
{
tbl_caminhos = tbl_caminhos.Where(x => x.tbl_cliente_verusbackuponline.nome_razao.ToLower().Contains(searchCliente.ToLower())).ToList();
tbl_logs = tbl_logs.Where(s => s.nome_razao.ToLower().Contains(searchCliente.ToLower())).ToList();
}
if (searchContrato != null)
{
tbl_caminhos = tbl_caminhos.Where(x => x.tbl_cliente_verusbackuponline.contrato == searchContrato).ToList();
tbl_logs = tbl_logs.Where(s => s.contrato == searchContrato).ToList();
}
if (!String.IsNullOrEmpty(status) && status == "0")
{
tbl_caminhos = tbl_caminhos.Where(x => !tbl_logs.Select(l => l.id_caminho_backup).Contains(x.id_caminho_backup)).ToList();
tbl_logs = tbl_logs.Where(s => s.data_fim != null).ToList();
}
if (!String.IsNullOrEmpty(status) && status == "1")
{
tbl_caminhos = null;
tbl_logs = tbl_logs.Where(s => s.data_fim != null).ToList();
}
if (tbl_caminhos != null)
{
for (DateTime dtRef = dt1; dtRef <= dt2; dtRef = dtRef.AddDays(1))
{
//aqui pego todos os caminhos cadastrados para os clientes
foreach (var caminhos in tbl_caminhos)
{
//verifico se existe um log para o caminho, se tiver eu sei que foi realizado o backup
if (tbl_logs.Where(x => x.id_caminho_backup == caminhos.id_caminho_backup && (x.data_inicio >= dtRef && x.data_inicio <= dtRef)).Count() <= 0)
{
//se entrou aqui é pq não existe um log para o caminho, então crio uma linha de falha do backup
vw_logs_backuponline log = new vw_logs_backuponline();
log.contrato = caminhos.tbl_cliente_verusbackuponline.contrato;
log.nome_razao = caminhos.tbl_cliente_verusbackuponline.nome_razao;
log.cidade = caminhos.tbl_cliente_verusbackuponline.cidade;
log.log_tipo = caminhos.tipo;
log.data_inicio = dtRef;
log.hora_inicio = caminhos.tbl_cliente_verusbackuponline.hora_backup;
log.bucket = caminhos.tbl_cliente_verusbackuponline.bucket;
log.hora_backup = caminhos.tbl_cliente_verusbackuponline.hora_backup;
log.msg_operacao = "<span class='glyphicon glyphicon-alert' aria-hidden='true'></span>";
log.caminho_ativo = true;
tbl_logs.Add(log);
}
}
}
//aqui removo os com sucesso quando a busca é apenas os com falhas
if (!String.IsNullOrEmpty(status) && status == "0")
{
tbl_logs.RemoveAll(x => x.data_fim != null);
}
}
var logs = tbl_logs.Select(x => new LogsBackup() { Contrato = x.contrato, Modalidade = x.log_tipo, Cidade = x.cidade, UF = x.uf, Nome_Razao = x.nome_razao, Dias_Backup = (x.data_inicio - x.data_fim).ToString().FirstOrDefault().ToString() }).AsQueryable().ToList();
try
{
GridView gridView = new GridView();
gridView.DataSource = logs;
gridView.DataBind();
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=" + datafinal + "VerusBackup.xls");
Response.ContentType = "application/vnd.ms-excel";
Response.Charset = "";
using (StringWriter stringWriter = new StringWriter())
{
using (HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter))
{
gridView.RenderControl(htmlTextWriter);
Response.Output.Write(stringWriter.ToString());
Response.Flush();
Response.End();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
Script in View:
$("#btnExportar").click(function (e) {
var datainicio = $('#datainicio').val();
var datafinal = $('#datafinal').val();
var searchContrato = $('#searchContrato').val();
var tipo = $('#tipo').val();
var status = $('#status').val();
$.ajax({
type: 'GET',
url: "@Url.Action("Download", "logsbackuponline")",
data: { datainicio: datainicio, datafinal: datafinal, searchContrato: searchContrato, tipo: tipo, status: status },
async: true,
success: function (Result) {
window.location = '/logsbackuponline/Download?datainicio=' + datainicio + '&datafinal=' + datafinal + '&searchContrato=' + searchContrato + '&tipo=' + tipo + '&status=' + status;
}
})
});